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

我在一个cloud Linux node上设置了我的第一个Node.js服务器,而且我对Linux admin的细节还是比较Linux admin 。 (顺便说一句,我不想​​同时使用Apache。)

一切安装正确,但我发现,除非我使用root login ,我不能听节点上的port 80 。 但是,我宁愿不作为根安全的原因运行。

最佳做法是什么?

  1. 为节点设置良好的权限/用户,使其安全/沙盒?
  2. 允许在这些限制内使用端口80。
  3. 启动节点并自动运行。
  4. 处理发送到控制台的日志信息。
  5. 任何其他一般的维护和安全问题。

我应该将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.conflocation更改为

     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。