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。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章