使用端口80运行Node.js的最佳实践(Ubuntu / Linode)
我在一个cloud Linux node
上设置了我的第一个Node.js
服务器,而且我对Linux admin
的细节还是比较Linux admin
。 (顺便说一句,我不想同时使用Apache。)
一切安装正确,但我发现,除非我使用root login
,我不能听节点上的port 80
。 但是,我宁愿不作为根安全的原因运行。
最佳做法是什么?
- 为节点设置良好的权限/用户,使其安全/沙盒?
- 允许在这些限制内使用端口80。
- 启动节点并自动运行。
- 处理发送到控制台的日志信息。
- 任何其他一般的维护和安全问题。
我应该将80端口stream量转发到不同的监听端口吗?
谢谢
港口80
我在我的云实例上做的是我使用以下命令将端口80redirect到端口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
。 这将在机器启动时添加redirect。 在/etc/rc.local
不需要sudo
,因为那里的命令在系统引导时以root
身份运行。
日志
使用forever模块来启动你的Node.js。 它将确保它重新启动,如果它崩溃,它会redirect控制台日志到一个文件。
在启动时启动
将您的Node.js启动脚本添加到您为端口redirect编辑的文件/etc/rc.local
。 这将在系统启动时运行Node.js启动脚本。
数字海洋和其他VPS
这不仅适用于Linode,还适用于Digital Ocean,AWS EC2和其他VPS提供商。 但是,在基于RedHat的系统上,/ /etc/rc.local
/ect/rc.d/local
是/ect/rc.d/local
。
授予安全用户权限以使用端口80
请记住,我们不希望以root用户身份运行应用程序,但有一个问题:您的安全用户无权使用默认的HTTP端口(80)。 你的目标是能够发布一个网站,访问者可以通过导航到一个易于使用的URL像http://ip:port/
不幸的是,除非以root用户身份login,否则通常必须使用像http://ip:port
– 这里的端口号> 1024的URL。
很多人被困在这里,但解决scheme很简单。 有几个select,但这是我喜欢的。 键入以下命令:
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港(这是原来的问题),丹尼尔是完全正确的。 我最近搬到了https
,不得不从iptables
切换到pipe理SSL证书的一个简单的nginx代理。 我发现了一个有用的答案,以及gabrielhpugliese如何处理这个问题的要点 。 基本上我
-
通过OpenSSL 创build了SSL证书签名请求(CSR)
openssl genrsa 2048 > private-key.pem openssl req -new -key private-key.pem -out csr.pem
- 从这些地方获得了实际的证书(我碰巧使用Comodo )
- 安装了nginx
-
将
/etc/nginx/conf.d/example_ssl.conf
的location
更改为location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; }
-
通过捕获单个证书并将其链接到我的nginx
example_ssl.conf
文件(和未注释的东西,摆脱名称中的“示例”…)来格式化nginx的证书 ,ssl_certificate /etc/nginx/ssl/cert_bundle.cert; ssl_certificate_key /etc/nginx/ssl/private-key.pem;
希望能够拯救别人一些头痛。 我确信有一个纯节点的方式做这个,但nginx是快速的,它的工作。
Linode提供一些“前墙”或防火墙,您必须打开机器的端口? 也许这将是一个很好的地方find更好的解决办法比路由在每台机器上? 当我在Azure上部署服务器时,我必须定义所谓的端点。 端点包含公共端口,专用端口(在机器上)和协议(TCP / UDP)。 因此,如果您在服务器上的端口3000上运行应用程序,则可以在端口80上访问应用程序,并且由平台而不是机器进行路由。 我也可以在端点上设置ACL。