Nginx转发请求到uWsgi时URI(路径+查询参数)大小翻倍原因问询
问题成因
- 核心原因是Nginx的
ngx_http_uwsgi_module模块默认会向uWsgi服务同时传递两份URI相关数据:- 第一份是原始未处理的完整请求URI(对应Nginx内置变量
$request_uri,包含路径、查询字符串,保留原始编码格式),封装为REQUEST_URIuwsgi参数传递 - 第二份是Nginx解析后的拆分数据:解码后的路径
$uri封装为PATH_INFO参数,原始查询字符串$query_string封装为QUERY_STRING参数单独传递
- 第一份是原始未处理的完整请求URI(对应Nginx内置变量
- 当URI总长度(路径+查询参数)约为4k时,
REQUEST_URI本身占4k左右,PATH_INFO与QUERY_STRING的总长度也接近4k,两份数据累加就会让uWsgi接收的缓冲区总大小达到8k左右,出现你观察到的翻倍现象。 - 普通请求头不存在重复传递逻辑,Nginx只会将每个请求头作为对应uwsgi参数传递一次,因此不会出现大小翻倍的问题。
解决方案
如果你的uWsgi上层应用不需要用到REQUEST_URI参数(Django、Flask等绝大多数Python Web框架默认都是通过PATH_INFO和QUERY_STRING处理请求路由与参数),可以通过修改Nginx配置避免重复传递URI数据:
- 方法1:找到Nginx配置目录下的
uwsgi_params文件,注释掉uwsgi_param REQUEST_URI $request_uri;配置行 - 方法2:在对应反向代理的
server/location配置块中添加uwsgi_pass_request_uri off;指令(Nginx 1.11.0及以上版本均支持该指令)
调整后URI仅会传递一次拆分后的PATH_INFO+QUERY_STRING,uWsgi的buffer-size参数无需再设置为Nginxlarge_client_header_buffers配置值的两倍。
内容的提问来源于stack exchange,提问作者Mark Gerolimatos
相关产品推荐
相关产品推荐

