WebSocket NGINX / NODEJS粘性问题

时间:2014-06-02 15:32:36

标签: node.js nginx websocket

我正在编写Web套接字项目,一切都像预期的那样(本地),我使用:

  1. NGINX作为WebSockets代理
  2. NODEJS作为后端服务器
  3. WS as websocket module:ws
  4. NGINX配置:

    map $http_upgrade $connection_upgrade {
         default upgrade;
         ''      close;
    }
    upstream backend_cluster {
        server 127.0.0.1:5050;
    }
    
    # Only retry if there was a communication error, not a timeout.
    proxy_next_upstream error;
    server {
        access_log /code/logs/access.log;
        error_log /code/logs/error.log  info;
        listen    80;
        listen    443 ssl;
        server_name  mydomain;
        root html;
    
        ssl_certificate         /code/certs/sslCert.crt;
        ssl_certificate_key     /code/certs/sslKey.key;
        ssl_protocols           SSLv3 TLSv1 TLSv1.1 TLSv1.2; # basically same as apache [all -SSLv2]
        ssl_ciphers             HIGH:MEDIUM:!aNULL:!MD5;
    
        location /websocket/ws {
        proxy_pass http://backend_cluster;
        proxy_http_version 1.1;
        proxy_redirect off ;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        }
    }    
    

    就像我提到的那样,在本地和在开发环境中的一台机器上工作得很好,我担心的问题是当我们去生产时,在生产环境中将有更多的那个nodejs服务器。 在生产中,nginx的配置将类似于:

    upstream backend_cluster {
        server domain1:5050;
        server domain2:5050;
    }
    

    所以我不知道NGINX如何解决粘性问题,这意味着我知道在一台服务器上完成'HANDSHAKE /升级'之后,如何知道继续使用同一台服务器,是否有告诉NGINX坚持使用同一台服务器的方法吗?

    我希望我能清楚自己。 先谢谢

2 个答案:

答案 0 :(得分:1)

使用此配置:

upstream backend_cluster {
    ip_hash;                    
    server domain1:5050;
    server domain2:5050;
}

答案 1 :(得分:0)

clody69的答案非常标准。但是我更喜欢使用以下配置,原因有两个:

  1. 如果需要,从同一公共IP连接的用户应连接到2个不同的服务器。 ip_hash为每个公共IP强制执行1个服务器。
  2. 如果用户1正在最大化服务器1的性能,我希望他/她能够在他/她打开另一个选项卡时顺利使用该应用程序。 ip_hash不允许这样做。
  3. 
        upstream backend_cluster {
            hash $content_type;                    
            server domain1:5050;
            server domain2:5050;
        }