【问题标题】:Best practices when running Node.js with port 80 (Ubuntu / Linode) [closed]使用端口 80(Ubuntu / Linode)运行 Node.js 时的最佳实践 [关闭]
【发布时间】:2013-05-10 12:48:35
【问题描述】:

我正在cloud Linux node 上设置我的第一个Node.js 服务器,而且我对Linux admin 的细节还很陌生。 (顺便说一句,我没有尝试同时使用 Apache。)

一切都安装正确,但我发现除非我使用root login,否则我无法使用节点收听port 80。但是,出于安全原因,我宁愿不以 root 身份运行它。

最佳做法是:

  1. 为节点设置良好的权限/用户,使其安全/沙盒化?
  2. 允许在这些限制内使用端口 80。
  3. 启动节点并自动运行。
  4. 处理发送到控制台的日志信息。
  5. 任何其他一般维护和安全问题。

我应该将端口 80 的流量转发到不同的侦听端口吗?

谢谢

【问题讨论】:

    标签: linux node.js security web-applications configuration


    【解决方案1】:

    80 端口

    我在我的云实例上所做的是使用以下命令将端口 80 重定向到端口 3000:

    sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
    

    然后我在端口 3000 上启动我的 Node.js。对端口 80 的请求将被映射到端口 3000。

    您还应该编辑您的/etc/rc.local 文件并添加该行减去sudo。这将在机器启动时添加重定向。在/etc/rc.local 中不需要sudo,因为系统启动时那里的命令以root 运行。

    日志

    使用 forever 模块来启动您的 Node.js。它将确保在崩溃时重新启动,并将控制台日志重定向到文件。

    开机启动

    将您的 Node.js 启动脚本添加到您为端口重定向编辑的文件/etc/rc.local。这将在系统启动时运行您的 Node.js 启动脚本。

    数字海洋和其他 VPS

    这不仅适用于 Linode,也适用于 Digital Ocean、AWS EC2 和其他 VPS 提供商。但是,在基于 RedHat 的系统上,/etc/rc.local/ect/rc.d/local

    【讨论】:

    • 感谢您的回答,很好,切中要害。
    • 顺便说一句,在 Ubuntu 上,它是 /etc/rc.local
    • “-i eth0”标志通常会成为虚拟专用服务器的问题。根据需要替换 eth0。
    • 如果我将我的 Node.js 启动脚本添加到/etc/rc.local,它不会在系统启动时作为root 执行吗?这将破坏端口 80 重定向的目的。
    • 请注意,要使端口重定向工作,目标端口也需要在防火墙上打开。 WRT 在启动时启动节点实例,我们只需使用发行版的 init 脚本/systemd 文件,这些文件允许您指定用户。
    【解决方案2】:

    授予安全用户使用端口 80 的权限

    请记住,我们不想以 root 用户身份运行您的应用程序,但有一个问题:您的安全用户没有使用默认 HTTP 端口 (80) 的权限。您的目标是能够通过导航到易于使用的 URL(如 http://ip:port/)来发布访问者可以使用的网站

    不幸的是,除非您以 root 身份登录,否则您通常必须使用像 http://ip:port 这样的 URL - 其中端口号 > 1024。

    很多人都被困在这里,但解决方案很简单。有几个选择,但这是我喜欢的一个。输入以下命令:

    sudo apt-get install libcap2-bin
    sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
    

    现在,当您告诉 Node 应用程序您希望它在端口 80 上运行时,它不会抱怨。

    查看reference link

    【讨论】:

    • 这是更好、更简单的答案。
    • 另外,在这里添加了详细的答案stackoverflow.com/questions/23281895/…
    • 像 NGINX 这样的 Web 服务器如何在 80 端口上运行?它会做类似的事情吗?
    • @EricAndrewLewis:我会说这取决于。当您以非 root 模式运行服务器时,将显示此错误。如果您以 root 用户身份运行 Nginx 服务器怎么办!此外,如果以普通用户身份运行并出现错误。运行上述命令以授予访问端口的安全权限。另请参阅stackoverflow.com/questions/31369480/…
    【解决方案3】:

    绑定到端口 80(或 443)后删除 root 权限。

    这允许端口 80/443 保持受保护,同时仍阻止您以 root 身份提供请求:

    function drop_root() {
        process.setgid('nobody');
        process.setuid('nobody');
    }
    

    使用上述函数的完整工作示例:

    var process = require('process');
    var http = require('http');
    var server = http.createServer(function(req, res) {
        res.write("Success!");
        res.end();
    });
    
    server.listen(80, null, null, function() {
        console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
        drop_root();
        console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    });
    

    full reference查看更多详情。

    【讨论】:

      【解决方案4】:

      对于 80 端口(这是最初的问题),Daniel 是完全正确的。我最近搬到https 并且不得不从iptables 切换到管理SSL 证书的轻型nginx 代理。我发现了一个有用的answer 以及gabrielhpugliesegist 以了解如何处理它。基本上我

      希望这可以为其他人省去一些麻烦。我敢肯定有一种纯节点方式可以做到这一点,但 nginx 很快而且很有效。

      【讨论】:

        猜你喜欢
        • 2013-02-16
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2012-02-12
        • 1970-01-01
        相关资源
        最近更新 更多