theme: default themeName: "默认主题" title: "Nginx配置看这里:这几个优化让并发能力提升3倍"
Nginx配置看这里:这几个优化让并发能力提升3倍
Nginx性能强劲是公认的,但默认配置只是"能用",离"好用"还差得远。同样的服务器,配置调优和裸奔,性能能差好几倍。
上周帮一个客户做压测,2核4G的服务器,默认配置并发只能到800QPS。优化后飙到2500QPS,而且CPU占用还降了。客户问我用了什么黑科技,我说没有黑科技,就是把Nginx配置吃透了。
今天把几个核心优化点整理出来,都是实战检验过的,照抄就能用。
Worker进程数
默认配置:
worker_processes 1;
这个配置的意思是只开一个工作进程。单核时代没毛病,现在谁家服务器不是多核?
改成:
worker_processes auto;
auto会自动检测CPU核心数,开对应数量的worker。或者手动指定:
worker_processes 4; # 4核CPU
每个worker进程是单线程的,多worker能充分利用多核。这是最基础也最重要的优化。
Worker连接数
events {
worker_connections 1024; }
默认1024,对于现代服务器来说太保守了。改成:
events {
worker_connections 4096; use epoll; # Linux系统 }
worker_connections是每个worker能处理的最大连接数。总并发能力 = worker_processes × worker_connections。4核配4096连接,理论上限是16384并发。
use epoll指定使用epoll事件模型,Linux下性能最优。
开启文件描述符
高并发场景下,系统默认的文件描述符限制会成为瓶颈。先改系统限制:
# 临时生效
ulimit -n 65535
永久生效,编辑 /etc/security/limits.conf
* soft nofile 65535 * hard nofile 65535
然后在Nginx配置:
worker_rlimit_nofile 65535;
这样Nginx进程能打开足够的文件描述符,不会因为连接数太多报错。
开启gzip压缩
gzip on;
gzip_min_length 1k; gzip_types text/plain application/json application/javascript text/css; gzip_comp_level 4;
压缩能大幅减少传输数据量,特别是API返回的JSON,压缩比能到70%以上。gzip_comp_level建议4-6,太高会浪费CPU,太低压缩效果不明显。
注意:图片、视频等已压缩文件不要再压缩,反而增加CPU开销。
连接复用优化
keepalive_timeout 65;
keepalive_requests 1000;
keepalive让连接保持,避免频繁建立断开。timeout设60-120秒,requests可以设大一点,复用更多请求。
对于后端是应用服务器的场景:
upstream backend {
server 127.0.0.1:8080; keepalive 128; # 保持128个长连接 }
配合应用服务器开启长连接,性能提升明显。
缓冲区调优
client_body_buffer_size 16k;
client_header_buffer_size 1k; client_max_body_size 20m; large_client_header_buffers 4 8k;
缓冲区太小会导致临时文件写入,影响性能。根据业务调整:
- 普通API:client_body_buffer_size设16k-64k
- 文件上传:调大client_max_body_size
- 请求头大的场景:调大client_header_buffer_size
静态文件缓存
location ~* \.(js|css|png|jpg|gif|ico)$ {
expires 30d; add_header Cache-Control "public, immutable"; }
静态资源设置长缓存,减少重复请求。immutable告诉浏览器文件不会变,连验证请求都省了。
版本化静态文件名(app.v1.2.3.js)配合缓存效果最佳。
access_log优化
默认每个请求都写日志,高并发下会成为瓶颈。几种优化方式:
1. 关闭不必要的日志location /static/ {
access_log off; }
2. 使用缓冲
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
日志先写缓冲区,定期刷到磁盘。
3. 使用json格式log_format json_combined escape=json '{ "time":"$time_iso8601",'
'"remote_addr":"$remote_addr",' '"request":"$request",' '"status":"$status",' '"body_bytes_sent":"$body_bytes_sent" }'; access_log /var/log/nginx/access.log json_combined;
JSON格式便于日志分析工具解析,不用正则匹配,效率更高。
验证优化效果
压测是检验真理的唯一标准。用wrk或ab:
wrk -t12 -c1000 -d30s http://your-server/api/test
记录优化前后的QPS、延迟、错误率。数据说话,别凭感觉。
看完还有什么疑问吗?
如果文章没有覆盖到你的情况,欢迎联系我们咨询——免费解答,说清楚再决定要不要服务。
📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com 🌐 https://www.eycit.com
易云城IT服务,您身边的IT专家。