我正在一个云Linux节点上设置我的第一个node .js服务器,我对Linux管理的细节相当陌生。(顺便说一下,我不打算同时使用Apache。)
一切都正确安装了,但我发现除非我使用根登录,否则我无法在节点的80端口上侦听。但是,出于安全原因,我宁愿不以根用户身份运行它。
最佳做法是什么:
为节点设置良好的权限/用户,使其安全/沙盒?
允许在这些限制条件下使用端口80。
启动节点并自动运行它。
处理发送到控制台的日志信息。
任何其他一般维护和安全问题。
我应该将端口80流量转发到不同的监听端口吗?
谢谢
绑定端口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(或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
我在我的云实例上所做的是用以下命令将端口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(这是最初的问题),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上运行时,它将不会报错。
检查这个参考链接