Nginx 性能优化有这篇就够了!
Nginx 作为高性能的 Web 服务器和反向代理服务器,被广泛应用于各种规模的互联网项目中。为了充分发挥 Nginx 的性能优势,进行合理的配置优化至关重要。本文将详细介绍 10 个实用的 Nginx 性能优化技巧,助你打造高效稳定的 Web 服务。
1. Nginx 工作进程数量配置
最佳实践:将 Nginx 的工作进程数设置为 CPU 核心数或核心数的两倍。
如何查看 CPU 核心数:
- 使用
top
命令后按1
键查看。 - 或者查看
/proc/cpuinfo
文件:grep ^processor /proc/cpuinfo | wc -l
配置示例:
[root@lx~]# vi /usr/local/nginx1.10/conf/nginx.conf
worker_processes 4;
[root@lx~]# /usr/local/nginx1.10/sbin/nginx -s reload
[root@lx~]# ps -aux | grep nginx | grep -v grep
root 9834 0.0 0.0 47556 1948 ? Ss 22:36 0:00 nginx: master process nginx
www 10135 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
www 10136 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
www 10137 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
www 10138 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
2. Nginx CPU 亲和力配置
合理配置 CPU 亲和力,可以提高 Nginx 的处理效率,避免多个进程在同一 CPU 上竞争资源。
4 核配置示例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
8 核配置示例:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
注意:
worker_processes
最多开启 8 个进程,超过后性能提升不明显且稳定性下降。
3. Nginx 最大打开文件数
配置指令:
worker_rlimit_nofile 65535;
该指令设置每个 Nginx 进程最大可打开的文件描述符数。建议与系统的 ulimit -n
值保持一致。
系统配置:
编辑 /etc/security/limits.conf
:
* soft nofile 65535
* hard nofile 65535
注意:修改后需要用户重新登录才能生效。
4. Nginx 事件处理模型
推荐配置:
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
说明:
use epoll
:采用高效的epoll
事件模型,适用于 Linux。worker_connections
:单个 worker 进程允许的最大连接数,设置为 65535 足够应对高并发。multi_accept
:on
:一个连接只能被一个 worker 唤醒,适合高吞吐量场景。off
:多个 worker 并行处理连接,适合连接数较少时降低负载。
5. 开启高效传输模式
配置示例:
http {
include mime.types;
default_type application/octet-stream;
...
sendfile on;
tcp_nopush on;
...
}
配置说明:
sendfile on
:开启高效文件传输模式,减少用户态与内核态的切换。tcp_nopush on
:与sendfile
配合使用,减少网络报文段数量,提升传输效率。
6. 连接超时时间配置
配置示例:
http {
keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
}
配置项说明:
keepalive_timeout
:保持客户端连接的超时时间,超过后断开连接。tcp_nodelay
:防止网络阻塞,需与keepalive_timeout
配合使用。client_header_buffer_size
:设置请求头缓冲区大小,通常设置为系统分页大小(如 4k)。open_file_cache
系列指令:优化文件缓存,减少磁盘 I/O。client_header_timeout
和client_body_timeout
:请求头和请求体的超时时间,防止资源被长时间占用。reset_timedout_connection
:自动关闭无响应的客户端连接,释放资源。send_timeout
:响应客户端的超时时间,确保连接活跃。server_tokens off
:隐藏 Nginx 版本信息,增强安全性。client_max_body_size
:限制上传文件的大小,防止过大文件占用资源。
7. FastCGI 调优
配置示例:
http {
...
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;
server {
...
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache cache_fastcgi;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_key "$host$request_uri";
...
}
}
}
配置项说明:
fastcgi_connect_timeout
、fastcgi_send_timeout
、fastcgi_read_timeout
:设置与 FastCGI 后端的连接和读取超时时间。fastcgi_buffer_size
和fastcgi_buffers
:配置 FastCGI 响应的缓冲区大小和数量,优化内存使用。fastcgi_busy_buffers_size
和fastcgi_temp_file_write_size
:配置繁忙状态下的缓冲区和临时文件写入大小,防止 502 错误。fastcgi_temp_path
:设置 FastCGI 缓存的临时文件路径。fastcgi_intercept_errors on
:拦截 FastCGI 错误,并使用 Nginx 的error_page
处理。fastcgi_cache_path
:定义 FastCGI 缓存路径和参数,减少与 PHP 和数据库的通信次数,提高性能。
总结:
proxy_cache
:缓存后端服务器的内容,适用于静态和动态内容。fastcgi_cache
:专门缓存 FastCGI 生成的内容,如 PHP 页面,减轻后端压力。
8. Gzip 压缩优化
配置示例:
http {
...
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_proxied any;
...
}
配置项说明:
gzip on
:开启 Gzip 压缩功能,节省带宽,提高传输速度。gzip_min_length 2k
:设置启用压缩的最小文件大小,避免小文件压缩后体积变大。gzip_buffers 4 32k
:配置压缩缓冲区大小,优化内存使用。gzip_http_version 1.1
:设置支持的 HTTP 版本,确保大多数浏览器兼容。gzip_comp_level 6
:设置压缩级别,平衡压缩率和 CPU 消耗。gzip_types
:指定需要压缩的 MIME 类型,避免压缩图片、视频等不适合压缩的类型。gzip_vary on
:支持Vary: Accept-Encoding
头,优化 CDN 和缓存服务器的处理。gzip_proxied any
:对所有通过代理的请求启用 Gzip 压缩。
9. Expires 缓存优化
配置示例:
server {
...
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
access_log off;
}
...
}
配置项说明:
expires
:设置静态资源的缓存时间,减少重复请求,节省带宽。- 图片类资源(如
.jpg
,.png
等)设置较长的缓存时间(如 30 天)。 - 脚本和样式表(如
.js
,.css
)设置中等的缓存时间(如 7 天)。
- 图片类资源(如
access_log off
:关闭访问日志记录,减少 I/O 开销。
优缺点:
- 优点:
- 降低带宽消耗,节省成本。
- 提升用户访问体验,减少加载时间。
- 减轻服务器压力,提高性能。
- 缺点:
- 缓存内容更新后,用户可能仍然看到旧内容。
- 解决办法:
- 缩短缓存时间。
- 对更新频繁的资源使用版本号或哈希值进行命名,确保用户获取最新资源。
不建议缓存的内容:
- 动态统计工具。
- 更新频繁的文件(如网站 logo)。
10. 内核参数优化
优化步骤:
编辑 /etc/sysctl.conf
文件,添加或修改以下内核参数:
fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
参数说明:
fs.file-max
:设置系统最大打开文件数,影响并发连接数。net.ipv4.tcp_max_tw_buckets
:允许的 TIME_WAIT 套接字最大数量,防止连接耗尽。net.ipv4.ip_local_port_range
:允许使用的本地端口范围,增加可用端口数。net.ipv4.tcp_tw_recycle
和net.ipv4.tcp_tw_reuse
:快速回收和重用 TIME_WAIT 套接字,减少资源占用。net.core.somaxconn
:增加监听队列长度,防止连接被拒绝。net.core.netdev_max_backlog
:增加网络设备接收队列长度,提升高并发处理能力。net.ipv4.tcp_rmem
和net.ipv4.tcp_wmem
:调整 TCP 接收和发送缓冲区大小,优化网络性能。net.ipv4.tcp_keepalive_time
:缩短 TCP keepalive 间隔,快速清理无效连接。- 其他参数:进一步优化内核对网络连接的处理,提升整体系统性能。
使配置生效:
sysctl -p
结语
通过以上 10 个优化技巧,可以显著提升 Nginx 的性能和稳定性。然而,性能优化是一个持续的过程,需要根据实际业务需求和服务器环境进行调整和测试。希望本文能为你的 Nginx 优化之路提供有价值的参考。如果你有更多优化经验或建议,欢迎在下方留言分享!
参考链接: