如何在PM2 cluster模式下启动监听80端口的Node服务器程序

对Linux有所了解的同学都知道,一般用户是没有权限去监听1024以内的端口的。什么意思呢?举例来说,像下面这段代码:

require('http').createServer(function (req, res) {
  // Server Logic Here
}).listen(80);

其目的是要启动一个http服务器并监听80端口。​如果启动该process的用户非root用户,执行上述代码就会抛出类似下面的错误:

而且,我们一般部署应用都采用PM2 的cluster模式来启动我们的应用,这样能够利用它内置的负载均衡(这对单机多核CPU的情况下非常有好处),所以我们得要能够让PM2成功启动这类Node服务器应用。那么怎么办呢?解决这个问题,一般有以下几种主流办法:

  1. 直接采用root用户启动
  2. 通过libcap2-bin的setcap命令
  3. 采用iptables设置端口转发

对于#1种方法显而易见,不安全!#2种方法貌似对于node直接启动work,但是PM2最新版本(v0.9.2)在Node v0.10.29下没有办法work。#3种办法也是我个人比较喜欢的办法,就是利用iptables来设置将80端口的数据流和Node服务器监听的端口数据流进行互相转发。而且这种转发是直接网卡层面的(iptables本身工作在OSI七层模型中的2,3,4层)。什么意思呢?简单来说就是:既然普通用户无法监听1024以内的端口,那么就监听一个以外的端口比如:3003之类的,然后PM2直接启动这样的进程是毫无压力的,紧接着呢,设置iptables将80端口和3003端口之间建立映射,这样呢,用户访问80端口就等于在访问3003端口。就这么简单!

而且设置这样一条端口映射的规则也只需输入如下命令即可:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3003

关于命令具体啥意思,大家查查iptables的帮助文档就很容易理解了。好了,一切都正常work了。但是,慢着!还没完呢。这里有个问题就是:这样设置的iptables规则只写在内存中,换句话说机器一重启这条规则就木有了!那么怎么解决这个问题呢?

办法就是:把这条规则写在配置文件中,然后每次机器重启的时候去执行一次,把规则再次加到表中。具体步骤如下:

  1. 首先执行好此前那条端口转发命令
  2. 切换到root用户登录(ubuntu下执行su命令)(因为要保存配置到/etc目录下)
  3. 执行:iptables-save > /etc/iptables-rules。(支持ipv6就执行ip6tables-save)
  4. 最后,编辑/ect/network/interfaces文件,并在最后插入:pre-up iptables-restore < /etc/iptables-rules(这里目的就是在网卡激活前执行这条命令来使规则生效)

好了,到这里就大功告成了。这个时候你再重启试试,就自动做好端口映射了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • iptabels是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含iptables的功...
    随风化作雨阅读 4,872评论 1 16
  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,810评论 0 10
  • 昨天(2017年8月8日),九寨沟发生地震。一下子又让人联想起了2008年5.20的汶川大地震。 那...
    浪子文良阅读 510评论 0 0
  • 《午后的烘培》 作者:明至 给生活加一点甜, 将告白揉进陪伴里, 充分混合,搅拌, 形成一团金色岁月。 再切割,并...
    作家明至阅读 329评论 0 1