WebSocket NGINX/NODEJS 粘性问题

Posted

技术标签:

【中文标题】WebSocket NGINX/NODEJS 粘性问题【英文标题】:WebSocket NGINX/NODEJS stickiness Issue 【发布时间】:2014-06-02 15:32:36 【问题描述】:

我正在编写 web socket 项目,一切正常(本地),我正在使用:

    nginx 作为 WebSockets 代理 NODEJS 作为后端服务器 WS 作为 websocket 模块:ws

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 如何解决粘性问题,这意味着我如何知道在一台服务器上完成“握手/升级”之后,它如何知道继续使用同一台服务器,是否存在如何告诉 NGINX 坚持使用同一台服务器?

我希望我能说清楚。 提前致谢

【问题讨论】:

【参考方案1】:

使用此配置:

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

【讨论】:

【参考方案2】:

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

    如果需要,从同一个公共 IP 连接的用户应该连接到 2 个不同的服务器。 ip_hash 强制每个公共 IP 使用 1 个服务器。 如果用户 1 正在最大化服务器 1 的性能,我希望他/她在打开另一个选项卡时能够顺利使用该应用程序。 ip_hash 不允许这样做。
上游后端集群 哈希 $content_type; 服务器域1:5050; 服务器域2:5050;

【讨论】:

以上是关于WebSocket NGINX/NODEJS 粘性问题的主要内容,如果未能解决你的问题,请参考以下文章

使用粘性会话和 websocket 进行扩展

用于 websocket 应用程序的 nginx-ingress 粘性会话

Websocket应用程序的nginx-ingress粘性会话

使用 TCP 负载均衡器代理 WebSockets 而没有粘性会话

无法启动连接:错误:WebSocket 连接失败

Node.js http-proxy 丢弃 websocket 请求