前言

最近在研究和学习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升级机制使用UpgradeConnection头。反向代理服务器在支持WebSocket时面临一些挑战。一个是WebSocket是一个逐跳协议,因此当代理服务器拦截客户端的升级请求时,需要向后端服务器发送自己的升级请求,包括相应的头文件。此外,由于WebSocket连接长期存在,与HTTP使用的典型短期连接相反,反向代理需要允许这些连接保持打开状态,而不是关闭它们,因为它们似乎处于空闲状态。

允许在客户机和后端服务器之间建立隧道,NGINX支持WebSocket。对于NGINX将升级请求从客户端发送到后台服务器,必须明确设置UpgradeConnection标题。

具体配置如下:

location /xxxx/ { 
  proxy_pass http://xxxxx; 
  proxy_http_version 1.1; 
  proxy_set_header Upgrade $http_upgrade; 
  proxy_set_header Connection “upgrade”; 
}