使用 nginx 代理 sockets.io 的多个实例

使用 nginx 代理 sockets.io 的多个实例

我有两个独立的 node.js 应用程序在 nginx 后面运行。这两个应用程序都使用 socket.io 和 express。一个在端口 5000 上提供服务,另一个在端口 5001 上提供服务。但我们需要它们都通过端口 80 访问,这样当客户端访问时http://example.com/app1它们被转发到第一个应用程序,并且http://example.com/app2第二个应用程序。

当我们只有一个应用程序时,我们在 nginx Sites Enabled 配置文件中进行以下设置:

   location /app1/ {
            proxy_pass http://127.0.0.1:5000/;
    }


    location /socket.io {
            proxy_pass http://127.0.0.1:5000/socket.io/;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_http_version 1.1;
    }

效果很好。但是,现在我们要添加第二个应用程序,我不确定如何设置转发。显然,socket.io 无法再转发到 5000,因为来自 app2 的连接需要通过 5001 进行连接。

当然,一定有一种方法可以将 socket.io 转发指定为每个应用程序的子域,但我不知道那会是什么。

如您能给我提供任何建议我将非常感激。

答案1

我遇到了同样的问题,并找到了这个简单的解决方法:

从 js/html 文件配置客户端 socket.io 以从子目录进行连接(默认的 socket.io 设置将使你的 socket.io 连接路由到http://example.com/socket.io)您可以在这里了解如何操作:从子目录运行 socket.io

因此你需要在你的客户端文件中保存以下信息:

var socket = io.connect('http://example.com', {path: "/app1socket"});

对于其他应用程序:

var socket = io.connect('http://example.com', {path: "/app2socket"});

然后,像以前一样,为 nginx 中的每个应用程序套接字创建路由:

location /app1socket/ {
    proxy_pass http://127.0.0.1:3000/socket.io/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

location /app2socket/ {
    proxy_pass http://127.0.0.1:4000/socket.io/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

假设您的应用程序在 nginx 下运行的原因是将 http 请求代理到本地运行的应用程序,请将您的服务器文件配置保留为标准设置。

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(4000, '127.0.0.1');

现在您可以在 nginx 下创建多个 socket.io 应用程序。

答案2

如果我理解你的问题正确的话,你只需要将每个位置重定向到不同的后端,每个后端监听不同的端口,如下所示:

location /app1/ {
        proxy_pass http://127.0.0.1:5000/;
}

location /app2/ {
        proxy_pass http://127.0.0.1:5001/;
}

注意结尾的/,替换原始 URI。如果您希望将原始/app[12]/URI 转发到后端,请删除该<ip>:<port>对后面的所有内容。

相关内容