Nginx性能调优实战:从worker配置到内核参数的系统性优化
Nginx默认配置只是能用,离好用还差得远。本文从worker进程、连接数、内核TCP参数到静态资源缓存,给出可直接落地的调优清单,并说明每项参数背后的原理与踩坑点。
先搞清楚瓶颈在哪,别上来就改参数
很多人拿到一台服务器,第一件事就是去搜Nginx优化参数,然后把worker_processes改成auto、worker_connections改到65535,改完发现QPS没涨多少。问题在于,你没搞清楚瓶颈到底在CPU、内存、磁盘IO还是网络带宽。改参数之前,先用ab或wrk跑一轮基准测试,再看top、iostat、ss -s的实时数据,确认瓶颈位置再动手。
如果CPU是瓶颈,优先看worker进程数和CPU亲和性;如果连接数上不去,看文件描述符和内核backlog;如果是静态文件慢,看sendfile和缓存策略。方向对了,调优才有意义。
worker进程与连接数:最基础也最容易配错
worker_processes设为auto让Nginx自动匹配CPU核数,这个没什么争议。但worker_connections的设置要看场景:作为反向代理时,每个客户端连接会占用两个连接(前端和后端各一个),所以实际能承载的并发大约是worker_connections乘以worker_processes再除以2。
- worker_processes auto;
- worker_connections 10240;
- worker_rlimit_nofile 65535;
注意worker_rlimit_nofile要和系统的ulimit -n对齐,否则Nginx会报"too many open files"。另外,multi_accept建议开启,让一个worker一次接受多个新连接,减少上下文切换。
内核TCP参数:不改这些,Nginx再快也白搭
Nginx跑在Linux上,内核参数直接决定了网络层的吞吐能力。以下几项是实战中最常调整的:
- net.core.somaxconn:listen队列长度,默认128在高并发下会丢连接,建议调到65535;
- net.ipv4.tcp_max_syn_backlog:SYN队列,同理调大;
- net.ipv4.tcp_tw_reuse:允许TIME_WAIT状态的socket复用,短连接场景效果明显;
- net.ipv4.tcp_fin_timeout:缩短FIN_WAIT_2的超时时间,加快连接回收。
这些参数写进/etc/sysctl.conf后用sysctl -p生效。改完再跑一轮压测,对比QPS和延迟变化,用数据验证效果。
静态资源与缓存:让Nginx少干重复活
静态资源是Nginx的强项,但默认配置下它可能在做很多无用功。开启sendfile和tcp_nopush,让文件传输走零拷贝路径;对图片、CSS、JS设置expires和Cache-Control,减少重复请求;gzip压缩对文本类资源效果显著,但图片和视频不要压,浪费CPU。
如果服务器本身配置不高,或者业务已经跑在带宽受限的机房,光靠软件调优空间有限。这时候可以考虑升级到香港服务器11这类硬件规格更充裕的方案,AMD EPYC 7542双路加128G内存,跑高并发反向代理从容得多。调优和硬件是两条腿走路,缺一条都走不快。