Nginx是一个轻量、高性能的服务器,平时除了可以作为反向代理服务器外,我们还可以将其作为一个静态资源服务器:
定义好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则可以减少网络延迟。