2013-07-04 164 views
16

我正在運行一個node.js服務器,它將服務端口80和其他請求。顯然這需要應用程序以root身份運行(在Linux上)。如何以非root用戶身份運行node.js?

看着這篇文章(http://syskall.com/dont-run-node-dot-js-as-root)作爲一個例子很明顯,有很簡單的方法可以允許節點作爲非root用戶運行,但是我想知道是否有人對優點/缺點有看法建議使用不同的方法:

  1. 代碼:使用setuid()在監聽端口80後建立從根端下拉到非特權用戶。

  2. 使用某種形式的代理服務器將請求重定向到一個端口> 1024(所以不需要節點作爲根用戶身份運行)使用IP錶轉發到另一個端口(同上節點將無法運行

  3. 作爲root)

感謝

回答

22

選項1需要啓動該節點作爲根服務器。不理想。

選項2爲每個處理的請求添加開銷並將另一個故障點添加到您的堆棧。

選項3是最簡單和最有效的方法。

要實現選項3,請將以下內容添加到系統init腳本中。 (基於RedHat的系統(如AWS)上的/etc/rc.d/rc.local)。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000 

將重定向從80端口到端口3000

+1

Upvoted。請注意,至少在Ubuntu上,上面的'iptables'命令不是永久性的......爲了確保在下次啓動時保留該規則,您需要確保有一個啓動腳本,該腳本用於恢復'iptables'規則'iptables-restore'命令,如下所述:http://www.rackspace.com/knowledge_center/article/ubuntu-setup –

+0

選項3是大多數NodeJS開發者部署完成網站的方式嗎?如果不是,他們通常如何允許客戶端瀏覽器連接到端口80? – trysis

+0

取決於你的情況。較大的部署使用與選項2相同的前端負載均衡器。很多人使用使用前端負載均衡器的Heroku;再次選擇2.但是,如果您在具有root訪問權限的服務器上部署此操作,那麼我建議選項3.這很容易,您不必擔心配置反向代理。也就是說,如果這是你的選擇,那麼一定要看看Heroku。他們使部署非常容易。 – Daniel

4

(我沒有足夠的聲譽添加評論馬特·布朗的一個,所以我寫這作爲一個答案的請求。感覺自由編輯)

有一個簡單的重新啓動比馬特·布朗的鏈接描述的一個後自動加載iptables規則方法:人們可以使用安裝在倉庫的iptables持久apt-get的:

apt-get install iptables-persistent 

規則仍需要手動保存這樣的:

的IPv4:

iptables-save > /etc/iptables/rules.v4 

的IPv6:

iptables-save > /etc/iptables/rules.v6 

(來源:http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern(德國))

1

我愛簡單此變通辦法:

sudo setcap 'cap_net_bind_service=+ep' `which node` 

它也適用於除了nodejs順便說一句的程序。

基本上爲第二參數你鍵入路徑到可執行程序(如在Ubuntu /usr/bin/nodejs),在上述情況下應which node動態地提供它,從而從Linux發行版獨立地使這項工作。

請注意,當您升級nodejs或因其他原因而被覆蓋時,您將不得不再次執行相同的命令。

來源:

相關問題