【问题标题】:What is best practice node.js recommended port in production environment?生产环境中的最佳实践 node.js 推荐端口是什么?
【发布时间】:2019-04-01 01:11:31
【问题描述】:

我在 node.js 中使用端口 4000 创建了一个聊天应用程序。一切正常,但是当我在生产中推出它时,我发现许多公司网络阻止了传出端口 4000。我考虑使用其他端口更有可能在公司网络上打开,但随后发现此端口列表被 chrome 浏览器阻止:

https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome

使用 995 等端口会导致“ERR_UNSAFE_PORT”的 chrome 错误

所以对于 node.js 服务器,似乎只允许使用 80 和 443 端口?在生产环境中为您的 node.js 应用程序选择端口的推荐最佳做法是什么?

我的网络服务器已经使用端口 80 和 443 进行典型的 apache 网络服务。我需要为 node.js 创建一个专用服务器吗?

我正在使用以下代码来启动从浏览器到 node.js 服务器的连接:

var socket = io.connect('https://duplex.example.com:4000');

这是服务器端的代码:

const https = require('https');
const fs = require('fs');
var express = require('express')
  , bodyParser = require('body-parser');
var socket = require('socket.io');
var adminid = '';
var clientlist = new Array();
var port = 4000;

const options = {
    cert: fs.readFileSync('./fullchain.pem'),
    key: fs.readFileSync('./privkey.pem')
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

【问题讨论】:

  • 为什么不直接使用 80 端口?
  • 我的网络服务器已经在使用端口 80 和 443 进行典型的 apache 网络服务。
  • 该列表之外的任何 1024 或更高端口都应该是安全的,但如果用户试图从敌对环境访问您的站点,您必须通过实验找出哪些端口未过滤。
  • 您确实想使用端口 80/443 以获得最佳互操作性。您可以使用代理将常规 Web 请求定向到您的 Web 服务器,并将 socket.io 连接请求定向到您的 socket.io 服务器,方法是在您想要的任何本地端口上运行它并配置代理以将 socket.io 请求转发到您的本地港口。 webSockets(它是 socket.io 的传输)被设计为与 Web 流量共存,因此您可以在同一端口上运行两者,甚至可以将两者运行到同一服务器,然后只需一个代理来识别哪个是哪个并引导他们到正确的代码。

标签: node.js google-chrome port


【解决方案1】:

443 和 80 分别是 https 和 HTTP 流量的主要端口。

其他端口可用于 WebSocket,但这听起来不像您的用例。

我过去所做的是使用反向代理来区分传入的 URL,并在我的机器内部映射端口,而客户端不需要知道。

如果您使用任何类型的 linux 发行版,NGINX 通常是最简单的选择。

这是一篇关于如何使用 nginx 为节点应用设置反向代理的博客。

http://thejonarnold.com/configure-sails-js-with-subdomains-on-ubuntu/

文章引用了sailsjs,但没有具体的技术框架。

【讨论】:

  • 谢谢。我相信我正在使用 WebSockets,我已经用代码示例编辑了我的原始帖子。
【解决方案2】:

大多数人不会将他们的 Node.js 服务器直接暴露在互联网上,而是使用 Apache 或 Nginx 作为前端代理。

  1. 让您的服务器仅绑定到localhost(或使用防火墙规则仅允许传入的 80 和 443。

    server.listen('localhost', 4000)
    
  2. 配置您的反向代理。我正在使用Caddy:

    example.com {
        root /var/www/example.com
        # et cetera
    }
    duplex.example.com {
        proxy / localhost:4000 {
            websocket
        }
    }
    

    代理 websocket 时,您需要确保 ConnectionUpgrade 标头不会丢失,我在这里使用 Caddy 的快捷方式完成了这一点。

    您也可以使用与主站点相同的域,并且只代理某个路径。

  3. 让客户端 socket.io 连接到wss://duplex.example.com(在端口 443 上)。 (我不熟悉 socket.io 来说明它为什么使用 HTTPS URL 而不是 WSS,但我假设您可以使用它。)

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2011-07-14
    相关资源
    最近更新 更多