【问题标题】:Error: listen EACCES 0.0.0.0:443错误:听 EACCES 0.0.0.0:443
【发布时间】:2018-05-01 06:23:27
【问题描述】:

我正在尝试在我的 MacOS 上通过 NodeJS 运行一个 Web 项目。

npm install 之后,npm start 返回错误

events.js:183
  throw er; // Unhandled 'error' event
  ^

Error: listen EACCES 0.0.0.0:443
    at Object._errnoException (util.js:1024:11)
    at _exceptionWithHostPort (util.js:1046:20)
    at Server.setupListenHandle [as _listen2] (net.js:1334:19)
    at listenInCluster (net.js:1392:12)
    at Server.listen (net.js:1476:7)
    at Object.<anonymous> (/Users/softtimur/Startup/PRODSERVER/tmp/WeCard/models/www:36:8)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

我的 Mac 上没有运行其他网站。

有谁知道怎么回事?我需要在我的 Mac 上配置一些东西吗?

编辑 1:

sudo npm start 返回

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::443
    at Object._errnoException (util.js:1024:11)
    at _exceptionWithHostPort (util.js:1046:20)
    at Server.setupListenHandle [as _listen2] (net.js:1351:14)
    at listenInCluster (net.js:1392:12)
    at Server.listen (net.js:1476:7)
    at Object.<anonymous> (/Users/softtimur/Startup/PRODSERVER/tmp/WeCard/models/www:36:8)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

【问题讨论】:

标签: node.js express


【解决方案1】:

为了侦听特权端口,您需要 root 权限才能启动服务器;这适用于端口

有关在生产环境中使用 nginx 设置 Node JS 应用程序的更多信息,请点击以下链接: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7

【讨论】:

  • 请看我的更新。但我有其他应用程序在 443 上运行。
  • 那么你必须选择另一个端口。或者如果应用程序是静态网页或网站,那么您可以切换到 nginx 并为两个应用程序创建多个 vhost 配置以在 443 上运行但使用不同的域名。注意:Nginx 因为它只能用作反向代理服务器。
【解决方案2】:

在类 UNIX 系统中,非 root 用户无法绑定到低于 1024 的端口。

在端口 80 上代理地址时,这很麻烦。通常,您最终会 sudo 处理所有必须绑定到此类端口的应用程序。

但是,从内核 2.6.24 开始,您可以使用 setcap 命令为程序设置特定功能。

要使所有节点程序能够绑定到低于 1024 的任何端口,请发出以下命令:

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/node

注意:如果您不知道node 的位置,请按照以下命令操作。

sudo setcap 'cap_net_bind_service=+ep' `which node`

【讨论】:

【解决方案3】:

我认为您可能希望为您的应用程序提供 HTTPS,如果是这种情况,那么通常对于 nodejs,我们不会直接从我们的节点应用程序使用 HTTPS。相反,我们使用 nginx(一个 Web 服务器)充当“反向代理”。这意味着 nginx 位于我们的应用程序前面,它为我们侦听端口 443,然后将请求发送到我们想要的应用程序。

使用 nginx,您可以侦听端口 443,然后根据主机名等重定向到多个不同的服务。例如,我可能在一台服务器上运行 3 个 Web 服务,使用 nginx,我可以在端口 443 上侦听任何 HTTP 连接.如果 HTTP 请求发送到主机 myblog.com,它可以将其发送到侦听端口 8081 的节点服务。如果请求上的主机名是 myresume.com,它可能会发送到端口 8082 和 myprivatethings.com 上的服务可以去8083端口。

使用 nginx 之类的东西(存在许多替代方案),您可以在一台服务器上使用 SSL/TLS (https) 管理多个服务。

【讨论】:

    【解决方案4】:

    最重要的是,不要以 root 身份运行。这是要求“它”。不要以 root 身份运行您的节点 Web 项目。

    改为使用PM2authbind 来执行此操作:

    // %user% is whatever user is running your code
    sudo touch /etc/authbind/byport/443
    sudo chown %user% /etc/authbind/byport/443
    sudo chmod 755 /etc/authbind/byport/443
    

    接下来,将此别名添加到您的 ~/.bashrc~/.bash_profile

    alias pm2='authbind --deep pm2'
    

    然后,用 pm2 试试吧:

    pm2 start app.js
    

    【讨论】:

    • 请注意,%user% 是一个占位符,代表完全拥有所有应用程序文件的用户。
    • 是的,我用正确的用户名替换了它。我仍然收到 EACCESS 错误。
    • @Jim - 有关 PM2 和 authbind 的更多信息在这里:pm2.keymetrics.io/docs/usage/specifics 我不理解对此的垃圾邮件投反对票,因为这是许多 nodejs 项目生产中的标准做法。
    • 如果别名不适合你,你可以使用解释器和解释器参数: pm2 start app.js --interpreter="authbind" --interpreter-args="node" (你可以还将它包含在生态系统.config.js 文件中,以节省您在 cli 中添加它的需要)
    猜你喜欢
    • 2021-10-30
    • 2017-08-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2018-04-24
    • 2020-06-07
    相关资源
    最近更新 更多