从连接数到缓存:一份能直接抄的Nginx性能调优清单
Nginx调优的文章很多,但大多散落在各处。这篇把连接层、传输层、缓存层和系统层的关键参数整理成一份可对照执行的清单,每项都说明为什么改和改成多少。
调优这件事,最怕的是知道要改但不知道改成多少。下面这份清单按层次整理,每一项都给出推荐值和理由,你可以直接对照自己的nginx.conf逐条检查。
连接层:让Nginx能接住更多请求
worker_processes auto 让Nginx自动匹配CPU核数,这是基础。worker_connections 设 10240 到 65535 之间,具体看内存,每个连接大约占几KB。worker_rlimit_nofile 必须大于等于 worker_connections,否则等于白设。
multi_accept on 让一个worker一次接受多个新连接,高并发下有用。accept_mutex 在新版Nginx里默认关闭,不用管。这几个参数配合起来,单机撑住上万并发连接没问题。
传输层:减少每个请求的开销
sendfile on 配合 tcp_nopush on 处理静态文件,tcp_nodelay on 处理keepalive连接上的小包。这三个是经典组合,静态资源服务必开。keepalive_timeout 设 30 到 65 秒,太短浪费握手,太长占连接槽。
gzip 按内容类型开,不要全局开。gzip_comp_level 设 4 到 6 之间,再高压缩率提升有限但CPU翻倍。gzip_min_length 设 1024,太小的响应压缩反而增加开销。
缓存层:把重复计算挡在前面
open_file_cache 缓存文件描述符和元数据,对静态文件服务效果明显。max 设 10000 到 20000,inactive 设 60s。proxy_cache 对反向代理场景有用,但要配好 proxy_cache_path 的目录和内存区大小,keys_zone 设 10m 到 100m 之间。
- open_file_cache max=20000 inactive=60s
- open_file_cache_valid 80s
- open_file_cache_min_uses 2
- proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m
系统层:别让内核拖后腿
net.core.somaxconn 设 65535,让accept队列够长。net.ipv4.tcp_max_syn_backlog 设 65535,应对SYN洪水。net.ipv4.tcp_tw_reuse 设 1,复用TIME_WAIT端口。net.ipv4.ip_local_port_range 设 1024 65535,扩大可用端口范围。
文件描述符限制在 /etc/security/limits.conf 里改,soft和hard都设65535。改完记得重新登录或者重启服务才生效。
如果你的服务面向海外用户,服务器本身的网络质量会直接影响调优效果。比如圣何塞站群服务器这种100M带宽的美西机器,适合跑面向北美用户的站点,调优后延迟和吞吐的改善会更直观。
清单不是改完就完事。每次改完用wrk或ab压一轮,记录QPS和P99延迟。参数之间会互相影响,比如开了proxy_cache之后keepalive_timeout可以适当调短。有数据再动手,比凭感觉改要稳。