我如何为两个都需要 socket.io 的应用程序设置带有端口 80 的反向代理的 NGINX?

How do I setup NGINX with a reverse proxy to port 80 for two apps that both need socket.io?

几天来我一直在研究这个问题。我靠得太近了,然后似乎连接中断了或找不到 socket.io。但也许我做错了?

我的 NGINX 文件看起来像这样:

upstream appOne {
    server demo.someserver.com:1111;
}

upstream appTwo {
    server demo.someserver.com:2222;
}

location /appOne/ {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://appOne/;
}
location /appTwo/ {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://appTwo/;
}

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

所以我在这里要做的是将 appOne 运行ning 放在 demo.someserver.com/appOne 的子文件夹中,并将 appTwo 运行ning 放在子文件夹中在 demo.someserver.com/appTwo 但两者都有反向代理。

除了两个应用都需要 socket.io 到 运行 之外,所有连接都很好,而且实际上不需要相互连接(尽管我开始认为这不是个坏主意).但目前他们都连接到 appOne/socket.io/socket.io.js 因为最后一个 NGINX 位置。这会导致连接时出现各种问题,例如套接字连接不在同一端口等。

我要避免的是将任何前端 JS 文件中的端口和应用名称命名为 appOne 和 appTwo,在此上下文中可以是 clientOne 和 clientTwo。

我确实想到了这样的事情:

if ($request_uri == 'appOne') {
    proxy_pass http://appOne/socket.io/;
}
if ($request_uri == 'appTwo') {
    proxy_pass http://appTwo/socket.io/;
}

但我不知道这到底是怎么回事。任何指示或有人试图做同样的事情吗?

所以我的问题是 - 如何通过反向代理与 socket.io 建立单独的连接。或者我应该有一个 socket.io 连接并且都连接到那个? (但我可以在一台服务器上有多个客户端)

您可以在脚本中将自定义路径设置为 socket.io

Sets the path v under which engine.io and the static files will be served. Defaults to /socket.io.

If no arguments are supplied this method returns the current value.

来源:http://socket.io/docs/server-api/#server#path%28v:string%29:server

如果您需要两个单独的 socket.io 应用程序,您可以通过在客户端初始化 socket.io 时设置(未记录的)path 选项来执行此操作。

为了保持一致,我将为您提供 Nginx 配置和节点文件的完整工作示例:

nginx 配置:

upstream appOne {
    server demo.someserver.com:1111;
}

upstream appTwo {
    server demo.someserver.com:2222;
}

server {
    listen          80;
    server_name     demo.someserver.com;
    root            /path/to/working/dir; #probably not necessary

    location /appOne/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://appOne/;
    }
    location /appTwo/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://appTwo/;
    }
    # no need for /socket.io location
    # each app will connect socket.io via /appOne/socket.io or /appTwo/socket.io
}

app1.jsapp2.js(表达+Socket.io例子):

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

var port = 1111; //or 2222 for app2.js

app.get('*', function(req, res) {
    res.sendFile(__dirname + '/index1.html');  //or index2.html for app2.js
});

io.on('connection', function(socket) {
    socket.emit('hello', {port: port});
});

server.listen(port);

index1.htmlindex2.html:

<!DOCTYPE html>
<html>
<head>
<script src="/appOne/socket.io/socket.io.js"></script>
<!--<script src="/appTwo/socket.io/socket.io.js"></script>-->
<script>
var socket = io('/', {path: '/appOne/socket.io'});
//var socket = io('/', {path: '/appTwo/socket.io'});
socket.on('hello', function(data) {
    console.log(data.port);
});
</script>
</head>
<body>

<h1>app</h1>

</body>
</html>

因此,如果您同时启动 app1.jsapp2.js 并导航到

http://demo.someserver.com/appOne

然后

http://demo.someserver.com/appTwo

您将在您的控制台中分别看到 11112222,这意味着您有两个独立的 socket.io 应用程序。