nginx 反向代理 (websocket)后报 - 400 bad request
2024-10-21 09:55:56
nginx的反向代理。 nginx.conf中的配置如下:
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://web18;
}
当客户端发送GET请求时,程序一切安好,当POST时,ok,返回400 Bad Request,百思不得其解。检查了参数和后端返回内容,一切正常。然后把目标看向了header
proxy_set_header Connection "upgrade"; 对,就是这一行,删除之后程序恢复。
那么这一行什么意思呢,继续剖析,前往nginx官网 http://nginx.org/en/docs/http/websocket.html
添加这一行使原本的http1.1请求升级成为websocket,websocket是什么?
Websocket是html5提出的一个协议规范,参考rfc6455。
websocket约定了一个通信的规范,通过一个握手的机制,客户端(浏览器)和服务器(webserver)之间能建立一个类似tcp的连接,从而方便c-s之间的通信。在websocket出现之前,web交互一般是基于http协议的短连接或者长连接。
WebSocket是为解决客户端与服务端实时通信而产生的技术。websocket协议本质上是一个基于tcp的协议,是先通过HTTP/HTTPS协议发起一条特殊的http请求进行握手后创建一个用于交换数据的TCP连接,此后服务端与客户端通过此TCP连接
进行实时通信。
以前webserver实现推送技术或者即时通讯,用的都是轮询(polling),在特定的时间间隔(比如1秒钟)由浏览器自动发出请求,将服务器的消息主动的拉回来,在这种情况下,我们需要不断的向服务器发送请求,然而HTTPrequest的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源。而最比较新的技术去做轮询的效果是Comet – 用了AJAX。
但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。WebSocketAPI最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。浏览器和服务器只需要要做一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。此外,服务器与客户端之间交换的标头信息很小。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;
但是这里客户端过来握手的协议proxy_set_header Upgrade $http_upgrade; 空的,造成了badrequest的产生。
最新文章
- jQuery和JS原生方法对比
- [原创]flexslider 中文文档 使用教程 参数手册
- 游戏BI,起步了。
- 在Swift中的ASCII到字符转换的问题
- innodb_io_capacity >;=innodb_lru_scan_depth*inoodb_buffer_pool_instances。与 checkpoint
- HTML5全球普及加速:有望终结iOS与安卓界限【转】
- [转]javascript js cookie的存储,获取和删除
- Memo打印
- poj 2983Is the Information Reliable?
- LPC1768的USB使用-枚举过程
- python 之分发包
- mybatis枚举映射成tinyint
- 模拟退火算法实例(c++ 与 c# 实现)
- 【调试工具】tcpdump
- ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务
- k8s重要概念及部署k8s集群(一)--技术流ken
- Jmeter响应数据中文乱码
- c# thread数线程的创建
- Event Loop
- CodeForce edu round 53 Div 2. D:Berland Fair
热门文章
- imax6开发版_挂载NFS文件系统
- 一个javaweb的项目的思路
- python-最近面试遇到的代码题,mark一下
- ctfshow-web入门-SSTI学习
- 李超树学习笔记 &; JZOJ 5039. 【NOI2017模拟4.2】查询题解
- 题解 P1627 [CQOI2009] 中位数
- 跳板攻击之: MSF 添加路由方式渗透内网
- 在 CentOS7 部署 ELK8.0.1
- rlwrap解决opengauss,pg,oracle上下左右及回退乱码
- mysql常用命令汇总