Nginx 反向代理下大文件上传至 aiohttp 服务失败问题咨询
问题根因
你遇到的问题核心是Nginx默认的请求缓冲逻辑与aiohttp异步服务对Expect: 100-continue头的处理逻辑不兼容,你之前调整的客户端缓冲区、超时类参数均未命中问题本质。
具体触发逻辑
HTTP 1.1协议中,客户端上传大于特定大小的文件时,会默认先发送携带Expect: 100-continue头的预检请求,等待服务端返回100状态码后才会发送实际的文件内容。
Nginx默认不会将Expect头转发给后端服务,而是自行处理:当请求体大小超过client_body_buffer_size配置的阈值时,Nginx会先把请求体写入本地磁盘缓存,等完整接收所有请求内容后再统一转发给后端。而aiohttp作为异步Web服务,默认没有适配Nginx的这种大包转发逻辑,双方等待逻辑冲突就会导致连接直接挂起。
修复方案
在你对应的Nginx反向代理location配置块中添加以下3行配置即可:
proxy_set_header Expect $http_expect; proxy_http_version 1.1; proxy_request_buffering off;
各配置作用说明:
proxy_set_header Expect $http_expect:将客户端发送的Expect头原样转发给aiohttp服务,由后端处理100-continue预检逻辑proxy_http_version 1.1:将Nginx反向代理使用的HTTP协议版本升级到1.1,兼容100-continue交互逻辑proxy_request_buffering off:关闭Nginx的请求体缓冲功能,不需要等完整接收客户端请求后再转发,收到多少内容就实时转给后端,匹配aiohttp的异步处理特性
验证步骤
修改配置后执行nginx -s reload重载配置,再上传大于220KB的文件测试即可,你之前已经配置的client_max_body_size等参数无需修改。
内容的提问来源于stack exchange,提问作者user3370112
相关产品推荐
相关产品推荐

