nginx http代理优化需匹配整体架构节奏,通过动静分离与分层代理拆分静态资源(js/css/图片/字体)和动态接口(/api/、/admin/),静态路径由nginx直供或cdn承载,动态路径按业务域细分upstream,并配置proxy_cache、连接复用、超时梯度、分级缓存及系统内核调优。

HTTP 代理是 Nginx 最常用的角色之一,优化它不只是调几个参数,而是要让代理行为与整体架构节奏匹配——减少冗余转发、缩短链路耗时、降低后端压力、提升缓存命中率。
动静分离 + 分层代理
把静态资源(JS/CSS/图片/字体)和动态接口彻底拆开处理。Nginx 不该把所有请求都扔给后端,尤其不该让后端去读取本地文件或 CDN 可承载的内容。
- 静态路径(如 /static/、/assets/)直接由 Nginx 本地 serve 或重定向到 CDN,不走 proxy_pass
- 动态路径(如 /api/、/admin/)才进 upstream,且建议按业务域再细分 upstream(比如 user-api、order-api),便于独立扩缩容和故障隔离
- 对高频只读接口(如商品详情、配置中心),可在 proxy_pass 前加一层 proxy_cache,避免重复打到后端
连接复用与超时协同
代理性能损耗常来自频繁建连、等待响应、连接闲置。关键不是“设得越长越好”,而是前后端超时参数形成梯度配合。
- 客户端到 Nginx:keepalive_timeout 推荐 60–75s,keepalive_requests 设为 1000,兼顾复用与连接老化
- Nginx 到上游:upstream 内启用 keepalive(如 keepalive 32),并配 proxy_http_version 1.1 和 proxy_set_header Connection ""
- 超时三件套要错开:proxy_connect_timeout(建连)< proxy_read_timeout(等响应)< proxy_send_timeout(发数据),例如设为 3s / 60s / 45s,防止某环节卡死拖垮整条流水线
缓存策略精准落地
代理缓存不是“开了就行”,必须结合内容特性分级控制,否则容易缓存脏数据或绕过缓存。
- 对带 Cache-Control: public / max-age 的响应,直接信任并缓存;对 no-cache 或 private 响应,跳过 proxy_cache
- 用 proxy_cache_valid 按状态码分策略:200/302 缓存 10m,404 缓存 1m(防穿透),5xx 不缓存
- 缓存 key 要包含关键变量:默认 $scheme$proxy_host$request_uri 不够,建议加入 $http_accept_language(多语言)、$cookie_token(登录态)等,避免缓存混淆
- 缓存路径建议用 use_temp_path=off,避免写临时文件带来的 I/O 开销
系统与内核协同调优
Nginx 作为代理层,吞吐瓶颈常不在自身配置,而在 OS 层面对高并发连接的支持能力。
- 确保 worker_rlimit_nofile 65535,并在系统级同步设置:ulimit -n 65535,同时在 /etc/security/limits.conf 中固化
- 调整内核 TCP 参数:net.core.somaxconn=65535(全连接队列)、net.ipv4.tcp_max_syn_backlog=65535(半连接队列)、net.ipv4.ip_local_port_range="1024 65535"
- 启用 reuseport(需 Nginx ≥1.9.1 + Linux ≥3.9):让每个 worker 绑定独立 listen socket,消除 accept 锁争抢,实测 QPS 提升 15%~30%











