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

dar*_*ley 1 sockets reverse-proxy nginx node.js 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/;
}
Run Code Online (Sandbox Code Playgroud)

所以我在这里要做的是让appOne在demo.someserver.com/appOne的子文件夹中运行,让appTwo在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/;
}
Run Code Online (Sandbox Code Playgroud)

但我不知道这究竟是如何运作的.任何指针或任何人试图做同样的事情?

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

Ole*_*leg 5

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

为了保持一致,我将为您提供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
}
Run Code Online (Sandbox Code Playgroud)

app1.js app2.js(Express + 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);
Run Code Online (Sandbox Code Playgroud)

index1.html index2.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>
Run Code Online (Sandbox Code Playgroud)

所以,如果你启动这两个app1.jsapp2.js并导航到

http://demo.someserver.com/appOne
Run Code Online (Sandbox Code Playgroud)

然后

http://demo.someserver.com/appTwo
Run Code Online (Sandbox Code Playgroud)

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