源站宕机时如何调整Nginx超时期限内的并发请求数?
Nginx源站宕机时快速返回缓存并发优化方案
问题根因
你当前的配置存在四个核心限制:
- 开启
proxy_cache_lock on后默认排队等待源站返回才响应,大量不同缓存key的请求都会触发回源排队 - 单worker连接上限过低,整体并发处理能力不足
- 仅配置了连接超时,未配置读写超时,异常场景下超时等待时间不可控
- 隐式上游配置没有优化长连接和并发上限
具体配置调整
1. 调整nginx.conf的events块参数,提升连接处理能力
把原events块替换为以下配置:
events { use epoll; multi_accept on; worker_connections 10240; }
use epoll开启Linux平台下最高效的事件处理模型multi_accept on允许worker进程一次性接收所有 pending 的连接worker_connections从100调整到10240,单worker可处理的连接数提升100倍,适配高并发场景
2. 在http块中新增显式上游配置,优化回源并发
在http块中(include /etc/nginx/conf.d/*.conf;之前)添加以下配置:
upstream origin_blabla { server blabla.com max_conns=100; keepalive 64; keepalive_requests 1000; keepalive_timeout 60s; }
max_conns=100限制发往源站的最大并发连接为100,避免源站压力过大,可根据源站承载能力调整keepalive系列配置开启回源长连接复用,减少TCP握手开销,提升回源效率
3. 调整default.conf的location块参数,优化缓存策略
把原location / 块替换为以下配置:
location / { #limit_req zone=mylimit; #limit_req_dry_run on; proxy_cache my_cache; proxy_cache_methods POST GET HEAD; proxy_connect_timeout 3s; proxy_send_timeout 2s; proxy_read_timeout 2s; proxy_cache_key "$host$request_uri|$request_body"; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504 any; proxy_cache_background_update on; proxy_cache_background_update_timeout 1s; proxy_cache_lock on; proxy_cache_lock_timeout 0; proxy_cache_lock_age 1s; proxy_ignore_headers X-Accel-Expires Expires Set-Cookie Cache-Control; proxy_set_header Host $host; proxy_pass https://origin_blabla; # 如果源站是HTTP就把https改成http proxy_buffering on; proxy_cache_valid 200 304 301 10m; }
核心调整点说明:
- 新增
proxy_send_timeout/proxy_read_timeout,把整体回源超时从默认的60s压缩到2s,源站异常时更快触发stale缓存返回 - 新增
proxy_cache_lock_timeout 0,只要有可用的stale缓存,所有请求直接返回,不排队等待源站响应 - 新增
proxy_cache_lock_age 1s,异常回源请求最长占用锁1s,避免锁长期被占 - 新增
proxy_cache_use_stale any,所有源站异常场景都优先返回stale缓存,覆盖所有极端情况 proxy_pass改为显式上游,复用长连接提升回源并发
额外说明
如果调整后还是出现单时间窗口仅6个请求的情况,是浏览器对单个HTTPS域名的默认并发请求限制(Chrome/Edge/Firefox默认都是6个),和Nginx配置无关,可通过前端静态资源拆分到多个子域名的方式解决。
内容的提问来源于stack exchange,提问作者user3881870
相关产品推荐
相关产品推荐

