
你的网站并发高了就卡。用户一多,服务器负载飙升。你怀疑是硬件不够,准备掏钱升级。先等等,也许你只是没把Nginx调好。同样的配置,默认参数和高并发参数,能扛的并发量可能差好几倍。有时候加一个参数,就能多撑一倍的用户。
今天聊7个Nginx核心参数,教你把这台机器的潜力榨出来。
先看一个对比
我曾经在两台一模一样的服务器上做过压力测试。一台用默认配置,跑到300并发的时候,开始丢包报错。另一台调了7个参数,跑到800并发仍然平稳。
硬件没变,变的只是配置文件。多撑了近三倍的流量。
第一项:worker_processes——启动几个工作进程
这个参数决定Nginx启动几个工作进程来处理请求。
nginx
worker_processes auto;
Nginx的架构是“一个master进程 + 多个worker进程”。master负责管理,worker负责干活。auto会自动设置为CPU核心数。4核CPU配4个worker,每个worker占一个核心,互不争抢,效率最高。
可以用grep processor /proc/cpuinfo | wc -l查看CPU核心数。如果手动设,4核就写4。但auto更省心。
第二项:worker_connections——单个进程能开多少连接
每个worker进程同时能处理多少连接。
nginx
events {
worker_connections 10240;
}
这个数字决定了整体并发能力。最大并发数 = worker_processes × worker_connections。假设worker_processes auto(4核),worker_connections 10240,理论最大并发就是4×10240=40960。
默认值是1024,太小了。调高它能直接提升能扛的并发量。建议设10240或20480。别超过65535,那是系统端口数上限。
第三项:multi_accept——一次性多接几个请求
nginx
events {
multi_accept on;
}
默认情况下,一个worker进程一次只接受一个新连接。打开multi_accept后,一次可以接受多个连接。在高并发场景下,这个参数能显著减少连接建立的开销。
第四项:keepalive_timeout——别让空闲连接占着茅坑
HTTP/1.1默认开启keepalive,一个TCP连接可以发多个请求,不用每次重新握手。但如果客户端发完请求不关连接,服务器端的连接就一直占用资源。
nginx
keepalive_timeout 65;
设65秒,如果客户端65秒内没新请求,服务器主动关掉连接。设太短(比如5秒),可能用户还没加载完下一个资源就被断了;设太长,空闲连接占用资源。65是一个比较平衡的值。
第五项:client_max_body_size——允许上传多大的文件
默认是1M,用户上传一个2M的图片就被拒了。
nginx
client_max_body_size 10M;
根据业务调整。普通网站设10M-20M够用。如果是视频站或文件站可以更大,比如100M。
第六项:gzip on——压缩响应,省带宽也省时间
把响应文本压缩后再发给客户端。网页的HTML、CSS、JS压缩后能减小60%-80%,用户加载更快,你也省带宽。
nginx
gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/json;
gzip_min_length 1024:小于1KB的不压缩,文件太小压缩反而亏。gzip_types里列出需要压缩的MIME类型。压缩效果最明显的是文本类资源,图片本身已压缩,不必再走gzip。
第七项:buffer调大——别让慢客户端拖垮你
当客户端网速慢时,Nginx要先把响应内容存在缓冲区里,慢慢发给客户端。如果缓冲区太小,Nginx会写磁盘,性能骤降。
nginx
client_body_buffer_size 128k; client_max_body_size 10m; client_header_buffer_size 1k; large_client_header_buffers 4 8k;
client_body_buffer_size:处理POST请求时的缓冲区,调大能减少磁盘I/O。large_client_header_buffers:处理大Cookie或长URL时用。
完整的高并发配置示例
把以上参数整理到一起,放进/etc/nginx/nginx.conf。
nginx
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 10240;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
client_body_buffer_size 128k;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 其他站点配置...
}
修改完后,先测试语法:nginx -t。没问题再重载:systemctl reload nginx。
别忘了系统层面的限制
Nginx自己的参数调好了,还要检查一下操作系统的限制。文件描述符限制太低,连接数一样上不去。
修改/etc/security/limits.conf,加:
text
* soft nofile 65535 * hard nofile 65535
重启服务器生效。
一个真实案例
一个在线答题网站,活动期间流量暴涨,服务器频繁502。CPU没满,内存有余,就是扛不住。查了半天,发现worker_connections默认1024,4个worker最多扛4096并发,超过就报错。改成10240后,并发从4000直接顶到15000,再没502。
负责人说:“原来不是服务器不行,是我不会配。”
最后一句
优化Nginx参数不是超频,是让它用你期望的方式工作。默认配置是为兼容性,不是为性能。
拿上这7个参数,去检查你的nginx.conf。改完之后重新压测一遍,你会感谢自己今天动了这几行配置。




