nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接
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。
一开始,还以为是openresty搞的鬼,结果发现nginx自己也是这样。
背后原因
在nginx文档,http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version,显示:
网上一搜,有相关的文档,里面也有强制使用http1.1的方案:
Mistake 3: Not Enabling Keepalive Connections to Upstream Servers
https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives