将 docs/ 根目录下的 nginx 相关文档统一移动到 docs/nginx/ 子目录, 提高文档组织性和可维护性。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8.1 KiB
8.1 KiB
NGINX 性能优化指南
1. Worker 进程配置
worker_processes
设置工作进程数量:
worker_processes auto; # 自动匹配 CPU 核心数(推荐)
worker_processes 4; # 固定 4 个进程
worker_cpu_affinity
绑定 worker 到特定 CPU 核心:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000; # 4 核绑定
worker_connections
每个 worker 的最大连接数:
events {
worker_connections 10240; # 默认 512
}
worker_rlimit_nofile
worker 进程最大打开文件数:
worker_rlimit_nofile 100000;
2. 事件处理优化
events 块配置
events {
worker_connections 10240; # 每个 worker 连接数
use epoll; # Linux 使用 epoll
multi_accept on; # 一次接受所有连接
accept_mutex off; # 高流量时关闭互斥锁
}
连接处理方法
| 平台 | 方法 | 说明 |
|---|---|---|
| Linux | epoll |
高效(推荐) |
| FreeBSD/macOS | kqueue |
高效 |
| Solaris | /dev/poll |
高效 |
| 通用 | select/poll |
标准(效率低) |
3. HTTP 优化
sendfile
使用内核级文件传输:
sendfile on;
tcp_nopush / tcp_nodelay
tcp_nopush on; # sendfile 时发送完整数据包
tcp_nodelay on; # 减少网络延迟
keepalive 配置
http {
keepalive_timeout 65s;
keepalive_requests 10000;
}
长连接到上游
upstream backend {
server 192.168.1.1:8080;
keepalive 32; # 保持 32 个空闲连接
keepalive_timeout 60s;
keepalive_requests 1000;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
4. 缓冲配置
响应缓冲
http {
# 客户端缓冲
client_body_buffer_size 16k;
client_header_buffer_size 1k;
client_max_body_size 10m;
# 代理缓冲
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
}
FastCGI 缓冲
fastcgi_buffering on;
fastcgi_buffer_size 16k;
fastcgi_buffers 16 16k;
5. 文件缓存
open_file_cache
缓存打开的文件描述符:
http {
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
expires 30d;
add_header Cache-Control "public, immutable";
open_file_cache max=1000 inactive=30s;
}
6. Gzip 压缩优化
http {
gzip on;
gzip_comp_level 6; # 压缩级别(1-9)
gzip_min_length 1000; # 最小压缩长度
gzip_proxied any; # 代理请求也压缩
gzip_vary on; # 添加 Vary 头
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml;
gzip_buffers 16 8k;
gzip_disable "msie6";
}
预压缩文件
location ~* \.(css|js)$ {
gzip_static on;
expires 30d;
}
7. 连接优化
连接复用
upstream backend {
server 192.168.1.1:8080;
keepalive 64;
keepalive_timeout 60s;
keepalive_requests 10000;
}
HTTP/2
server {
listen 443 ssl http2;
# ...
}
HTTP/3 (QUIC)
server {
listen 443 quic reuseport;
listen 443 ssl;
add_header Alt-Svc 'h3=":443"; ma=86400';
# ...
}
8. SSL/TLS 优化
会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_session_tickets on;
OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
缓冲区大小
ssl_buffer_size 4k; # 减少 TLS 记录大小,加快首字节
9. 代理优化
超时配置
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
缓冲优化
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
proxy_max_temp_file_size 1024m;
连接复用
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
10. 内核参数优化
/etc/sysctl.conf
# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
# 连接跟踪
net.netfilter.nf_conntrack_max = 1000000
# 文件描述符
fs.file-max = 1000000
# 应用配置
sysctl -p
/etc/security/limits.conf
# 增加文件描述符限制
* soft nofile 100000
* hard nofile 100000
11. 监控与调优
stub_status
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
日志分析
log_format perf '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent $request_time '
'$upstream_connect_time $upstream_header_time $upstream_response_time';
性能指标
| 指标 | 说明 | 优化方向 |
|---|---|---|
| QPS | 每秒请求数 | 增加 worker,优化配置 |
| 延迟 | 请求响应时间 | 减少缓冲,启用缓存 |
| 连接数 | 并发连接 | 增加 worker_connections |
| CPU | CPU 使用率 | 减少压缩级别,禁用日志 |
| 内存 | 内存使用 | 调整缓冲区大小 |
12. 负载测试
使用 ab (Apache Bench)
ab -n 10000 -c 100 http://example.com/
使用 wrk
wrk -t 12 -c 400 -d 30s http://example.com/
使用 hey
hey -n 10000 -c 100 http://example.com/
13. 配置示例
高性能 Web 服务器
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 10000;
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s;
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css application/json application/javascript text/xml;
server {
listen 80 backlog=65535;
server_name example.com;
location / {
root /var/www/html;
try_files $uri $uri/ =404;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
}
高性能代理服务器
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 10000;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
keepalive 64;
}
server {
listen 80 backlog=65535;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 32k;
proxy_cache main;
proxy_cache_key $uri;
proxy_cache_valid 200 10m;
}
}
}
14. 故障排查
高 CPU 使用率
- 检查日志级别(避免 debug)
- 减少 gzip 压缩级别
- 检查正则表达式复杂度
- 使用
strace分析
高内存使用
- 减小缓冲区大小
- 限制连接数
- 检查内存泄漏
连接超时
- 增加超时时间
- 检查后端服务器
- 查看系统日志
性能分析工具
# 查看连接状态
ss -tn
# 查看 nginx 进程
ps aux | grep nginx
# 系统负载
top -p $(pgrep nginx | head -1)
# 网络统计
netstat -an | grep :80 | wc -l