Nginx作为静态资源服务器
引用原文:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/#optimizing-performance-for-serving-content
Nginx是一个轻量、高性能的服务器,平时除了可以作为反向代理服务器外,我们还可以将其作为一个静态资源服务器:
- 与mkdocs一起使用,可以变成个人博客
- 可以发布静态资源,比如文件、图片等供他人下载;部署在家里可以实现跨设备访问呢
资源目录(root)
定义好root
资源目录,该目录作为Nginx搜索文件的根目录,比如访问资源 example.zip
,Nginx会在root
目录下搜索该文件。
定义root
目录的方式如下:
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ .(mp3|mp4) {
root /www/media;
}
}
root
指令用来定义资源目录,它可以配置在http{}
、server{}
和location{}
配置上下文中。如上所示,定义了服务器默认的搜索目录为/www/data
,当访问/images/
目录时,Nginx会在/www/data/images/
目录下搜索文件。但是如果访问的文件后缀是mp3
或mp4
,则会在/www/media/
目录下搜索文件。因为location
指令的root
指令会覆盖server
的root
指令(可参阅文章《Nginx心法》。
默认情况下,如果访问一个/
结尾(目录)的资源,Nginx会去查找文件index.html
,比如访问/images/
,Nginx会去查找/www/data/images/index.html
文件。一般我们可能会有一堆资源,比如在/www/data/images/
目录中可能存在成百上千的图片,这时候可以让Nginx自动生成index.html
并返回给客户端(不会落盘):
location /images/ {
autoindex on;
}
autoindex on
指令将打开自动生成index.html
功能,当访问/images/
时,Nginx会自动生成一个index.html
文件,列出/www/data/images/
目录下的所有文件。如果遇到目录,它也会支持递归访问。
除了index.html
作为默认的索引文件外,我们还可以自定义索引文件:
location / {
index index.$geo.html index.htm index.html;
}
它将按顺序查找索引文件,如果找到则返回,否则返回404
。
Nginx在搜索文件时,如果文件不存在,它还会尝试内部重定向到其他的location
(如果通过index
组装起来的资源路径能够命中其他的location
的话),比如:
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
指令可以检查指定的文件或目录是否存在,如果不存在则触发内部重定向,或者返回错误码。
server {
root /www/data;
location /images/ {
try_files $uri /images/default.gif;
}
}
如上所示,如果访问/images/
目录下的文件不存在,Nginx会行部重定向到最后一个参数的/images/default.gif
文件。
也可以用=code
的方式来返回错误码,而不是内部重定向:
location / {
try_files $uri $uri/ $uri.html =404;
}
如上所示,如果访问的文件不存在,Nginx会尝试查找uri/目录,如果还是不存在,会尝试查找uri.html文件,如果还是不存在,返回404错误码。
内部重定向也支持命名location
:
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://backend.example.com;
}
如上所示,如果访问的文件不存在,Nginx会尝试查找$uri/
目录,如果还是不存在,会尝试查找@backend
命名的location
,然后交给proxy_pass
处理。
优化性能
打开sendfile
、tcp_nopush
location /mp3 {
sendfile on;
tcp_nopush on;
#...
}
对于发送文件来说,sendfile
可以提高性能并减低cpu的消耗,tcp_nopush
则可以减少网络延迟。