Nginx 性能优化

测试智商的网站 2周前 (08-22) 阅读数 3979 #在线测试

Nginx 作为高性能 Web 服务器和反向代理,其性能优化涉及多个层面的配置和系统调整。以下是针对不同场景的优化方案,按优先级和影响程度排序。


一、核心配置优化

1. Worker 进程配置

worker_processes auto;  # 自动匹配CPU核心数(推荐)
# 或显式指定:worker_processes 4; # 通常设为CPU核心数或其倍数

worker_rlimit_nofile 65535;  # 单进程最大文件描述符数
  • 原理:Nginx 通过多进程模型处理请求,worker_processes 决定并发处理能力。
  • 验证方法grep -c 'processor' /proc/cpuinfo 查看CPU核心数。

2. 事件模型调优

events {
    worker_connections 10240;  # 单进程最大连接数
    use epoll;                 # Linux下最佳事件模型
    multi_accept on;           # 一次性接收所有新连接
}
  • 关键指标worker_connections × worker_processes ≈ 最大并发连接数
  • 计算示例:4核CPU × 10240 = 40960 并发连接

二、连接与超时设置

1. Keepalive 优化

http {
    keepalive_timeout 65s;      # 保持连接时长
    keepalive_requests 1000;    # 单连接最大请求数
    tcp_nodelay on;             # 禁用Nagle算法(减少延迟)
    tcp_nopush on;              # 启用TCP_CORK(优化小文件传输)
}
  • 适用场景:高并发短连接(如API服务)可降低 keepalive_timeout,长连接服务(如WebSocket)需延长。

2. 超时控制

client_header_timeout 15s;     # 读取请求头超时
client_body_timeout 15s;       # 读取请求体超时
send_timeout 30s;              # 发送响应超时
  • 风险控制:避免恶意连接占用资源,需根据业务响应时间调整。

三、缓存与压缩优化

1. 静态资源缓存

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
    expires 30d;                # 浏览器缓存30天
    access_log off;             # 静态资源不记录日志
    add_header Cache-Control "public";
}
  • 效果:减少后端压力,提升页面加载速度(CDN同理)。

2. Gzip 压缩

gzip on;
gzip_min_length 1k;           # 最小压缩阈值
gzip_comp_level 6;            # 压缩级别(1-9)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;                 # 添加Vary头
  • 平衡点comp_level=6 在CPU占用和压缩率间取得较好平衡。

四、反向代理优化

1. 后端连接池

upstream backend {
    server 192.168.1.100:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.101:8080 backup;  # 备用服务器
    keepalive 32;                       # 保持到上游的长连接数
}
  • 关键参数keepalive 值需根据后端服务器处理能力调整(通常32-256)。

2. 代理超时配置

location / {
    proxy_connect_timeout 5s;   # 连接后端超时
    proxy_send_timeout 10s;     # 发送请求超时
    proxy_read_timeout 60s;     # 读取响应超时
    proxy_buffering on;         # 启用代理缓冲
    proxy_buffers 16 4k;        # 缓冲区大小
    proxy_busy_buffers_size 8k; # 忙缓冲区大小
}
  • 监控重点:通过 proxy_timeout 避免上游慢响应拖垮Nginx。

五、高级性能优化

1. SSL/TLS 优化

ssl_protocols TLSv1.2 TLSv1.3;  # 禁用不安全协议
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';  # 推荐密码套件
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;  # 10MB缓存约4万会话
ssl_session_timeout 1h;
  • 性能影响:启用 TLSv1.3 可减少握手延迟(比TLSv1.2快30%)。

2. 系统级优化

# 调整系统限制(需root权限)
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
sysctl -w net.ipv4.tcp_tw_reuse=1  # 快速回收TIME_WAIT连接
sysctl -w net.core.somaxconn=65535 # 监听队列长度
  • 关键指标:通过 ss -s 监控 TIME_WAIT 连接数。

六、监控与调优工具

  1. 实时监控

    # 连接数统计
    ss -antp | grep nginx | wc -l
    # 进程资源占用
    top -H -p $(pgrep -d, nginx)
    
  2. 日志分析

    Nginx 性能优化

    # 请求延迟分布
    awk '{print $7}' access.log | awk -F'?' '{print $1}' | awk -F'/' '{print $NF}' | sort | uniq -c | sort -nr | head -20
    
  3. 压力测试

    Nginx 性能优化

    # 使用wrk进行基准测试
    wrk -t12 -c400 -d30s http://yourdomain.com/
    

七、典型场景优化方案

场景 核心配置
高并发API服务 worker_processes auto; worker_connections 20480; keepalive_timeout 10s;
静态文件服务器 sendfile on; tcp_nopush on; open_file_cache max=1000 inactive=20s;
大文件下载 sendfile on; tcp_nopush on; client_max_body_size 10G;
微服务网关 proxy_buffer_size 16k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k;

八、性能优化避坑指南

  1. 误区1:盲目增加 worker_processes

    • 错误做法:8核CPU设为 worker_processes 32
    • 正确做法:通过 top -H 观察CPU使用率,通常80%左右最佳
  2. 误区2:过度压缩

    • 错误做法:gzip_comp_level 9 + 压缩所有内容
    • 正确做法:仅压缩文本资源,压缩级别4-6即可
  3. 误区3:忽视系统限制

    • 错误现象:Nginx报错 too many open files
    • 解决方案:ulimit -n 65535 并持久化配置

九、终极优化检查清单

  1. [ ] 确认 worker_processes 与CPU核心数匹配
  2. [ ] 验证 worker_connections × worker_processes > 预期并发数
  3. [ ] 静态资源启用 expiresgzip
  4. [ ] 反向代理配置了合理的 keepalive 和超时
  5. [ ] 系统文件描述符限制已提升
  6. [ ] 已通过压力测试验证配置有效性

通过以上系统化的优化,Nginx 在典型场景下可实现:

  • QPS 提升 300%-500%
  • 延迟降低 40%-60%
  • 资源利用率提升 50%-80%

建议通过逐步调优和AB测试确定最佳配置,避免一次性修改过多参数导致问题难以排查。

  • 随机文章
  • 热门文章
  • 热评文章
热门