對Linux有所了解的同學(xué)都知道崩掘,一般用戶是沒有權(quán)限去監(jiān)聽1024以內(nèi)的端口的衣摩。什么意思呢?舉例來說缘滥,像下面這段代碼:
require('http').createServer(function (req, res) {
// Server Logic Here
}).listen(80);
其目的是要啟動一個http服務(wù)器并監(jiān)聽80端口。?如果啟動該process的用戶非root用戶谒主,執(zhí)行上述代碼就會拋出類似下面的錯誤:
而且朝扼,我們一般部署應(yīng)用都采用PM2 的cluster模式來啟動我們的應(yīng)用,這樣能夠利用它內(nèi)置的負(fù)載均衡(這對單機多核CPU的情況下非常有好處)霎肯,所以我們得要能夠讓PM2成功啟動這類Node服務(wù)器應(yīng)用擎颖。那么怎么辦呢?解決這個問題观游,一般有以下幾種主流辦法:
- 直接采用root用戶啟動
- 通過libcap2-bin的setcap命令
- 采用iptables設(shè)置端口轉(zhuǎn)發(fā)
對于#1種方法顯而易見搂捧,不安全!#2種方法貌似對于node直接啟動work懂缕,但是PM2最新版本(v0.9.2)在Node v0.10.29下沒有辦法work允跑。#3種辦法也是我個人比較喜歡的辦法,就是利用iptables來設(shè)置將80端口的數(shù)據(jù)流和Node服務(wù)器監(jiān)聽的端口數(shù)據(jù)流進行互相轉(zhuǎn)發(fā)搪柑。而且這種轉(zhuǎn)發(fā)是直接網(wǎng)卡層面的(iptables本身工作在OSI七層模型中的2聋丝,3,4層)拌屏。什么意思呢窝爪?簡單來說就是:既然普通用戶無法監(jiān)聽1024以內(nèi)的端口,那么就監(jiān)聽一個以外的端口比如:3003之類的脸哀,然后PM2直接啟動這樣的進程是毫無壓力的杯瞻,緊接著呢瓣戚,設(shè)置iptables將80端口和3003端口之間建立映射,這樣呢焦读,用戶訪問80端口就等于在訪問3003端口子库。就這么簡單!
而且設(shè)置這樣一條端口映射的規(guī)則也只需輸入如下命令即可:
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3003
關(guān)于命令具體啥意思矗晃,大家查查iptables的幫助文檔就很容易理解了仑嗅。好了,一切都正常work了张症。但是仓技,慢著!還沒完呢俗他。這里有個問題就是:這樣設(shè)置的iptables規(guī)則只寫在內(nèi)存中脖捻,換句話說機器一重啟這條規(guī)則就木有了!那么怎么解決這個問題呢兆衅?
辦法就是:把這條規(guī)則寫在配置文件中地沮,然后每次機器重啟的時候去執(zhí)行一次,把規(guī)則再次加到表中羡亩。具體步驟如下:
- 首先執(zhí)行好此前那條端口轉(zhuǎn)發(fā)命令
- 切換到root用戶登錄(ubuntu下執(zhí)行su命令)(因為要保存配置到/etc目錄下)
- 執(zhí)行:iptables-save > /etc/iptables-rules摩疑。(支持ipv6就執(zhí)行ip6tables-save)
- 最后,編輯/ect/network/interfaces文件畏铆,并在最后插入:pre-up iptables-restore < /etc/iptables-rules(這里目的就是在網(wǎng)卡激活前執(zhí)行這條命令來使規(guī)則生效)
好了雷袋,到這里就大功告成了。這個時候你再重啟試試及志,就自動做好端口映射了片排!