为节点 Web 应用程序打开端口 443

kik*_*x78 4 webapp-development nodejs

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

已经尝试过 ufw allow 443/tcp 但 nmap 仍然没有将 443 显示为开放端口。

也试过 sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT 没有成功。

任何帮助将不胜感激。

kik*_*x78 5

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

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

我相信问题是手动安装 node.js。它是 Ubuntu 上一个版本的默认设置,但我不知道这一点,我通过终端再次安装了它。

你可以去这里进行整个讨论。

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

问候,


exo*_*ore 1

EACCES 意味着禁止侦听端口 443。这是因为您没有将应用程序运行为root. 1024以下的端口是保留端口,只有root它们可以使用。

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

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

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

  1. 您的应用程序侦听loopback非特权端口上的接口,例如127.0.0.1:10443
  2. 您设置一个网络服务器来代理来自 的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/;
    }
}
Run Code Online (Sandbox Code Playgroud)