Nginx 性能优化
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
连接数。
六、监控与调优工具
-
实时监控:
# 连接数统计 ss -antp | grep nginx | wc -l # 进程资源占用 top -H -p $(pgrep -d, nginx)
-
日志分析:
# 请求延迟分布 awk '{print $7}' access.log | awk -F'?' '{print $1}' | awk -F'/' '{print $NF}' | sort | uniq -c | sort -nr | head -20
-
压力测试:
# 使用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:盲目增加
worker_processes
- 错误做法:8核CPU设为
worker_processes 32
- 正确做法:通过
top -H
观察CPU使用率,通常80%左右最佳
- 错误做法:8核CPU设为
-
误区2:过度压缩
- 错误做法:
gzip_comp_level 9
+ 压缩所有内容 - 正确做法:仅压缩文本资源,压缩级别4-6即可
- 错误做法:
-
误区3:忽视系统限制
- 错误现象:Nginx报错
too many open files
- 解决方案:
ulimit -n 65535
并持久化配置
- 错误现象:Nginx报错
九、终极优化检查清单
- [ ] 确认
worker_processes
与CPU核心数匹配 - [ ] 验证
worker_connections × worker_processes
> 预期并发数 - [ ] 静态资源启用
expires
和gzip
- [ ] 反向代理配置了合理的
keepalive
和超时 - [ ] 系统文件描述符限制已提升
- [ ] 已通过压力测试验证配置有效性
通过以上系统化的优化,Nginx 在典型场景下可实现:
- QPS 提升 300%-500%
- 延迟降低 40%-60%
- 资源利用率提升 50%-80%
建议通过逐步调优和AB测试确定最佳配置,避免一次性修改过多参数导致问题难以排查。
- 随机文章
- 热门文章
- 热评文章
- 探索自我:深入理解你的心理性格心理性格测试题带答案
- 测你未来的ta有哪方面的性格缺陷
- Java 定时任务系统
- openEuler + 边缘计算:未来算力的“最后一公里”【华为根技术】
- 大模型时代:程序员的 “体力” 与 “脑力” 之变
- 四双眼睛选一 测测你善良还是伪善
- 情感测试 测测你的另一半真实的样子
- Java 事务管理系统
- Node.js技术原理分析系列8——将Node.js内置模块外置