首页 运维 nginx Nginx静态文件服务如何配置及优化

Nginx静态文件服务如何配置及优化

May 13, 2023 am 09:04 AM
nginx

根目录和索引文件

root 指令指定将用于搜索文件的根目录。 为了获取所请求文件的路径,nginx 将请求 uri 附加到 root 指令指定的路径。该指令可以放在 http {} , server {} 或 location {} 上下文中的任何级别。在下面的示例中,为虚拟服务器定义了 root 指令。 它适用于未包含根指令的所有 location {} 块,以显式重新定义根:

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 参数:

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 的文件不存在,nginx 会将内部重定向到最后一个参数指定的 uri,并返回 /www/data/images/default.gif 。

最后一个参数也可以是状态代码(直接以等号开头)或位置名称。 在以下示例中,如果 try_files 指令的所有参数都不会解析为现有文件或目录,则会返回 404 错误。

location / {
  try_files $uri $uri/ $uri.html =404;
}
登录后复制

在下一个示例中,如果原始 uri 和带有附加尾部斜杠的 uri 都不会解析为现有文件或目录,则会将请求重定向到指定位置,并将其传递给代理服务器。

location / {
  try_files $uri $uri/ @backend;
}

location @backend {
  proxy_pass http://backend.example.com;
}
登录后复制

优化服务内容的性能

加载速度是提供任何内容的关键因素。 对 nginx 配置进行微小优化可以提高生产力并帮助实现最佳性能。

启用 sendfile

默认情况下,nginx 会自行处理文件传输,并在发送之前将文件复制到缓冲区中。 启用 sendfile 指令消除了将数据复制到缓冲区的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。或者,为了防止一个快速连接完全占用工作进程,可以使用 sendfile_max_chunk 指令限制单个 sendfile() 调用中传输的数据量(在本例中为1 mb):

location /mp3 {
  sendfile      on;
  sendfile_max_chunk 1m;
  #...

}
登录后复制

启用 tcp_nopush

将 tcp_nopush 指令与 sendfile on; 指令一起使用。这使得 nginx 可以在 sendfile() 获取数据块之后立即在一个数据包中发送 http 响应头。

location /mp3 {
  sendfile  on;
  tcp_nopush on;
  #...

}
登录后复制

启用 tcp_nodelay

tcp_nodelay 指令允许覆盖 nagle 的算法 ,该算法最初设计用于解决慢速网络中小数据包的问题。该算法将许多小数据包合并为一个较大的数据包,并以 200 毫秒的延迟发送数据包。如今,在提供大型静态文件时,无论数据包大小如何,都可以立即发送数据。延迟也会影响在线应用程序(ssh,在线游戏,在线交易等)。默认情况下, tcp_nodelay 指令设置为 on,这意味着禁用了 nagle的算法。此指令仅用于 keepalive 连接:

location /mp3 {
  tcp_nodelay    on;
  keepalive_timeout 65;
  #...
  
}
登录后复制

优化积压队列

其中一个重要因素是 nginx 可以多快地处理传入连接。一般规则是在建立连接时,将其放入侦听套接字的 "listen" (监听)队列中。在正常负载下,队列很小或根本没有队列。但是在高负载下,队列会急剧增长,导致性能不均匀,连接中断,延迟增加。

显示积压队列使用命令 netstat -lan 来显示当前监听队列。输出可能如下所示,它显示在端口 80上的监听队列中,有 10 个未接受的连接,这些连接针对配置的最多 128 个排队连接。这种情况很正常。

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 接受的最大连接数。

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 指令以匹配修改:

server {
  listen 80 backlog=4096;
  # ...

}
登录后复制

以上是Nginx静态文件服务如何配置及优化的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
nginx在windows中怎么配置 nginx在windows中怎么配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安装 Nginx 并创建虚拟主机配置。修改主配置文件并包含虚拟主机配置。启动或重新加载 Nginx。测试配置并查看网站。选择性启用 SSL 并配置 SSL 证书。选择性设置防火墙允许 80 和 443 端口流量。

docker怎么启动容器 docker怎么启动容器 Apr 15, 2025 pm 12:27 PM

Docker 容器启动步骤:拉取容器镜像:运行 "docker pull [镜像名称]"。创建容器:使用 "docker create [选项] [镜像名称] [命令和参数]"。启动容器:执行 "docker start [容器名称或 ID]"。检查容器状态:通过 "docker ps" 验证容器是否正在运行。

docker容器名称怎么查 docker容器名称怎么查 Apr 15, 2025 pm 12:21 PM

可以通过以下步骤查询 Docker 容器名称:列出所有容器(docker ps)。筛选容器列表(使用 grep 命令)。获取容器名称(位于 "NAMES" 列中)。

怎么查看nginx是否启动 怎么查看nginx是否启动 Apr 14, 2025 pm 01:03 PM

确认 Nginx 是否启动的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 检查端口 80 是否开放;3. 查看系统日志中 Nginx 启动消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

docker怎么创建容器 docker怎么创建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中创建容器: 1. 拉取镜像: docker pull [镜像名] 2. 创建容器: docker run [选项] [镜像名] [命令] 3. 启动容器: docker start [容器名]

nginx怎么查版本 nginx怎么查版本 Apr 14, 2025 am 11:57 AM

可以查询 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打开 Nginx 错误页,查看页面的标题。

nginx怎么配置云服务器域名 nginx怎么配置云服务器域名 Apr 14, 2025 pm 12:18 PM

在云服务器上配置 Nginx 域名的方法:创建 A 记录,指向云服务器的公共 IP 地址。在 Nginx 配置文件中添加虚拟主机块,指定侦听端口、域名和网站根目录。重启 Nginx 以应用更改。访问域名测试配置。其他注意事项:安装 SSL 证书启用 HTTPS、确保防火墙允许 80 端口流量、等待 DNS 解析生效。

nginx服务器挂了怎么办 nginx服务器挂了怎么办 Apr 14, 2025 am 11:42 AM

当 Nginx 服务器宕机时,可执行以下故障排除步骤:检查 nginx 进程是否正在运行。查看错误日志以获取错误消息。检查 nginx 配置语法正确性。确保 nginx 具有访问文件所需的权限。检查文件描述符打开限制。确认 nginx 正在侦听正确的端口。添加防火墙规则以允许nginx流量。检查反向代理设置,包括后端服务器可用性。如需进一步帮助,请联系技术支持。

See all articles