gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:43 25 4
gpt4 key购买 nike

我已经解决这个问题几天了。我离得太近了,然后连接似乎就断了,或者找不到 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 在 demo.someserver.com/appOne 的子文件夹中运行,并让 appTwo 在 demo.someserver.com/appTwo 的子文件夹中运行,但两者都有反向代理。

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

我试图避免将任何前端 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 应用程序,则可以通过在客户端上初始化 socket.io 时设置(未记录的)path 选项来执行此操作。

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

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(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);

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应用程序。

关于node.js - 如何为两个都需要 socket.io 的应用程序设置 NGINX 的端口 80 的反向代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32113316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com