通过Nginx代理NodeJS支持Websocket
{{moment(1484885142000).format('MMM DD, YYYY, h:mm')}}
Nginx
Nginx
NodeJS
Websocket
NGINX自从1.3版本就开始支持WebSocket了,并且可以为WebSocket应用程序做反向代理和负载均衡。
WebSocket 和HTTP协议不同,但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的基础设施。例如,WebSocket可以使用标准的HTTP端口 80 和 443,因此,现存的防火墙规则也同样适用。
一个WebSockets的应用程序会在客户端和服务端保持一个长时间工作的连接。用来将连接从HTTP升级到WebSocket的HTTP升级机制使用HTTP的Upgrade和Connection协议头。反向代理服务器在支持WebSocket方面面临着一些挑战。一项挑战是WebSocket是一个hop-by-hop协议,所以,当代理服务器拦截到一个客户端发来的Upgrade请求时,它(指服务器)需要将它自己的Upgrade请求发送给后端服务器,也包括合适的请求头。此外,由于WebSocket连接是长时间保持的,所以代理服务器需要允许这些连接处于打开状态,而不是像对待HTTP使用的短连接那样将其关闭。
NGINX 通过在客户端和后端服务器之间建立起一条隧道来支持WebSocket。为了使NGINX可以将来自客户端的Upgrade请求发送给后端服务器,Upgrade和Connection的头信息必须被显式的设置。如下所示:
1 2
| proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
|
完整配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| upstream wsbackend { server 127.0.0.1:3000;#nodejs启动的本地端口 keepalive 8; } server { listen 80; server_name xxx.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/xxx.com; location / { proxy_pass http://wsbackend; #这两个HTTP头是因为采用了nginx作为代理后,后端可以通过 X-real-ip 或 X-Forwarded-For取得用户IP地址 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;# 声明支持websocket proxy_set_header Connection "upgrade";# 声明支持websocket proxy_redirect off; } }
|