Nginx 反向代理调优笔记
最近把几个对外服务统一收到一台 Nginx 上做反向代理,顺手把参数过了一遍。这篇记几个真正影响体验的点,不是抄模板。
keepalive 分开算
很多人只调 keepalive_timeout,其实 upstream 的 keepalive 是两回事:
upstream backend {
server 127.0.0.1:8080;
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
}
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
}
关键在最后那行。HTTP/1.1 下如果不把 Connection 置空,Nginx 会一直发 Connection: close,upstream 连接池等于没开。这一条加上之后,后端 TIME_WAIT 直接掉了一个量级。
缓冲区别一把梭
默认的 proxy_buffer_size 4k/8k 在返回大响应头时会报这个错:
upstream sent too big header while reading response header from upstream
调大即可,但没必要全调成 128k。我的做法是只调这一组:
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
另外长连接场景(比如 websocket、SSE)记得加 proxy_buffering off,否则消息会被缓冲住,看起来像卡死。
502 排查顺序
看到 502 别急着改超时,按这个顺序看最快:
- 后端进程还在不在(
ss -tlnp | grep 端口) - Nginx 的 error_log 里那一行具体写的是 connect refused 还是 timeout
- 如果是 timeout,再看是
proxy_connect_timeout还是proxy_read_timeout - 最后才看
proxy_buffer_size导致的 header 超限
connect refused 是后端没起来,超时是后端处理慢,两者改的参数完全不同。上来就加超时是最常见的误判。
顺手改的几项
server_tokens off— 不回版本号sendfile on+tcp_nodelay on— 静态文件明显快reset_timedout_connection on— 早点回收死连接client_max_body_size按业务实际值给,别留默认 1m
以上都是小改动,但加起来对稳定性影响不小。