我一直试图在端口 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
,但这可能存在安全风险。因此,您的应用应在成功监听后尽快切换到另一个用户(或找到我不知道的其他机制来放弃特权)。
由于这很复杂,一个好的解决方案是
- 您的应用程序监听
loopback
非特权端口上的接口,例如127.0.0.1:10443
- 你设置了一个 Web 服务器来代理来自 的请求
0:443
。127.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