2026.05.20 | youres | 16次围观
为什么要优化Nginx
Nginx本身已经很快了,但默认配置远远没有发挥出它的全部潜力。一个经过调优的Nginx,处理并发能力可以提升数倍,响应延迟大幅降低。这篇文章不讲理论,直接给你10个能落地的优化配置,改完就能见效。
一、Worker进程与连接数优化
这是最基础也是影响最大的优化项。
1. 自动分配Worker进程
worker_processes auto;
设为auto让Nginx自动检测CPU核心数,不用手动填数字。每个Worker进程绑定一个CPU核心,充分利用多核性能。
2. 提升单进程连接数
events {
worker_connections 65535;
multi_accept on;
use epoll;
}
- worker_connections:每个Worker最大连接数,默认1024太小,建议设为65535
- multi_accept:允许一个Worker同时接受多个新连接
- use epoll:Linux下使用epoll事件模型,效率最高
别忘了系统层面也要放开文件描述符限制:
ulimit -n 65535
或者在/etc/security/limits.conf中永久设置。
二、网络传输优化
3. 启用零拷贝文件传输
sendfile on; tcp_nopush on; tcp_nodelay on;
- sendfile:内核直接传输文件,跳过用户态拷贝
- tcp_nopush:配合sendfile,数据包攒够再发,减少网络开销
- tcp_nodelay:小数据包立即发送,降低延迟
tcp_nopush和tcp_nodelay看似矛盾,实际是互补的:大文件传输用nopush攒包,小响应用nodelay快速返回。
4. 开启Gzip压缩
gzip on; gzip_min_length 1k; gzip_comp_level 4; gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml; gzip_vary on;
- gzip_comp_level:压缩级别4是性价比最高的,再高CPU消耗大但压缩收益递减
- gzip_min_length:小于1KB的文件不压缩,压缩反而更大
- gzip_types:别只压缩text/html,CSS、JS、JSON、SVG都要加上
三、连接复用优化
5. 调整Keepalive长连接
keepalive_timeout 65; keepalive_requests 10000;
默认的keepalive_requests值是100,对于高并发场景太低了。一个长连接上允许更多请求,减少TCP握手开销。
6. 对上游服务也启用Keepalive
upstream backend {
server 127.0.0.1:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
Nginx作为反向代理时,与后端之间也要复用连接。keepalive 32表示保持32个空闲长连接池。
四、缓存策略优化
7. 静态资源客户端缓存
location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff2|svg|eot|ttf)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
静态资源加上长期缓存头,浏览器不会重复请求。同时关闭access_log减少磁盘写入。
8. 代理缓存后端响应
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:100m max_size=1g inactive=60m;
location /api/ {
proxy_cache api_cache;
proxy_cache_valid 200 10m;
proxy_cache_key ;
add_header X-Cache-Status ;
proxy_pass http://backend;
}
对变化不频繁的API响应做缓存,后端压力直接降一个量级。
五、SSL性能优化
9. 优化HTTPS握手开销
ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets on; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on;
- ssl_session_cache:缓存SSL会话参数,10m大约能存4万个会话
- ssl_session_timeout:会话缓存1天有效,回访用户不用重新握手
- ssl_protocols:只保留TLS 1.2和1.3,1.3握手只需1-RTT
六、日志与限流优化
10. 减少日志写入 + 限流防护
# 静态资源不记日志
location ~* \.(css|js|jpg|png|gif|ico|woff2)$ {
access_log off;
}
# 限制恶意请求
limit_req_zone zone=api_limit:10m rate=30r/s;
location /api/ {
limit_req zone=api_limit burst=50 nodelay;
}
access_log是磁盘IO大户,静态资源关掉它。同时用limit_req防止接口被刷爆。
完整配置参考
把以上优化项整合到一个最小可用的nginx.conf:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 10000;
gzip on;
gzip_min_length 1k;
gzip_comp_level 4;
gzip_types text/plain text/css application/json
application/javascript text/xml application/xml
image/svg+xml;
gzip_vary on;
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
limit_req_zone zone=api_limit:10m rate=30r/s;
# ... server块按需配置
}
优化前后怎么对比
改完配置别光靠感觉,用压测工具量化效果:
ab -n 10000 -c 200 http://your-site.com/
重点关注Requests per second(每秒请求数)和Time per request(平均响应时间)。通常优化后QPS能提升2-5倍,响应时间降低30%-60%。
相关文章推荐
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论