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

nginx,代理,upstream,转换,http1,连接,转为 · 浏览次数 : 73

小编点评

## nginx代理到upstream后请求版本变动原因分析 经过测试,发现nginx代理到upstream后请求版本变动主要是因为`proxy_http_version`选项的设置。 **原配置:** ```nginx proxy_http_version 1.1; ``` 这表示所有请求使用HTTP 1.1协议进行代理。 **修改后:** ```nginx proxy_http_version 1.0; ``` 这表示仅对于与 upstream 服务版本兼容的 HTTP 协议 (1.0、1.1 或 1.2) 的请求使用 HTTP 1.0 协议进行代理。 **原因:** `proxy_http_version`选项用于控制哪些 HTTP 协议的请求会被代理到 upstream 服务。由于`proxy_http_version`设置到`1.0`,所有与 upstream 服务版本兼容的 HTTP 协议请求都会使用 HTTP 1.0 协议进行代理。 **影响:** * 由于请求版本变动,可能导致与 upstream 服务不兼容的请求无法被代理。 * 影响了某些客户端的兼容性,可能无法正常处理与 upstream 服务交互的请求。 **解决方案:** 建议将`proxy_http_version`设置到`1.1`或`1.2`,以便所有请求使用 HTTP 1.1 协议进行代理。 **注意:** * 为了确保所有请求使用相同版本,建议在 upstream 服务配置中设置统一的 HTTP 协议版本。 * 可以根据实际情况选择使用`proxy_http_version 1.1`或`proxy_http_version 1.2`的设置,以平衡性能和兼容性。

正文

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

与nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接相似的内容:

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

# nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题。 替换成openresty后,在本地进行了一个请求,header如下: ```http POST /servlet/j

[转帖]无涯教程: Nginx - HTTP负载平衡介绍

https://www.imooc.com/article/318916 集群代理池 在开始使用Nginx或Nginx Plus负载均衡HTTP流量到一组服务器之前,首先,我们需要使用上游(upstream)指令定义该组。该指令位于http上下文(context)中。 使用server指令配置组中的

[转帖]关于nginx 反向代理upstream中的 keepalive配置

一、关于nginx upstream 在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstre

[转帖]Nginx系列之nginx四层反向代理

https://cloud.tencent.com/developer/article/2013908 上集说到nginx的http七层代理,其实它工作在OSI七层模型的应用层。由于其可以解析http协议,我们可以根据URI进行请求的分发,具有很大的灵活性,但是协议的解析存在性能的消耗。为了能获取更

问题排查:nginx能跑,但是只能跑一会,不能跑多了

# 背景 上周都是查测试环境的问题,比如,我上一篇写的[问题排查:nginx的反向代理感觉失效了一样 ](https://www.cnblogs.com/grey-wolf/p/17655238.html),就是说这个事的。在文章里,最终查到是nginx的全连接队列满了(每个监听端口有个队列,完成三

TCP内核参数的简单验证

前言 春节假期时学习了下内核参数与nginx的调优 最近因为同事遇到问题一直没有解,自己利用晚上时间再次进行验证. 这里将几个参数的理解和验证结果简单总结一下. 希望能够在学习的过程中将问题解决掉. 其实很后悔没有好好学习代码.现在很多问题都已经到了瓶颈期 无法深入的研究下去. 参数一 net.ip

理论+实践,教你如何使用Nginx实现限流

摘要:Nginx作为一款高性能的Web代理和负载均衡服务器,往往会部署在一些互联网应用比较前置的位置。此时,我们就可以在Nginx上进行设置,对访问的IP地址和并发数进行相应的限制。 本文分享自华为云社区《【高并发】使用Nginx实现限流》,作者:冰 河。 Nginx作为一款高性能的Web代理和负载

nginx配置kibana访问用户名和密码认证、及无认证访问配置

转载请注明出处: 在nginx上配置kibana页面访问时,默认是采用kibana的认证,一般直接安装kibana后,是没有用户名和密码认证的。 如果要在负载均衡上配置反向代理和用户认证,可按以下步骤进行配置: 1.安装Nginx: 首先,确保已经安装了Nginx,并且可以正常访问Kibana页面。

[转帖]Nginx之proxy_redirect详解

今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/ 如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了ap

[转帖]Nginx反向代理中使用proxy_redirect重定向url

https://www.cnblogs.com/kevingrace/p/8073646.html 在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对