Answers:
我在云实例上执行的操作是使用以下命令将端口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
。这将在计算机启动时添加重定向。您不需要sudo
,/etc/rc.local
因为其中的命令是root
在系统引导时运行的。
使用forever模块启动您的Node.js。如果崩溃,它将确保重新启动,并将控制台日志重定向到文件。
将您的Node.js启动脚本添加到您为端口重定向编辑的文件中/etc/rc.local
。系统启动时,它将运行您的Node.js启动脚本。
这不仅适用于Linode,而且适用于Digital Ocean,AWS EC2和其他VPS提供商。但是,基于RedHat的系统/etc/rc.local
是/ect/rc.d/local
。
/etc/rc.local
,它是否将root
在系统启动时执行?这将破坏端口80重定向的目的。
授予安全用户使用端口80的权限
请记住,我们不希望以root用户身份运行您的应用程序,但是有一个麻烦:您的安全用户没有使用默认HTTP端口(80)的权限。您的目标是通过导航到易于使用的网址(例如,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上运行时,它不会抱怨。
检查此参考链接
绑定到端口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证书的轻量级Nginx代理切换到了。我发现了一个有用的答案与沿要点通过gabrielhpugliese如何处理这个问题。基本上我
openssl genrsa 2048 > private-key.pem
openssl req -new -key private-key.pem -out csr.pem
改变了location
在/etc/nginx/conf.d/example_ssl.conf
以
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
}
通过cat
将各个证书-在一起并将其链接到我的nginx example_ssl.conf
文件中,对nginx证书进行格式化(以及未注释的内容,删除名称中的“ example”,...)
ssl_certificate /etc/nginx/ssl/cert_bundle.cert;
ssl_certificate_key /etc/nginx/ssl/private-key.pem;
希望这可以减轻别人的麻烦。我敢肯定有一种纯节点的方式可以做到这一点,但是nginx很快并且有效。