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

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

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

PM2监听80端口-程序旅途

而且,我们一般部署应用都采用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规则只写在内存中,换句话说机器一重启这条规则就木有了!那么怎么解决这个问题呢?

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

首先执行好此前那条端口转发命令
切换到root用户登录(ubuntu下执行su命令)(因为要保存配置到/etc目录下)
执行:iptables-save > /etc/iptables-rules。(支持ipv6就执行ip6tables-save)
最后,编辑/ect/network/interfaces文件,并在最后插入:pre-up iptables-restore < /etc/iptables-rules(这里目的就是在网卡激活前执行这条命令来使规则生效)
好了,到这里就大功告成了。这个时候你再重启试试,就自动做好端口映射了!

原文链接:http://www.jianshu.com/p/4c8330720899