Nginx作为静态资源服务器

2024-08-23 20:06:48 浏览数 (1)

Nginx作为静态资源服务器

引用原文:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/#optimizing-performance-for-serving-content

Nginx是一个轻量、高性能的服务器,平时除了可以作为反向代理服务器外,我们还可以将其作为一个静态资源服务器:

  1. 与mkdocs一起使用,可以变成个人博客
  2. 可以发布静态资源,比如文件、图片等供他人下载;部署在家里可以实现跨设备访问呢

资源目录(root)

定义好root资源目录,该目录作为Nginx搜索文件的根目录,比如访问资源 example.zip,Nginx会在root目录下搜索该文件。

定义root目录的方式如下:

代码语言:javascript复制
server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ .(mp3|mp4) {
        root /www/media;
    }
}

root指令用来定义资源目录,它可以配置在http{}server{}location{}配置上下文中。如上所示,定义了服务器默认的搜索目录为/www/data,当访问/images/目录时,Nginx会在/www/data/images/目录下搜索文件。但是如果访问的文件后缀是mp3mp4,则会在/www/media/目录下搜索文件。因为location指令的root指令会覆盖serverroot指令(可参阅文章《Nginx心法》。

默认情况下,如果访问一个/结尾(目录)的资源,Nginx会去查找文件index.html,比如访问/images/,Nginx会去查找/www/data/images/index.html文件。一般我们可能会有一堆资源,比如在/www/data/images/目录中可能存在成百上千的图片,这时候可以让Nginx自动生成index.html并返回给客户端(不会落盘):

代码语言:javascript复制
location /images/ {
    autoindex on;
}
  • autoindex on指令将打开自动生成index.html功能,当访问/images/时,Nginx会自动生成一个index.html文件,列出/www/data/images/目录下的所有文件。如果遇到目录,它也会支持递归访问。

除了index.html作为默认的索引文件外,我们还可以自定义索引文件:

代码语言:javascript复制
location / {
    index index.$geo.html index.htm index.html;
}

它将按顺序查找索引文件,如果找到则返回,否则返回404

Nginx在搜索文件时,如果文件不存在,它还会尝试内部重定向到其他的location(如果通过index组装起来的资源路径能够命中其他的location的话),比如:

代码语言:javascript复制
location / {
    root /data;
    index index.html index.php;
}

location ~ .php {
    fastcgi_pass localhost:8000;
    #...
}

如果访问/path/,且/data/path/index.html不存在,但/data/path/index.php存在对应的location,Nginx会尝试内部重定向到location ~ .php,然后交给fastcgi处理。

尝试多种选择

try_files指令可以检查指定的文件或目录是否存在,如果不存在则触发内部重定向,或者返回错误码。

代码语言:javascript复制
server {
    root /www/data;

    location /images/ {
        try_files $uri /images/default.gif;
    }
}

如上所示,如果访问/images/目录下的文件不存在,Nginx会行部重定向到最后一个参数的/images/default.gif文件。

也可以用=code的方式来返回错误码,而不是内部重定向:

代码语言:javascript复制
location / {
    try_files $uri $uri/ $uri.html =404;
}

如上所示,如果访问的文件不存在,Nginx会尝试查找uri/目录,如果还是不存在,会尝试查找uri.html文件,如果还是不存在,返回404错误码。

内部重定向也支持命名location

代码语言:javascript复制
location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

如上所示,如果访问的文件不存在,Nginx会尝试查找$uri/目录,如果还是不存在,会尝试查找@backend命名的location,然后交给proxy_pass处理。

优化性能

打开sendfiletcp_nopush

代码语言:javascript复制
location /mp3 {
    sendfile            on;
    tcp_nopush          on;
    #...
}

对于发送文件来说,sendfile可以提高性能并减低cpu的消耗,tcp_nopush则可以减少网络延迟。

0 人点赞