Nginx是否可以设置完整请求的全流程超时时间?
Nginx 代理请求总超时控制配置方案
你需要的是代理请求全链路总耗时限制,Nginx 原生的 proxy_read_timeout、proxy_send_timeout 确实仅限制两次读写操作之间的间隔时长,无法覆盖从请求发起到响应接收完成的全流程总耗时,可通过以下方案实现需求:
方案1:使用原生proxy_timeout指令(推荐)
Nginx 1.15.9 及以上版本新增了 proxy_timeout 指令,专门用于定义代理请求的全流程总超时时间,配置示例如下:
# 对应需要代理的location块 location /proxy-path/ { proxy_pass http://你的上游服务地址; # 配置全流程总超时为200毫秒 proxy_timeout 200ms; # 开启拦截代理错误,自定义返回内容 proxy_intercept_errors on; # 将代理超时默认返回的504状态码重写为204 error_page 504 =204 @204_empty; } # 内部location,专门返回204空响应 location @204_empty { internal; return 204; }
方案2:低版本Nginx兼容方案
如果你使用的Nginx版本低于1.15.9且无法升级,可通过编译安装ngx_http_lua_module模块后用Lua逻辑实现总超时控制:
location /proxy-path/ { access_by_lua_block { local timeout = 200 local timer = ngx.timer.at(timeout / 1000, function() if ngx.ctx.request_processing then ngx.exit(204) end end) ngx.ctx.request_processing = true ngx.ctx.timer = timer } proxy_pass http://你的上游服务地址; body_filter_by_lua_block { if ngx.arg[2] then ngx.ctx.request_processing = false if ngx.ctx.timer then ngx.ctx.timer:cancel() end end } }
内容的提问来源于stack exchange,提问作者Зуфар Латыпов
相关产品推荐
相关产品推荐

