Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用端口80(Ubuntu/Linode)运行Node.js的最佳实践_Linux_Node.js_Security_Web Applications_Configuration - Fatal编程技术网

Linux 使用端口80(Ubuntu/Linode)运行Node.js的最佳实践

Linux 使用端口80(Ubuntu/Linode)运行Node.js的最佳实践,linux,node.js,security,web-applications,configuration,Linux,Node.js,Security,Web Applications,Configuration,我正在一个云Linux节点上设置我的第一个Node.js服务器,我对Linux admin的细节相当陌生。(顺便说一句,我不想同时使用Apache。) 所有内容都已正确安装,但我发现,除非使用根登录名,否则无法通过节点侦听端口80。但是,出于安全原因,我不希望将其作为root运行 以下方面的最佳实践是什么: 为节点设置良好的权限/用户,使其安全/沙盒 允许在这些限制条件下使用端口80 启动节点并自动运行它 处理发送到控制台的日志信息 任何其他一般维护和安全问题 我是否应该将端口80通信转发到其他

我正在一个
云Linux节点上设置我的第一个
Node.js
服务器,我对
Linux admin
的细节相当陌生。(顺便说一句,我不想同时使用Apache。)

所有内容都已正确安装,但我发现,除非使用
根登录名
,否则无法通过节点侦听
端口80
。但是,出于安全原因,我不希望将其作为root运行

以下方面的最佳实践是什么:

  • 为节点设置良好的权限/用户,使其安全/沙盒
  • 允许在这些限制条件下使用端口80
  • 启动节点并自动运行它
  • 处理发送到控制台的日志信息
  • 任何其他一般维护和安全问题
  • 我是否应该将端口80通信转发到其他侦听端口

    谢谢

    端口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
    的形式运行

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

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

    数字海洋和其他VPS 这不仅适用于Linode,也适用于Digital Ocean、AWS EC2和其他VPS提供商。然而,在基于RedHat的系统上,对于端口80(这是最初的问题),Daniel完全正确。我最近转到了
    https
    ,不得不从
    iptables
    切换到管理SSL证书的轻型nginx代理。我发现了一个关于如何处理这个问题的有用的方法。基本上我

    • 通过

    • 从(我碰巧使用)处获得实际证书
    • 并在我的nginx
      example_ssl.conf
      文件中链接到它(和未注释的东西,去掉名称中的“example”…)


    希望这能帮别人省去一些麻烦。我确信有一种纯粹的节点方式可以做到这一点,但nginx很快,而且很有效。

    为安全用户提供使用端口80的权限

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

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

    很多人被困在这里,但解决办法很简单。有几个选择,但这是我喜欢的。键入以下命令:

    sudo apt-get install libcap2-bin
    sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
    
    现在,当您告诉节点应用程序希望它在端口80上运行时,它不会抱怨


    选中此项,在绑定到端口80(或443)后删除根权限。

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

    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());
    });
    

    查看更多详细信息。

    谢谢你的回答,很好,切中要害。顺便说一句,在Ubuntu上,它是/etc/rc.local,-i eth0”标志通常是虚拟专用服务器的一个问题。根据需要替换eth0。如果我将Node.js启动脚本添加到
    /etc/rc.local
    ,它是否会在系统引导时作为
    根目录执行?这将破坏端口80重定向的目的。请注意,要使端口重定向正常工作,目标端口也必须是防火墙上的opne。WRT在启动时启动一个节点实例,我们只需使用发行版的init脚本/systemd文件,允许您指定一个用户。这是更好、更简单的答案。此外,在这里添加了详细的答案:像NGINX这样的web服务器如何在端口80上运行?它也有类似的功能吗?@Eric Andrewlewis:我会说这要看情况而定。在非根模式下运行服务器时,将显示此错误。如果您以root用户身份运行Nginx服务器,该怎么办!另外,如果以普通用户身份运行并出现错误。运行以上命令以授予访问端口的安全权限。也指
    
    sudo apt-get install libcap2-bin
    sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
    
    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());
    });