本文概述
在本节中, 我们将讨论如何配置Nginx Plus和Nginx开源来提供静态内容。
根目录和索引文件
root指令用于定义将用于搜索文件的根目录。为了获得请求文件的路径, NGINX将请求的URI附加到root指令定义的路径上。伪指令可以放在服务器{}, http {}或位置{}上下文中的任何级别上。
让我们看一个例子;在此, 为虚拟服务器指定了根指令。它适用于未添加root指令以显式重新定义root的所有位置{}块:
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ \.(mp3|mp4) {
root /www/media;
}
}
在上面的示例中, NGINX在文件系统的/ www / data / images /目录中搜索以/ images /开头的URI(统一资源标识符)。但是, 如果URI以.mp3或.mp4扩展名结尾, 则NGINX会在/ www / media /目录中查找文件, 因为它是在匹配的位置块中指定的。
如果请求后缀带有斜杠, NGINX会将其视为对目录的请求, 并尝试在目录中查找索引文件。 index指令指定索引文件的名称(默认值为index.html)。继续该示例, 如果请求URI为/ images / some / path /, 则NGINX会提供文件/www/data/images/some/path/index.html(如果存在)。如果没有, 则默认情况下, NGINX返回HTTP代码404(未找到)。要将NGINX配置为返回自动生成的目录列表, 请在auto index指令中添加” on”参数:
location /images/ {
autoindex on;
}
我们可以在index指令中列出多个文件名。 NGINX按照指定的顺序查找文件, 并返回找到的第一个文件。
location / {
index index.$geo.html index.htm index.html;
}
此处使用的$ geo变量是通过geo指令设置的自定义变量。变量的值取决于客户端的IP地址。
为了返回索引文件, NGINX会检查该文件是否存在, 然后对通过将索引文件的名称附加到基本URI所获得的URI进行内部重定向。内部重定向的结果是对位置的全新搜索, 并且可以最终在另一个位置中显示, 如以下示例所示:
location / {
root /data;
index index.html index.php;
}
location ~ \.php {
fastcgi_pass localhost:8000;
#...
}
在上面的示例中, 如果请求中的URI为/ path /, 并且/data/path/index.html不存在, 但/data/path/index.php存在, 则对/path/index.php的内部重定向为映射到第二个位置。结果, 该请求被代理。
尝试几种选择
try_files指令可用于检查定义的文件或目录是否存在; NGINX会进行内部重定向, 否则会返回指定的状态码。例如, 要检查文件是否存在或与请求URI不对应, 请使用try_files指令和$ uri变量, 如下所示:
server {
root /www/data;
location /images/ {
try_files $uri /images/default.gif;
}
}
该文件以URI的形式定义, 该URI使用在当前位置或虚拟服务器的上下文中设置的root或alias指令进行处理。在这种情况下, 如果不存在与原始URI对应的文件, 则NGINX将内部重定向到最后一个参数指定的URI, 并返回/www/data/images/default.gif。
最后一个参数也可以是状态代码, 该状态代码后接等号或位置名称。在下面的示例中, 如果try_files指令的任何参数都没有解析为现有文件或目录, 则返回404错误。
location / {
try_files $uri $uri/ $uri.html =404;
}
优化性能以提供内容
加载速度是提供任何内容的关键因素。对我们的NGINX配置进行小的优化可能会提高生产率并有助于达到最佳性能。
启用发送文件
默认情况下, NGINX控制文件本身的传输, 并在发送文件之前将文件复制到缓冲区中。当我们启用sendfile指令时, 它将消除将数据复制到缓冲区的步骤, 并允许将数据从一个文件描述符直接复制到另一个文件描述符。另外, 要阻止快速连接完全占用工作进程, 我们可以使用sendfile_max_chunk指令将单个sendfile()调用中传输的数据量限制为1 MB(在此示例中为1 MB):
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
#...
}
启用tcp_nopush
将tcp_nopush指令与该指令中的sendfile一起添加。这使得NGINX在从sendfile()获得数据块之后立即在一个数据包中发送HTTP响应头。
location /mp3 {
sendfile on;
tcp_nopush on;
#...
}