Nginx 反向代理 websocket教程
前言
最近在研究和学习socket.io
,并自己实现了一个在线的聊天室,但是当部署在自己的服务器上,使用Nginx配置反向代理的时候,前端页面访问却会报错,说是failed: Error during WebSocket handshake: Unexpected response code: 400
,自己在本地和局域网运行的时候明明是好的呀,这是为什么呢?于是上网找了很久,终于找到了答案,就是Nginx配置websocket的反向代理时还需要做额外的设置。
配置
WebSocket协议与HTTP协议不同,但WebSocket握手与HTTP兼容,使用HTTP升级工具将连接从HTTP升级到WebSocket。这允许WebSocket应用程序更容易地适应现有的基础架构。
WebSocket应用程序可以在客户端和服务器之间保持长时间运行的连接,从而有助于开发实时应用程序。用于将连接从HTTP升级到WebSocket的HTTP升级机制使用Upgrade
和Connection
头。反向代理服务器在支持WebSocket时面临一些挑战。一个是WebSocket是一个逐跳协议,因此当代理服务器拦截客户端的升级请求时,需要向后端服务器发送自己的升级请求,包括相应的头文件。此外,由于WebSocket连接长期存在,与HTTP使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。
允许在客户机和后端服务器之间建立隧道,NGINX支持WebSocket。对于NGINX将升级请求从客户端发送到后台服务器,必须明确设置Upgrade
和Connection
标题。
具体配置如下:
location /xxxx/ {
proxy_pass http://xxxxx;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
}