在 nginx 下部署监听两个不同端口的 node js 应用程序

在 nginx 下部署监听两个不同端口的 node js 应用程序

我有一个简单的 node.js 应用程序,它监听两个端口:在 8001 上,它通过执行以下操作设置了一个简单的 Web 服务器

var express = require('express');
var gHttpApp = express();
gHttpApp.use(express.static('public'));
gHttpApp.listen(8080, function () {
    console.log('HTTP Server listening on *:8001');
});

然后,在 8002 上设置 socket.io

var io = require('socket.io')();
gSocket = io.listen(8002);

在 /public 文件夹内的 index.html 中,我通过执行以下操作来请求 socket.io 客户端 js:

<script src="http://localhost:8000/socket.io/socket.io.js"></script>

而其他 js 文件则使用 /public 内的相对路径进行请求。

这个设置在本地开发时有效并且似乎合乎逻辑,但我不知道如何将其部署到运行 Ubuntu 和 nginx 的私人服务器上,因为我无法将同一位置反向代理到 2 个端口......

答案1

您需要一个路由处理程序来提供服务“http://localhost:8000/socket.io/socket.io.js“。

socket.io 库将自动从您安装 socket.io 的端口提供该文件,而不会从任何其他端口提供。因此,对于您的情况,将自动从端口 8082 提供该文件,而不是从 8080 提供该文件。

因此,您可以将脚本标签更改为:

<script src="http://localhost:8002/socket.io/socket.io.js"></script>

仅供参考,您可以将 socket.io 和 Web 服务器放在同一个端口上。无需使用两个单独的端口。socket.io/webSocket 明确设计为在与 Web 服务器相同的端口上工作。这是可行的,因为所有 socket.io/webSocket 连接都是以 HTTP 请求开始的。因此,socket.io 只需拦截第一个 http 请求即可启动 socket.io 连接,然后所有其他请求都由 Web 服务器处理。

相关内容