2026-09-17 16:43 1003 次浏览

Nginx性能调优实战:从worker配置到内核参数的系统性优化

Nginx默认配置只是能用,离好用还差得远。本文从worker进程、连接数、内核TCP参数到静态资源缓存,给出可直接落地的调优清单,并说明每项参数背后的原理与踩坑点。

先搞清楚瓶颈在哪,别上来就改参数

很多人拿到一台服务器,第一件事就是去搜Nginx优化参数,然后把worker_processes改成auto、worker_connections改到65535,改完发现QPS没涨多少。问题在于,你没搞清楚瓶颈到底在CPU、内存、磁盘IO还是网络带宽。改参数之前,先用abwrk跑一轮基准测试,再看topiostatss -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内存,跑高并发反向代理从容得多。调优和硬件是两条腿走路,缺一条都走不快。