Node.js https 服务器:无法监听端口 443 - 为什么?

2023-11-23

我第一次在 Node 中创建一个 HTTPS 服务器,代码(见下文)适用于像 6643 这样的随机端口,但在端口 443 上则不起作用。我收到此错误:

[Debug][Server]: Initialized...
[Debug][Control Center]: Application initialized...

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:904:11)
    at Server._listen2 (net.js:1023:19)
    at listen (net.js:1064:10)
    at Server.listen (net.js:1138:5)
    at Object.module.exports.router (/home/ec2-user/Officeball/Versions/officeball_v0.0.5/server/custom_modules/server.js:52:5)
    at Object.<anonymous> (/home/ec2-user/Officeball/Versions/officeball_v0.0.5/server/control_center.js:15:59)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

这是在 Amazon Linux EC2 服务器上。据我了解,一旦我将域的 DNS A 名称记录设置为服务器的 IP,当用户搜索时https://mydomain.com,浏览器将在端口 443 查找我服务器的 IP,该端口被认为是 HTTPS 流量的标准端口。

所以我的理解是我需要通过端口 443 提供 https 内容。

我究竟做错了什么?


这是我的服务器代码:

control_center.js(初始化)

/* Control Center */

//DEFINE GLOBALS

preloaded = {};

//GET DIRECT WORKING PATH

var dirPath = process.cwd();

//REQUIRE CUSTOM MODULES 

var debug = new (require(dirPath + 
        "/custom_modules/debug"))("Control Center");
var socket = require(dirPath + 
        "/custom_modules/socket")(4546);

// ! this is the relevant line
var server = require(dirPath + "/custom_modules/server").router(443);

//APP INITIALIZE

debug.log("Application initialized...");

服务器.js

/* Server */

//REQUIRE NPM MODULES

var fs      = require('fs'), 
    https   = require('https'), 
    url     = require('url'), 
    path    = require('path');

//GET DIRECT WORKING PATH

var dirPath = process.cwd();

//REQUIRE CUSTOM MODULES

//Snip!

var debug = new (require(dirPath + 
        "/custom_modules/debug"))("Server");

//Preload requests

var preload = require(dirPath + 
        '/custom_modules/preload').init();

//INIT MODULE 

debug.log("Initialized...");

//DEFINE MODULE VARIABLES

var options = {
  key: fs.readFileSync('SSL/evisiion_private_key.pem'),
  cert: fs.readFileSync('SSL/evisiion_ssl_cert.pem')
};

//LISTEN FOR PATH REQUESTS

//route requests to server
module.exports.router = function(port) {
    https.createServer(options, function(req, res) {

        //Snip!

    }).listen(port);
};

在 Linux(以及我相信大多数其他类 Unix 操作系统)上,服务必须以 root 身份运行才能绑定到编号小于 1024 的端口。

我刚刚在我手边的 Node 应用程序上验证了它,当我将端口从 5000 更改为 443 时,我看到了完全相同的错误,除了文件路径之外,每一行都相同。

在开发中,大多数人会在编号较高的端口(例如 8080)上运行开发服务器。在生产中,您可能很想使用适当的 Web 服务器(例如 Nginx)来提供静态内容并将其他所有内容反向代理到您的 Node 应用程序,这使得它不再是一个问题,因为 Nginx 可以非常愉快地以 root 身份运行。

编辑:由于您的用例需要提供一些静态内容,因此您可能需要使用 Nginx 或 Apache 等 Web 服务器来处理静态文件,并反向代理到动态内容的另一个端口。使用 Nginx 进行反向代理非常简单 - 这是一个示例配置文件:

server {
    listen 443;
    server_name example.com;
    client_max_body_size 50M;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /static {
        root /var/www/mysite;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

这假设您的 Web 应用程序可在端口 443 上访问,并在端口 8000 上运行。如果位置与 /static 文件夹匹配,则从 /var/www/mysite/static 提供服务。否则,Nginx 将其交给端口 8000 上正在运行的应用程序,该应用程序可能是 Node.js 应用程序,也可能是 Python 应用程序,或者其他什么。

这也很好地解决了您的问题,因为应用程序可以在端口 443 上访问,而无需实际绑定到该端口。

应该说,作为一般经验法则,以 root 身份运行这样的服务并不是一个好主意。您将为可能存在漏洞的应用程序以及您拉入的任何 NPM 模块授予 root 访问权限。例如,将 Nginx 放在后面意味着您不需要以 root 身份运行它,而 Nginx坚固且经过充分测试,并且具有可靠的性能和缓存能力。此外,Nginx 通常在提供静态内容方面速度更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js https 服务器:无法监听端口 443 - 为什么? 的相关文章

随机推荐

  • 如何在Ajax请求中发送当前页码

    我正在使用 jQuery DataTable 在表中显示大量数据 我在 Ajax 请求中获取数据页面 如下所示 var pageNo 1 propertyTable dataTable processing true serverSide
  • 更改 Jenkins 服务器的线程数

    我在我的虚拟服务器上安装了 Jenkins 当我看到 htop Jenkins 运行有 30 个线程时 每个线程被允许分配 247MB 内存和最多 1181MB 虚拟内存 因为我只有一个小型虚拟服务器 所以我尝试更改线程数 但我找不到任何配
  • 在 Django 模型的保存方法中引发验证错误

    我不确定如何在模型的保存方法中正确引发验证错误并向用户发回明确的消息 基本上我想知道 if 的每一部分应该如何结束 我想在哪里引发错误 以及它实际保存的地方 def save self args kwargs if not good eno
  • 验证动态添加的字段

    我在单击按钮时使用 jQuery 添加一个表行 add row click function zeile ArtikelTabelle gt tbody append tr td b zeile 1 b td td td tr
  • 如何使用 PHP 将 HTML 转换为 JSON?

    我可以使用将 JSON 转换为 HTMLJsontoHtml图书馆 现在 我需要将当前的 HTML 转换为 JSON 如本网站所示 当查看代码时 我发现以下脚本
  • 使用 LineProfiler 对 Django 应用程序进行逐行分析

    我想使用 line profiler 来分析我的 django 项目以显示代码性能的分析 我正在关注这些链接 http djangotricks blogspot in 2015 01 performance bottlenecks in
  • 将 uniqueidentifier 参数传递给存储过程

    我正在尝试使用以下代码将 uniqueidentifier 参数传递给存储过程 myCommand Parameters Add BlogID SqlDbType UniqueIdentifier Value 96d5b379 7e1d 4
  • Spring配置类中可以进行构造函数注入吗?

    如果我有一个 Spring 配置类 即用 Configuration 注释的类 我可以使用构造函数注入吗 按照目前的情况 如果我添加一个 我会收到一条无默认构造函数的消息 如果我添加一个默认构造函数 它会使用它而不是重载的构造函数 这并没有
  • Ionic run android 似乎可以工作,但应用程序没有在手机上启动,为什么?

    我的手机已打开并处于调试模式 我已通过以下方式确认了这一点adb devices l 当我运行 ionic run android 时 我得到以下输出 Ionic 声称应用程序已启动 但手机上没有任何反应 我使用的是 Android 4 4
  • 使用 Swift 4.0 编译的模块无法在 Swift 3.2.1 中导入

    Swift 4 0 模块在使用 Xcode 9 0 的 Swift 3 2 应用程序中表现良好 但现在 使用 Xcode 9 1 我得到 使用 Swift 4 0 编译的模块无法在 Swift 3 2 1 中导入 Or 使用 Swift 4
  • 为什么 script.onload 在 Chrome 用户脚本中不起作用?

    我想使用用户脚本在站点中加载另一个脚本文件 但是 js onload事件无法正常工作 用户脚本文件 UserScript name Code highlight description Test include http localhost
  • 从父 iFrame 到子 iFrame 使用 postMessage 发出通信

    我在从父窗口与子 iFrame 进行通信时遇到问题 但在另一边 一切都很完美 以下是我如何获取 chil iFrame 对象以触发发布消息功能 var iFrame document getElementById Frame content
  • 设置 NSTableCellView 的背景颜色

    我试图在 NSTableCellView 上设置背景颜色 但似乎没有办法做到这一点 因此 必须有另一种我不知道的方法来实现这一目标 所以 如果有人能够启发我 我将非常感激 Thanks A NSTableCellView is a NSVi
  • iTunes Connect 添加 iOS 版本进行测试 - 版本显示为灰色?

    该构建已完成处理 但现在被困为 灰色 构建 我以前从未见过这样的事情 这是 iTunes Connect 上的全新问题吗 完全奇怪 使用 Xcode Cloud 的人可以有相同的体验 无法选择构建 要修复它 您需要选择TestFlight
  • 如何列出 scala 子目录中的所有文件?

    是否有一种很好的 scala esque 我想我的意思是功能性 方式来递归列出目录中的文件 匹配特定模式怎么样 例如递归所有匹配的文件 a foo in c temp Scala 代码通常使用 Java 类来处理 I O 包括读取目录 所以
  • Spring-Boot ResourceLocations 未添加 css 文件导致 404

    好吧 我有一个正在运行的 spring boot 应用程序 它在本地计算机上运行得很好 但是我注意到 当我执行 mvn package 时 我的 css 或 java 脚本都没有位于 src main wepapp css 被复制到目标目录
  • DateFormat 解析 - 不返回 UTC 格式的日期

    这是我的 java 代码 尝试在 Android 设备上获取 UTC 的当前日期 public static Date getCurrentDateUTC try TimeZone timeZoneUTC TimeZone getTimeZ
  • 64 位 RC2 的安全性如何?

    在加密中 如果两个对称算法的密钥大小相等 那么它们在安全性方面是否会被认为是相等的 即 64 位 RC2 算法是否提供与 64 位 AES 算法完全相同的安全性 使用 64 位 RC2 算法的安全性 或不安全性 如何 暴力攻击破解这种加密需
  • 带有嵌套路由器出口的 Angular 9 嵌套延迟加载模块

    我正在尝试使用 Angular 9 开发 SPA 我几乎尝试延迟加载每个组件及其所有子组件 当我尝试将路由器出口放在延迟加载的组件之一中并且我希望使用该路由器出口来加载子组件 也是延迟加载的 时 出现了我的问题 当我这样做时 我总是将所有嵌
  • Node.js https 服务器:无法监听端口 443 - 为什么?

    我第一次在 Node 中创建一个 HTTPS 服务器 代码 见下文 适用于像 6643 这样的随机端口 但在端口 443 上则不起作用 我收到此错误 Debug Server Initialized Debug Control Center