Bereitstellung von Node.js-Anwendungen in IIS-Umgebungen

Wer Node.js-Anwendungen in IIS-Umgebungen bereitstellen will, trifft auf einige Probleme. Für die meisten gibt es aber inzwischen gute Lösungen.

Node.js ist eine der am schnellsten wachsenden und am breitesten unterstützten Technologien zur Erstellung von Webanwendungen. Die Webumgebung wiederum lässt es sinnvoll erscheinen, die Node.js-Umgebung in einer IIS-Installation (Microsoft Internet Information Services) bereitzustellen. Allerdings ist die genaue Art und Weise, wie Node.js-Anwendungen und Internet-Informationsdienste zusammenarbeiten, etwas kompliziert.

Erstens ist Node.js eigentlich kein Webserver. Es handelt sich hierbei um eine Standalone-Engine für die Ausführung von Javascript mit Googles V8, das ein asynchrones, ereignisgesteuertes Programmiermodell verwendet. Daher arbeiten viele Node.js-Anwendungen als Web-Stack.

Allerdings kommunizieren nur wenige dieser Anwendungen direkt mit dem Internet, vor allem wegen der Risiken und dem damit verbundenen Arbeitsaufwand. Nginx oder Microsofts Internet Information Services  leiten stattdessen jeglichen Verkehr von und zum Internet über irgendeine Art von Proxy. Die wenigsten Unternehmen verbinden einen Webserver ohne Zusatzschutz direkt mit dem Internet.

Für diejenigen mit IIS-Programmiererfahrung hat der Microsoft-Mitarbeiter Scott Hanselman auf seinem Blog einen nützlichen Vergleich darüber geschrieben, wie Node.js in Verbindung mit IIS arbeitet. Er vergleicht die Technik mit einem IHttpHandler, der in JavaScript geschrieben ist und Tausende von Anfragen effizient verarbeiten kann.

Wenn Sie Node.js in einem Standalone-Mode aus Gründen der Entwicklung laufen lassen wollen, ist die Bereitstellung nicht sehr schwer. Starten Sie einfach die entsprechende App und verweisen Sie in einem Web-Browser darauf. Die Bereitstellung einer kompletten Node.js-Umgebung unter IIS ist allerdings eine andere Geschichte.

Glücklicherweise nimmt Microsoft Node.js mittlerweile ziemlich ernst, vor allem auf Azure, und es gibt einige ambitionierte Dritte, mit deren Lösungen Sie Node.js-Apps elegant in IIS hosten können. Die grundlegendste und nützlichste Lösung ist  iisnode, ein Open-Source-Projekt, das die überwiegende Mehrheit der recht komplizierten Node.js-Bereitstellung in IIS übernimmt.

Der Hauptvorteil liegt darin, dass iisnode ein IIS-Modul ist und keine Krückenlösung in irgendeiner Form. Iisnode ermöglicht auch verschiedene Typen der Integration zwischen einem Node.js-Projekt und IIS, einschließlich der folgenden:

  • Das IIS-Konfigurationsmanagement wird verwendet. Node.js-Projekte werden wie jede andere IIS-Website verwaltet, so dass Sie kein separates Management-Tool zur Verwaltung verwenden müssen. Alles was Sie brauchen kann durch den IIS-Manager verwaltet werden.
  • Prozesse und Prozess-Recycling werden automatisch gehandhabt. Ein häufiges Problem mit Node.js tritt auf, wenn Sie Dateien für ein Node.js-Projekt aktualisieren. Sie müssen die Node.js-Prozesse von Hand neu starten, damit die Änderungen wirksam werden. Python-Anwendungen unter IIS leiden allerdings unter dem gleichen Problem.
  • Es bietet Multi-Core-Skalierung. Node.js läuft als Singlethread und damit auf einem einzelnen CPU-Kern. Iisnode kann eine Webfarm aus mehreren Node.js-Prozessen erstellen, sodass eingehender Datenverkehr über einen Lastenausgleich abgewickelt werden kann. Erstellen Sie also so viele Prozesse, wie Sie Kerne haben, und Sie können  so viele eingehende Anfragen auf einmal befriedigen, wie notwendig sind. Die Hardware auf dem Server wird dabei optimal ausgenutzt. Beachten Sie, dass dies nicht die Thread-Sicherheit des Codes berücksichtig. Darum müssen Sie sich selbst kümmern.
  • Es unterstützt das Debugging über das Node-Inspektor-Tool. Das Ausführen einer App in jedem Stapel ist nicht sinnvoll, wenn Sie robuste Debugging-Tools einsetzen; iisnode verwendet das Knoten-Inspektor-Tool für detaillierte Fehlersuche für die Laufzeitumgebung, Breakpoints, Objektprüfung und vieles mehr.

Probleme mit der Bereitstellung von Node.js in IIS

Ein häufiges Problem beim Hosting von Node.js unter IIS – das im Übrigen aber auch für viele andere Umgebungen einschließlich .NET gilt – ist die lange Antwortzeit, die auf den ersten Request an eine Node.js-App folgt. Das erste Mal, wenn ein solcher Request eingeht, dauert es immer etwas, bis die Node.js-Instanz hochgefahren ist. Unter manchen Umständen kann das recht viel Zeit in Ansrpuch nehmen, vor allem wenn Sie eine besonders komplexe Node.js-Anwendung haben. Der Entwickler von iisnode, Tomasz Janczuk, bietet auf seinem Blog einige Hilfestellungen, wie Sie mit diesem Problem umgehen können.

Fans von cleveren Lösungen werden dies zu schätzen wissen: Es geht um die Erzeugung eines falschen Requests beim Start, der vollständig durch die IIS-Konfigurationsdatei für die Website durchgeführt wird. Das beschleunigt dann später den regulären Zugriff auf Node.js-Anwendungen.

Ein anderer Weg zur Beschleunigung besteht darin, den HTTP-Server von Node.js durch Windows und IIS HTTP.SYS zu ersetzen. Damit müssen Sie keine zusätzliche Routing-Schicht über IIS hinzufügen, auch wenn dies auf Kosten der Verwaltungsfunktionen in IIS geht. Daher sollte dies als eine Übung für Fortgeschrittene angesehen werden, keinesfalls für die erste Bereitstellung von Node.js. Sehen Sie diesen Vorgang also eher als eine Art Leistungsoptimierung, die erst später im Entwicklungszyklus kommen sollte.

Janczuk bietet auch eine Edge.js-Bibliothek an, mit der Node.js-Anwendungen innerhalb desselben Prozesses mit .NET sprechen können. Wenn Sie bereits über .NET-Bibliotheken für andere Projekte verfügen und Ihr neues Node.js-Projekt einbinden wollen, wäre dies ein möglicher Weg. C#, F#, Python, T-SQL und PowerShell sind alle durch Edge.js. aufrufbar.

Folgen Sie SearchDataCenter.de auch auf Facebook, Twitter und Google+!

Erfahren Sie mehr über Serverbetriebssysteme

ComputerWeekly.de
Close