使用Nginx作为Websocket代理

使用代理服务器主要是解决两个问题:1.多个websocket服务器的负载均衡。2.解决浏览器端跨域的问题。

浏览器端跨域

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

多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  

你的欣赏是我最大的动力

Yanxiong Huang

My name is Yanxiong Huang. graduated from Nanyang middle school.Love Linux,familiar with Node.js,Docker,Serverless... and more Web technology.Contact Me:QQ 31356617;Email:huangaynxiong2013@gmail.com

guangzhou,china http://www.myfreax.com

乐在分享