← 返回列表

Nginx 反向代理调优笔记

网络2026-09-28 · 约 6 分钟

最近把几个对外服务统一收到一台 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 别急着改超时,按这个顺序看最快:

  1. 后端进程还在不在(ss -tlnp | grep 端口)
  2. Nginx 的 error_log 里那一行具体写的是 connect refused 还是 timeout
  3. 如果是 timeout,再看是 proxy_connect_timeout 还是 proxy_read_timeout
  4. 最后才看 proxy_buffer_size 导致的 header 超限

connect refused 是后端没起来,超时是后端处理慢,两者改的参数完全不同。上来就加超时是最常见的误判。

顺手改的几项

以上都是小改动,但加起来对稳定性影响不小。