我有两个独立的 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>
对后面的所有内容。