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.

  1. Auf dem IIS-Host muss Node.js installiert sein, 32-Bit oder 64-Bit werden unterstützt.
  2. Wenn IISNode x86 oder x64 installiert ist, sollte dies mit der Bitgröße Ihres IIS-Hosts übereinstimmen.
  3. 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.
  4. Eine Web.config im Stammverzeichnis Ihrer Node.js-App.
  5. IISNode-Konfiguration über eine iisnode.yml Datei oder ein <iisnode> -Element in Ihrer Web.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" />



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow