我正在一个云Linux节点上设置我的第一个node .js服务器,我对Linux管理的细节相当陌生。(顺便说一下,我不打算同时使用Apache。)

一切都正确安装了,但我发现除非我使用根登录,否则我无法在节点的80端口上侦听。但是,出于安全原因,我宁愿不以根用户身份运行它。

最佳做法是什么:

为节点设置良好的权限/用户,使其安全/沙盒? 允许在这些限制条件下使用端口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.本地文件,并添加这一行减去sudo。这将在机器启动时添加重定向。在/etc/rc.中不需要sudo之所以是Local,是因为在系统引导时,那里的命令以根用户身份运行。

Logs

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

开机启动

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

数字海洋和其他副总裁

这不仅适用于Linode,还适用于Digital Ocean、AWS EC2和其他VPS提供商。然而,在基于RedHat的系统/etc/rc.Local为/ect/rc.d/ Local。

其他回答

端口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.本地文件,并添加这一行减去sudo。这将在机器启动时添加重定向。在/etc/rc.中不需要sudo之所以是Local,是因为在系统引导时,那里的命令以根用户身份运行。

Logs

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

开机启动

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

数字海洋和其他副总裁

这不仅适用于Linode,还适用于Digital Ocean、AWS EC2和其他VPS提供商。然而,在基于RedHat的系统/etc/rc.Local为/ect/rc.d/ Local。

绑定端口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());
});

在这篇完整的参考文献中查看更多细节。

对于端口80(这是最初的问题),Daniel是完全正确的。我最近转到https,不得不从iptables切换到管理SSL certs的轻量级nginx代理。我找到了一个有用的答案,以及gabrielhpugliese关于如何处理这个问题的要点。基本上我

Created an SSL Certificate Signing Request (CSR) via OpenSSL openssl genrsa 2048 > private-key.pem openssl req -new -key private-key.pem -out csr.pem Got the actual cert from one of these places (I happened to use Comodo) Installed nginx Changed the location in /etc/nginx/conf.d/example_ssl.conf to location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; } Formatted the cert for nginx by cat-ing the individual certs together and linked to it in my nginx example_ssl.conf file (and uncommented stuff, got rid of 'example' in the name,...) ssl_certificate /etc/nginx/ssl/cert_bundle.cert; ssl_certificate_key /etc/nginx/ssl/private-key.pem;

希望这能帮别人省点麻烦。我相信有一个纯节点的方式来做这件事,但nginx是快速的,它工作。

允许安全用户使用80端口

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

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

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

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

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

检查这个参考链接