NGINX自从1.3版本就开始支持WebSocket了,并且可以为WebSocket应用程序做反向代理和负载均衡。

WebSocket 和HTTP协议不同,但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到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的头信息必须被显式的设置。

(据说nginx代理的方法建立连接慢,效果没有直接对外网映射效果好)

修改nginx配置文件:nginx.conf

在http配置里添加

http {

    map $http_upgrade $connection_upgrade {

        default upgrade;

        ''      close;

    }

   

方案1:单主机或者多域名

    server {

     listen       3333; 

     server_name abc.xyz.com;

        location / {

        proxy_pass [http://localhost:5555](http://localhost:5555);   

     proxy_set_header Host $host;

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

     proxy_http_version 1.1;

     proxy_set_header Upgrade $http_upgrade;

     proxy_set_header Connection "upgrade";

        }

    }

 

方案2:轮询

upstream websocket1 {

    server 192.168.100.10:8010;

    server 192.168.100.10:8011;

}

   server {

     listen       3333;

     server_name abc.haiziwang.com;

        location / {

         proxy_pass http://websocket1;

     proxy_set_header Host $host;

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

     proxy_http_version 1.1;

     proxy_set_header Upgrade $http_upgrade;

     proxy_set_header Connection "upgrade";

        }

    }

}

 

方案3:分开-多目录名

upstream websocket1 {

    server 192.168.100.10:8010;

}

upstream websocket2 {

    server 192.168.100.10:8888;

}

   server {

     listen       3333;

     server_name abc.haiziwang.com;

        location /8010/ {

            proxy_pass http://websocket1;

     proxy_set_header Host $host;

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

     proxy_http_version 1.1;

     proxy_set_header Upgrade $http_upgrade;

     proxy_set_header Connection "upgrade";

        }

    location /8888/ {

            proxy_pass http://websocket2;

     proxy_set_header Host $host;

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

     proxy_http_version 1.1;

     proxy_set_header Upgrade $http_upgrade;

     proxy_set_header Connection "upgrade";

        }

    }