2013-07-04 7 views
16

Ich verwende einen node.js-Server, der unter anderem Anforderungen an Port 80 bedient. Dies erfordert natürlich, dass die Anwendung als root läuft (unter Linux).Wie node.js als Nicht-Root-Benutzer ausführen?

Wenn Sie diesen Beitrag (http://syskall.com/dont-run-node-dot-js-as-root) als ein Beispiel betrachten, ist es klar, dass es einfache Möglichkeiten gibt, Knoten als Nicht-root-Benutzer ausgeführt werden, aber ich frage mich, ob jemand Ansichten über die Vorteile/Nachteile der hat verschiedene Methoden vorgeschlagen:

  1. Code verwenden setuid-() von der Wurzel fallen bis auf nicht-privilegierte Benutzer nach der Port 80 überwachen hergestellt wird.

  2. einen Proxy-Server von einer Art verwenden Umleitung von Anforderungen an einen Port> 1024 (und so nicht brauchen Knoten ausgeführt als root)

  3. mit IP-Tabellen auf einen anderen Port (dito Knoten laufen würde nicht weiterleiten als root)

Dank

Antwort

22

Option 1 erfordert, dass Sie starten Sie den Knoten Server als root. Nicht ideal.

Option 2 fügt jeder abgearbeiteten Anforderung einen Overhead hinzu und fügt Ihrem Stack einen weiteren Fehlerpunkt hinzu.

Option 3 Ist die einfachste und effizienteste Methode.

Um Option 3 zu implementieren, fügen Sie Ihren System-Init-Skripten Folgendes hinzu: (/etc/rc.d/rc.local auf RedHat-basierten Systemen wie AWS).

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

, dass Anfragen von Port 80 zu Port umleitet 3000.

+1

upvoted. Beachten Sie, dass der oben genannte 'iptables' Befehl zumindest unter Ubuntu nicht dauerhaft ist ... um sicherzustellen, dass die Regel beim nächsten Start beibehalten wird, müssen Sie sicherstellen, dass ein Startskript die' iptables' Regeln mit Hilfe des "iptables-restore" -Befehl, wie hier beschrieben: http://www.rackspace.com/knowledge_center/article/ubuntu-setup –

+0

Ist Option 3 die Art und Weise, wie die meisten NodeJS-Entwickler ihre fertigen Websites bereitstellen? Wenn nicht, wie können Client-Browser normalerweise eine Verbindung zu Port 80 herstellen? – trysis

+0

Hängt von Ihrer Situation ab. Größere Bereitstellungen verwenden einen Front-End-Lastausgleich, der der Option 2 entspricht. Viele Benutzer verwenden Heroku, das einen Front-End-Lastenausgleich verwendet. wieder Option 2. Wenn Sie dies jedoch auf einem Server mit Root-Zugriff bereitstellen, empfehle ich Option 3. Es ist einfach und Sie müssen sich keine Gedanken über die Konfiguration eines Reverse-Proxy machen. Das heißt, schauen Sie sich unbedingt Heroku an, wenn das eine Option für Sie ist. Sie machen es sehr einfach, Bereitstellungen durchzuführen. – Daniel

4

(ich habe nicht genug Ruf bekam einen Kommentar des derjenige von Matt Browne hinzuzufügen, so schreibe ich dies als eine Antwort. Spüren frei zu bearbeiten)

Es gibt eine einfachere Methode iptables-Regeln automatisch nach einem Neustart als die in der Verbindung von Matt Browne beschrieben zu laden. man kann iptables-persistent installiert aus den Repositories mit apt-get:

apt-get install iptables-persistent 

Regeln müssen noch manuell wie folgt gespeichert werden:

IPv4:

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

IPv6:

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

(Quelle: http://www.thomas-krenn.com/de/wiki/Iptables_Firewall_Regeln_dauerhaft_speichern (Deutsch))

1

ich die Einfachheit lieben dieser Problemumgehung:

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

Es funktioniert auch für andere Programme als Nodejs BTW.

Grundsätzlich als 2. Parameter geben Sie den Pfad zum Programm ausführbar (wie /usr/bin/nodejs auf Ubuntu), im obigen Fall which node sollte es dynamisch zur Verfügung stellen, so dass dies unabhängig von Linux Distribution funktioniert.

Beachten Sie jedoch, dass Sie, wenn Sie Nodejs aktualisieren oder die ausführbare Datei aus einem anderen Grund überschrieben wird, denselben Befehl erneut ausführen müssen.

Quellen: