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