为节点 Web 应用打开端口 443

为节点 Web 应用打开端口 443

我一直试图在端口 443 上运行节点 Web 应用程序,但收到此输出错误:监听 EACCES 0.0.0.0:443

已经尝试 ufw 允许 443/tcp,但 nmap 仍然没有显示 443 作为开放端口。

还尝试了 sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT,但没有成功。

任何帮助都将受到感谢。

答案1

谢谢@exore,我解决了这个问题

sudo setcap 'cap_net_bind_service=+ep' $(readlink -f $(which node))

我认为问题出在手动安装 node.js。它是 Ubuntu 最新版本的默认安装,但我不知道这一点,所以我通过终端再次安装了它。

您可以在此处查看整个讨论。

https://gist.github.com/firstdoit/6389682

问候,

答案2

EACCES 表示禁止监听端口 443。这是因为您没有以 的身份运行应用程序root。1024 以下的端口是保留端口,只有root它们可以使用。

尝试更改防火墙规则不会有任何效果,因为防火墙会让数据包通过或阻止数据包。它们不允许有人监听任何特定端口。

解决方案:使用 运行代码sudo,但这可能存在安全风险。因此,您的应用应在成功监听后尽快切换到另一个用户(或找到我不知道的其他机制来放弃特权)。

由于这很复杂,一个好的解决方案是

  1. 您的应用程序监听loopback非特权端口上的接口,例如127.0.0.1:10443
  2. 你设置了一个 Web 服务器来代理来自 的请求0:443127.0.0.1:10443我想到的是 nginx,但许多其他服务器也可用于此任务。只需选择你最喜欢的一个即可。

如果您希望在端口 443 上使用 SSL(通常情况如此),您还应该设置证书(创建一个自签名证书或购买一个,或者更好的是,从 let's encrypt 获取免费证书)、配置协议、可用密码等...这也很复杂。

需要改进且可以工作的最小 nginx 配置文件示例(现在无法测试):

server {
    server_name  me.example.com;
    listen 0.0.0.0:443 ssl;
    ssl_certificate     /etc/mycerts/fullchain.pem;
    ssl_certificate_key /etc/mycerts/privkey.pem;
    ssl_session_timeout 30m;
    ssl_session_cache   shared:SSL:400k;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    server_tokens off;
    charset utf-8;
    location / {
            proxy_pass         http://127.0.0.1:10443/;
    }
}

答案3

只需使用 sudo npm run start:dev :D

相关内容