Nginx负载均衡器的WebSocket问题

3

我对NGINX和WebSocket系统还很陌生,但根据我的项目需求,我需要检查一些复杂的事情才能完成。

我正在尝试创建一个使用NGINX的例子,它可以使用同一URL(负载均衡器URL)处理我的WebSocket(端口:1234)和HTTP请求(端口:80)。

我使用了三个NGINX服务器,其中一个作为负载均衡器(10.0.0.163),另外两个是我的应用服务器,我在这里安装了我的真实API,分别是10.0.0.152和10.0.0.154。现在,我已经在我的应用服务器上配置了WebSocket。

根据上述配置,我的所有请求将通过10.0.0.163(负载均衡器)传递,并且它的代理设置将将请求(HTTP / WebSocket)传递到我的应用服务器(10.0.0.152/154)。

注意:每个应用服务器都包含单独的Nginx、php和websocket。

以下是10.0.0.154服务器的默认文件(位置:/etc/nginx/sites-available/),它可以在同一个域上处理WebSocket和HTTP请求。

server{
    listen 80;
        charset UTF-8;
        root /var/www;
        index index.html index.htm index.php
        server_name localhost 10.0.0.154 ;
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
    location / {
            try_files $uri $uri/ @proxy;    autoindex on;
    }
    location @proxy{
        proxy_pass http://wb1;
    }
    location =/ {
                proxy_pass http://wb;       
                proxy_http_version 1.1;
                proxy_buffers 8 16k;
                proxy_buffer_size 32k;
                proxy_set_header Upgrade $http_upgrade; 
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Referer                 $http_referer;
        proxy_redirect off;

        }

}

以下是负载均衡器默认文件(位置:/etc/nginx/sites-available/)针对 10.0.0.163。

upstream wb{
    server 10.0.0.154;
    server 10.0.0.152;
}

server{
    listen 80;
        charset UTF-8;
        root /var/www;
        index index.html index.htm index.php
        server_name 10.0.0.163 ;

    location / {
            try_files $uri $uri/ @proxy;    autoindex on;
    }
    location @proxy{
        proxy_pass http://wb;
    }
    location =/ {
                proxy_pass http://wb;       
                proxy_http_version 1.1;
                proxy_buffers 8 16k;
                proxy_buffer_size 32k;
                proxy_set_header Upgrade $http_upgrade; 
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Referer                 $http_referer;
        proxy_redirect off;

        }

}

我发现负载均衡器对HTTP请求正常工作,但无法将我的WebSocket请求转发到应用服务器。我不知道我漏了什么..如果你们能帮我解决这个问题,我会非常感激。

你使用的nginx版本是什么? - VBart
@VBart 我正在使用 nginx-1.4.1 版本。 - Rizvan
@VBart -- 调试代码后,我得到了连接建立的信息,但在30秒后就断开了。我收到了“对等方未响应”的错误提示。 - Rizvan
看起来你还没有配置超时时间:proxy_read_timeoutproxy_write_timeout。错误日志里有什么信息? - VBart
@VBart -- 感谢您的回复。我们尝试了proxy_read_timeout,但它没有起作用。用户向LB(负载均衡器)服务器发送websocket连接。LB将数据发送到应用程序服务器以进行node.js(websocket)程序处理。Websocket也进行了握手,但无法通过LB向用户发送帧。 - Rizvan
@VBart --(更新)感谢您的回复。我们尝试了proxy_read_timeout,但它没有起作用。用户将websocket连接发送到LB(负载均衡器)服务器。 LB(Nginx)将数据发送到应用程序服务器(Nginx)以进行node.js(websocket)程序。 Websocket也进行了握手,但无法通过LB向用户发送帧。如果我们删除LB,则可以正常工作。 - Rizvan
1个回答

1
我看到你的配置看起来正确。我认为你应该检查你的负载均衡器和应用服务器的配置或版本。这可能是不兼容的问题。

1
你说得对,@sanjay... 我检查了LB和应用程序的两个版本,我解决了这个问题。 - Rizvan
@Rizvan,有什么解决方案吗? - sadfuzzy
负载均衡器nginx和应用程序nginx版本不匹配。 - Rizvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接