Nginx配置优化:提高并发量的7个参数

Nginx配置优化:提高并发量的7个参数

你的网站并发高了就卡。用户一多,服务器负载飙升。你怀疑是硬件不够,准备掏钱升级。先等等,也许你只是没把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。改完之后重新压测一遍,你会感谢自己今天动了这几行配置。

知识库

服务器迁移实战:从旧机器搬家到新机器

2026-5-15 15:47:59

知识库

DNSSEC是什么意思?如何使用DNSSEC?

2024-10-23 10:52:34

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧