nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接

发布时间 2023-06-02 14:47:34作者: 三国梦回

nginx在代理到upstream时的默认行为

最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题。

替换成openresty后,在本地进行了一个请求,header如下:

POST /servlet/json HTTP/1.1
Host: 10.80.121.xxx:9900
Connection: keep-alive
Content-Length: 423
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=abcciHlT1nqAi571RB6Hy
Accept: */*
User-Agent: maios/3.9.0 (iPhone; iOS 13.5.1; Scale/2.00)
Accept-Language: zh-Hans-CN;q=1

Accept-Encoding: gzip, deflate

在经过nginx转发到upstream后,发现请求竟然变了:

POST /servlet/json HTTP/1.0
Host: 10.80.121.xxx
Connection: close
Content-Length: 423
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=abcciHlT1nqAi571RB6Hy
Accept: */*
User-Agent: maios/3.9.0 (iPhone; iOS 13.5.1; Scale/2.00)
Accept-Language: zh-Hans-CN;q=1
Accept-Encoding: gzip, deflate

主要的变化有两处,一个是版本从1.1变成1.0,另一个是keep-alive变成了close。

image-20230602143449380

一开始,还以为是openresty搞的鬼,结果发现nginx自己也是这样。

背后原因

在nginx文档,http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version,显示:

image-20230602143623434

网上一搜,有相关的文档,里面也有强制使用http1.1的方案:

Mistake 3: Not Enabling Keepalive Connections to Upstream Servers

https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives