7.7.4 配置优化:worker、连接、缓存与压缩
本节聚焦Nginx性能与稳定性常见配置项优化,覆盖worker并发、连接模型、缓存策略与压缩配置,并配套可执行示例、排错路径与练习。
原理草图:worker/连接/缓存/压缩的数据流
1. worker进程与CPU亲和#
配置示例(/etc/nginx/nginx.conf)
user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 200000;
events {
worker_connections 8192;
use epoll;
multi_accept on;
}
命令解释与验证
# 查看CPU核数
nproc
# 查看Nginx进程与线程
ps -eo pid,ppid,cmd,psr,pcpu --sort=-pcpu | grep nginx
# 查看文件句柄上限
ulimit -n
# 验证配置语法
nginx -t
worker_processes auto:自动与CPU核数匹配。worker_cpu_affinity auto:自动绑定核心,减少迁移。worker_rlimit_nofile:提升可用文件句柄上限,避免高并发耗尽。
排错示例
# 当出现 "Too many open files" 时
grep -R "worker_rlimit_nofile" /etc/nginx/nginx.conf
ulimit -n
# 同步提升系统限制
cat <<'EOF' | sudo tee -a /etc/security/limits.conf
nginx soft nofile 200000
nginx hard nofile 200000
EOF
sudo systemctl restart nginx
练习
- 将 worker_processes 从 auto 改为 1,用压测比较吞吐变化。
- 对比启用/禁用 worker_cpu_affinity 的CPU利用率和上下文切换。
2. 连接与事件模型#
配置示例
events {
worker_connections 8192;
use epoll;
multi_accept on;
}
http {
keepalive_timeout 30s;
keepalive_requests 200;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
连接容量估算
理论并发 ≈ worker_processes * worker_connections
注意:代理场景会消耗上下游双向连接
排错示例:502/504与连接耗尽
# 查看当前连接数
ss -s
# 查看Nginx状态(需启用stub_status)
curl -s http://127.0.0.1/nginx_status
# 检查上游超时
grep "upstream timed out" /var/log/nginx/error.log | tail -n 5
练习
- 将 keepalive_timeout 从 30s 调整到 5s,观察短连接峰值与延迟变化。
- 关闭 multi_accept,在突发压测下对比RT分布。
3. 缓存优化(proxy_cache/fastcgi_cache)#
缓存路径与命中示例
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:200m
max_size=10g inactive=30m use_temp_path=off;
server {
listen 80;
server_name cache.example.com;
location /api/ {
proxy_pass http://backend;
proxy_cache cache_zone;
proxy_cache_key "$scheme$proxy_host$request_uri";
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
}
命令与解释
# 创建缓存目录并授权
sudo mkdir -p /var/cache/nginx
sudo chown -R nginx:nginx /var/cache/nginx
# 验证配置
nginx -t && systemctl reload nginx
# 验证命中
curl -I http://cache.example.com/api/test | grep X-Cache-Status
keys_zone:缓存索引内存大小。max_size/inactive:磁盘与过期策略。X-Cache-Status:HIT/MISS/BYPASS。
排错示例:命中率低
# 检查缓存key是否过度细分
grep -R "proxy_cache_key" /etc/nginx/nginx.conf
# 检查是否带无效参数
curl -I "http://cache.example.com/api/test?ts=123"
练习
- 让 proxy_cache_key 忽略 utm_* 参数,提高命中率。
- 模拟上游异常,观察 proxy_cache_use_stale 降级效果。
4. 压缩与传输优化#
配置示例
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_comp_level 3;
gzip_vary on;
gzip_proxied any;
}
验证与效果
# 未压缩
curl -I http://example.com/static/app.js
# 强制客户端支持gzip
curl -I -H "Accept-Encoding: gzip" http://example.com/static/app.js
# 观察响应头 Content-Encoding: gzip
排错示例
# 若未压缩,检查类型是否在 gzip_types 中
grep -R "gzip_types" /etc/nginx/nginx.conf
# 检查是否对二进制文件压缩导致CPU升高
top -p $(pgrep -d',' nginx)
练习
- 将 gzip_comp_level 从 3 调到 6,观察CPU与带宽变化。
- 对比开启/关闭 gzip_vary 对代理缓存的影响。
5. 配置验证、回归与压测#
灰度验证流程
# 语法检查
nginx -t
# 平滑重载
systemctl reload nginx
# 回滚(示例)
cp /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf && systemctl reload nginx
压测示例(wrk)
# 安装(Debian/Ubuntu)
sudo apt-get install -y wrk
# 基准压测
wrk -t4 -c200 -d30s http://example.com/api/test
# 关注输出:Requests/sec、Latency
观察指标
# 连接数、请求速率
curl -s http://127.0.0.1/nginx_status
# 监控CPU/内存
top -p $(pgrep -d',' nginx)
练习
- 以 worker_connections=1024/8192 分别压测,记录吞吐变化。
- 缓存前后对比上游响应时间与带宽占用。
小结
本节以“worker并发、连接模型、缓存策略、压缩配置”为核心优化点,配合可执行示例、排错路径与压测方法,形成可复用的性能调优闭环。