Node.js
Verwenden von IISNode zum Hosten von Node.js-Webanwendungen in IIS
Suche…
Bemerkungen
Virtuelles Verzeichnis / geschachtelte Anwendung mit Ansichtsfall
Wenn Sie Express zum Rendern von Ansichten mit einer View Engine verwenden, müssen Sie den virtualDirPath
Wert an Ihre Ansichten übergeben
`res.render('index', { virtualDirPath: virtualDirPath });`
Der Grund dafür ist, dass Sie Hyperlinks zu anderen Ansichten erstellen, die von Ihrer App und statischen Ressourcenpfaden gehostet werden, um zu erfahren, wo die Site gehostet wird, ohne alle Ansichten nach der Bereitstellung ändern zu müssen. Dies ist einer der lästigsten und langwierigsten Fallstricke bei der Verwendung von virtuellen Verzeichnissen mit IISNode.
Versionen
Alle obigen Beispiele funktionieren mit
- Express v4.x
- IIS 7.x / 8.x
- Socket.io v1.3.x oder höher
Fertig machen
Mit IISNode können Node.js-Webanwendungen auf IIS 7/8 gehostet werden, genau wie dies bei einer .NET-Anwendung der Fall ist. Natürlich können Sie Ihren node.exe
Prozess unter Windows selbst hosten. Warum sollten Sie dies tun, wenn Sie Ihre App einfach in IIS ausführen können.
IISNode wird handhabt mehrere Kerne, Prozess manageement die Skalierung über node.exe
und Auto-Recycling Ihre IIS Anwendung , wenn Ihr App aktualisiert wird, um nur einige seiner zu nennen Vorteile .
Bedarf
Für IISNode gelten einige Anforderungen, bevor Sie Ihre Node.js-App in IIS hosten können.
- Auf dem IIS-Host muss Node.js installiert sein, 32-Bit oder 64-Bit werden unterstützt.
- Wenn IISNode x86 oder x64 installiert ist, sollte dies mit der Bitgröße Ihres IIS-Hosts übereinstimmen.
- Das Microsoft URL-Rewrite-Modul für IIS, das auf Ihrem IIS-Host installiert ist.
- Dies ist der Schlüssel, andernfalls funktionieren Anforderungen an Ihre Node.js-App nicht wie erwartet.
- Eine
Web.config
im Stammverzeichnis Ihrer Node.js-App. - IISNode-Konfiguration über eine
iisnode.yml
Datei oder ein<iisnode>
-Element in IhrerWeb.config
.
Grundlegendes Hello World-Beispiel mit Express
Damit dieses Beispiel funktionieren kann, müssen Sie auf Ihrem IIS-Host eine IIS 7/8-App erstellen und das Verzeichnis mit der Node.js-Webanwendung als physisches Verzeichnis hinzufügen. Stellen Sie sicher, dass Ihre Anwendung / Anwendungspool-Identität auf die Installation von Node.js zugreifen kann. In diesem Beispiel wird die 64-Bit-Installation Node.js verwendet.
Projektstruktur
Dies ist die grundlegende Projektstruktur einer IISNode / Node.js-Webanwendung. Es sieht fast identisch mit jeder anderen Webanwendung als IISNode aus, abgesehen von der Hinzufügung von Web.config
.
- /app_root
- package.json
- server.js
- Web.config
server.js - Expressanwendung
const express = require('express');
const server = express();
// We need to get the port that IISNode passes into us
// using the PORT environment variable, if it isn't set use a default value
const port = process.env.PORT || 3000;
// Setup a route at the index of our app
server.get('/', (req, res) => {
return res.status(200).send('Hello World');
});
server.listen(port, () => {
console.log(`Listening on ${port}`);
});
Konfiguration & Web.config
Die Web.config
ist wie jede andere IIS- Web.config
außer dass die folgenden beiden Dinge vorhanden sein müssen: URL <rewrite><rules>
und ein IISNode <handler>
. Beide Elemente sind <system.webServer>
Elemente des Elements <system.webServer>
.
Aufbau
Sie können IISNode konfigurieren , indem eine mit iisnode.yml
Datei oder durch Hinzufügen des <iisnode>
Element als Kind von <system.webServer>
in Ihrer Web.config
. Beide dieser Konfiguration kann mit einem jedoch einen anderen, in diesem Fall in Verbindung verwendet werden, Web.config
die angeben müssen iisnode.yml
- Datei und alle Konfigurationskonflikte werden die sich aus der iisnode.yml
Datei statt . Dieses Konfigurationsüberschreiben kann nicht umgekehrt passieren.
IISNode-Handler
Damit IIS wissen kann, dass server.js
unsere Node.js-Webanwendung enthält, müssen wir dies explizit mitteilen. Dazu können Sie den IISNode <handler>
zum <handlers>
Handlers <handlers>
-Element hinzufügen.
<handlers>
<add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>
URL-Rewrite-Regeln
Der letzte Teil der Konfiguration besteht darin, sicherzustellen, dass der Verkehr, der für unsere Node.js-App in unserer IIS-Instanz bestimmt ist, zu IISNode geleitet wird. Ohne Regeln zum Umschreiben von http://<host>/server.js
müssten wir unsere App besuchen, indem Sie zu http://<host>/server.js
Schlimmer noch, wenn Sie eine von server.js
bereitgestellte Ressource server.js
Sie eine 404
. Aus diesem Grund ist das Umschreiben von URLs für IISNode-Webanwendungen erforderlich.
<rewrite>
<rules>
<!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
<rule name="StaticContent" patternSyntax="Wildcard">
<action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
</conditions>
<match url="*.*"/>
</rule>
<!-- All other URLs are mapped to the Node.js application entry point -->
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
</conditions>
<action type="Rewrite" url="server.js"/>
</rule>
</rules>
</rewrite>
Dies ist eine funktionierende Web.config
Datei für dieses Beispiel , für eine 64-Bit-Installation von Web.config
Besuchen Sie jetzt Ihre IIS-Site und sehen Sie, wie Ihre Node.js-Anwendung funktioniert.
Verwenden eines virtuellen IIS-Verzeichnisses oder einer geschachtelten Anwendung über
Die Verwendung eines virtuellen Verzeichnisses oder einer geschachtelten Anwendung in IIS ist ein häufiges Szenario, das Sie bei der Verwendung von IISNode am ehesten nutzen möchten.
IISNode bietet keine direkte Unterstützung für virtuelle Verzeichnisse oder geschachtelte Anwendungen über die Konfiguration. Um dies zu erreichen, müssen wir eine Funktion von IISNode nutzen, die nicht Teil der Konfiguration ist und viel weniger bekannt ist. Alle Kinder des <appSettings>
Elements mit dem Web.config
werden das hinzugefügt process.env
Objekt als Eigenschaften des appSetting Schlüssel.
Ermöglicht das Erstellen eines virtuellen Verzeichnisses in unseren <appSettings>
<appSettings>
<add key="virtualDirPath" value="/foo" />
</appSettings>
In unserer Node.js-App können wir auf die Einstellung von virtualDirPath
zugreifen
console.log(process.env.virtualDirPath); // prints /foo
Nun, da wir das Element <appSettings>
zur Konfiguration verwenden können, können wir dies nutzen und in unserem Servercode verwenden.
// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';
// We also want to make sure that our virtualDirPath
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
virtualDirPath = '/' + virtualDirPath;
// Setup a route at the index of our app
server.get(virtualDirPath, (req, res) => {
return res.status(200).send('Hello World');
});
Wir können den virtualDirPath auch mit unseren statischen Ressourcen verwenden
// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));
Lass uns das alles zusammenstellen
const express = require('express');
const server = express();
const port = process.env.PORT || 3000;
// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';
// We also want to make sure that our virtualDirPath
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
virtualDirPath = '/' + virtualDirPath;
// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));
// Setup a route at the index of our app
server.get(virtualDirPath, (req, res) => {
return res.status(200).send('Hello World');
});
server.listen(port, () => {
console.log(`Listening on ${port}`);
});
Socket.io mit IISNode verwenden
Damit Socket.io mit IISNode arbeiten kann, sind die einzigen Änderungen, die erforderlich sind, wenn kein virtuelles Verzeichnis / geschachtelte Anwendung verwendet wird, in der Web.config
.
Da Socket.io Anforderungen sendet, die mit /socket.io
, muss IISNode IIS mitteilen, dass diese ebenfalls mit IISNode behandelt werden sollten und nicht nur statische Dateianforderungen oder anderer Datenverkehr sind. Dies erfordert einen anderen <handler>
als Standard-IISNode-Apps.
<handlers>
<add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>
Zusätzlich zu den Änderungen an den <handlers>
wir eine zusätzliche URL-Umschreibregel hinzufügen. Die Umschreibungsregel sendet den gesamten /socket.io
an unsere Server-Datei, auf der der Socket.io-Server ausgeführt wird.
<rule name="SocketIO" patternSyntax="ECMAScript">
<match url="socket.io.+"/>
<action type="Rewrite" url="server.js"/>
</rule>
Wenn Sie IIS 8 verwenden, müssen Sie Ihre webSockets-Einstellung in Ihrer Web.config
deaktivieren und zusätzlich die obigen Web.config
und Umschreiberegeln hinzufügen. Dies ist in IIS 7 nicht erforderlich, da es keine Unterstützung für webSocket gibt.
<webSocket enabled="false" />