myfreax

如何配置Nginx作为Websocket代理服务器负载均衡

WebSocket协议与HTTP协议是不一样的,但是WebSocket的握手兼容HTTP协议的方式,使用Proxy指令的HTTP Upgrade参数的让HTTP协议升级到WebSocket协议,在本教程中将说明如何配置Nginx作为Websocket代理服务器,即Nginx的Socket负载均衡

2 min read
By myfreax
如何配置Nginx作为Websocket代理服务器负载均衡

众所周知浏览器有个同源策略的机制,因此在Webscoeket,Ajax,Fetch在对不同的域发起请求时都会被限制,WebSocket协议与HTTP协议是不一样的,但是WebSocket的握手兼容HTTP协议的方式,使用Proxy指令的HTTP Upgrade参数的让HTTP协议升级到WebSocket协议,这样WebSocket就可以嵌入已有的基础设施,比如,和标准的HTTP协议共同使用80与443端口

在本教程中将说明如何配置Nginx作为Websocket代理服务器,即Nginx的Socket负载均衡。

多Websocket服务器高可用与性能

可以在中间在加入一个代理服务器Nginx,HAProxy,下面是使用Nginx的upstream指令

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream websocket {
        server 192.168.100.10:8010;
    }

    server {
        listen 8020;
        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

HTTP协议与Websocket协议切换

浏览器端发起一个带有Upgrade,Connection Header的HTTP请求到Websocket服务器。之后服务器将会响应状态码为101切换到Websocket协议

browser request to server

Accept-Language:en-US,en;q=0.8
Connection:Upgrade
Origin:http://127.0.0.1
Upgrade:websocket

HTTP/1.1 101 Switching Protocols handshake

Connection:upgrade
Sec-WebSocket-Location:ws://jwebsocket.org/jWebSocket/jWebSocket
Sec-WebSocket-Origin:http://127.0.0.1
Server:nginx/1.6.2
Upgrade:websocket
ws