程序员架构学习笔记——Nginx 静态文件服务配置及优化
根目录和索引文件
root指令指定将用于搜索文件的根目录。 为了获取所请求文件的路径,NGINX 将请求 URI 附加到
root指令指定的路径。该指令可以放在
http {},
server {}或
location {}上下文中的任何级别。在下面的示例中,为虚拟服务器定义了
root指令。 它适用于未包含根指令的所有
location {}块,以显式重新定义根:
[code]server { root /www/data; location / { } location /images/ { } location ~ \.(mp3|mp4) { root /www/media; } }
在这里,NGINX 针对
/images/开头的 URI 将在文件系统的
/www/ data/images/目录中搜索相应文件。 如果 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 以返回自动生成的目录列表,请在
autoindex指令中包含 on 参数:
[code]location /images/ { autoindex on; }
你可以在
index指令中列出多个文件名。 NGINX按指定的顺序搜索文件并返回它找到的第一个文件。
[code]location / { index index.$geo.html index.htm index.html; }
这里使用的
$geo变量是通过
geo指令设置的自定义变量。变量的值取决于客户端的 IP 地址。
要返回索引文件,NGINX 会检查它是否存在,然后对通过将索引文件的名称附加到基础 URI 上获得的新 URI 进行内部重定向。内部重定向导致对位置的新搜索,并且可能最终位于另一个位置,如以下示例所示:
[code]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变量,如下所示:
[code]server { root /www/data; location /images/ { try_files $uri /images/default.gif; } }
该文件以 URI 的形式指定,使用在当前位置或虚拟服务器的上下文中设置的根或别名指令进行处理。在这种情况下,如果对应于原始 URI 的文件不存在,NGINX 会将内部重定向到最后一个参数指定的 URI,并返回
/www/data/images/default.gif。
最后一个参数也可以是状态代码(直接以等号开头)或位置名称。 在以下示例中,如果
try_files指令的所有参数都不会解析为现有文件或目录,则会返回 404 错误。
[code]location / { try_files $uri $uri/ $uri.html =404; }
在下一个示例中,如果原始 URI 和带有附加尾部斜杠的 URI 都不会解析为现有文件或目录,则会将请求重定向到指定位置,并将其传递给代理服务器。
[code]location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://backend.example.com; }
有关更多信息,请观看内容缓存网络研讨会,了解如何显着提高网站性能,并深入了解 NGINX 的缓存功能。
优化服务内容的性能
加载速度是提供任何内容的关键因素。 对 NGINX 配置进行微小优化可以提高生产力并帮助实现最佳性能。
启用
sendfile
默认情况下,NGINX 会自行处理文件传输,并在发送之前将文件复制到缓冲区中。 启用
sendfile指令消除了将数据复制到缓冲区的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了防止一个快速连接完全占用工作进程,可以使用
sendfile_max_chunk指令限制单个
sendfile()调用中传输的数据量(在本例中为1 MB):
[code]location /mp3 { sendfile on; sendfile_max_chunk 1m; #... }
启用
tcp_nopush
将
tcp_nopush指令与
sendfile on;指令一起使用。这使得 NGINX 可以在
sendfile()获取数据块之后立即在一个数据包中发送 HTTP 响应头。
[code]location /mp3 { sendfile on; tcp_nopush on; #... }
启用
tcp_nodelay
tcp_nodelay指令允许覆盖 Nginx 的算法,该算法最初设计用于解决慢速网络中小数据包的问题。该算法将许多小数据包合并为一个较大的数据包,并以 200 毫秒的延迟发送数据包。如今,在提供大型静态文件时,无论数据包大小如何,都可以立即发送数据。延迟也会影响在线应用程序(ssh,在线游戏,在线交易等)。默认情况下,
tcp_nodelay指令设置为 on,这意味着禁用了 Nagle的算法。此指令仅用于 keepalive 连接:
[code]location /mp3 { tcp_nodelay on; keepalive_timeout 65; #... }
优化积压队列
其中一个重要因素是 NGINX 可以多快地处理传入连接。一般规则是在建立连接时,将其放入侦听套接字的 "listen" (监听)队列中。在正常负载下,队列很小或根本没有队列。但是在高负载下,队列会急剧增长,导致性能不均匀,连接中断,延迟增加。
显示积压队列
使用命令
netstat -Lan来显示当前监听队列。输出可能如下所示,它显示在端口 80上的监听队列中,有 10 个未接受的连接,这些连接针对配置的最多 128 个排队连接。这种情况很正常。
[code]Current listen queue sizes (qlen/incqlen/maxqlen) Listen Local Address 0/0/128 *.12345 10/0/128 *.80 0/0/128 *.8080
相反,在以下命令中,未接受的连接数(192)超过了 128 的限制。当网站流量很大时,这种情况很常见。要获得最佳性能,需要在操作系统和 NGINX 配置中增加可以排队等待 NGINX 接受的最大连接数。
[code]Current listen queue sizes (qlen/incqlen/maxqlen) Listen Local Address 0/0/128 *.12345 192/0/128 *.80 0/0/128 *.8080
调整操作系统
将
net.core.somaxconn内核参数的值从其默认值(128)增加到足以容纳大量流量的值。在这个例子中,它增加到 4096。
- FreeBSD 的命令为
sudo sysctl kern.ipc.somaxconn=4096
- Linux 的命令为 1.
sudo sysctl -w net.core.somaxconn=4096
2. 将net.core.somaxconn = 4096
加入到/etc/sysctl.conf
文件中。
调整 NGINX
如果将
somaxconn内核参数设置为大于 512 的值,请将
backlog参数增加在 NGINX
listen指令以匹配修改:
[code]server { listen 80 backlog=4096; # ... }
- LNMP架构应用实战——Nginx服务配置文件介绍
- nginx学习笔记4 nginx的配置文件2 虚拟主机的配置
- nginx 源码学习笔记(十三)——文件读写和配置文件读取
- JDBC基础学习笔记_05_jdbc的程序优化_单立Connection并编写调用配置文件
- nginx学习笔记5 nginx日志文件的配置
- nginx 学习笔记(6) nginx配置文件中的度量单位
- java学习笔记7 - Spring mvc 统一异常处理和静态文件的配置
- Django学习笔记五:通过nginx+uwsgi部署Django项目(暂时静态文件没有部署上去)
- Nginx学习历程_5_Nginx对于静态文件的缓存配置
- Nginx服务学习(5)-配置文件讲解
- 【saltstack学习笔记之十】使用sls安装nginx并管理nginx的配置文件
- MyBatis学习笔记(三)——优化MyBatis配置文件中的配置
- Nginx学习笔记——配置文件结构
- nginx 学习笔记(6) nginx配置文件中的度量单位
- 【Nginx】Nginx学习笔记03_nginx配置动静态资源分离
- [dotnetCore2.0]学习笔记之二: ASP.NET Core中,如何灵活使用静态文件和加载自定义配置
- nginx 源码学习笔记——文件读写和配置文件读取
- NGINX配置文件学习笔记
- Nginx配置静态文件服务
- 使用Nginx搭建静态文件服务及配置PHP运行环境