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_processesauto 改为 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并发、连接模型、缓存策略、压缩配置”为核心优化点,配合可执行示例、排错路径与压测方法,形成可复用的性能调优闭环。