Recherche…


Remarques

Répertoire virtuel / Application imbriquée avec des débordements de vues

Si vous envisagez d'utiliser Express pour afficher des vues à l'aide d'un moteur de visualisation, vous devez transmettre la valeur virtualDirPath à vos vues.

`res.render('index', { virtualDirPath: virtualDirPath });`

La raison en est que vos liens hypertexte vers d'autres vues sont hébergés par votre application et que les chemins de ressources statiques vous permettent de savoir où le site est hébergé sans devoir modifier toutes les vues après le déploiement. C'est l'un des pièges les plus ennuyeux et fastidieux de l'utilisation des répertoires virtuels avec IISNode.

Des versions

Tous les exemples ci-dessus fonctionnent avec

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x ou supérieur

Commencer

IISNode permet aux applications Web Node.js d'être hébergées sur IIS 7/8, comme le ferait une application .NET. Bien sûr, vous pouvez héberger vous-même votre processus node.exe sous Windows, mais pourquoi faire alors que vous pouvez simplement exécuter votre application dans IIS.

IISNode prendra en charge la mise à l'échelle sur plusieurs cœurs, la gestion des processus de node.exe et le recyclage automatique de votre application IIS à chaque mise à jour de votre application, pour ne citer que quelques-uns de ses avantages .

Exigences

IISNode a quelques exigences avant de pouvoir héberger votre application Node.js dans IIS.

  1. Node.js doit être installé sur l'hôte IIS, 32 bits ou 64 bits, soit pris en charge.
  2. IISNode installé x86 ou x64 , cela devrait correspondre au bitness de votre hôte IIS.
  3. Le module Microsoft URL-Rewrite pour IIS installé sur votre hôte IIS.
    • C'est la clé, sinon les demandes à votre application Node.js ne fonctionneront pas comme prévu.
  4. Un Web.config dans le dossier racine de votre application Node.js.
  5. Configuration IISNode via un fichier iisnode.yml ou un élément <iisnode> dans votre fichier Web.config .

Exemple de base Hello World utilisant Express

Pour que cet exemple fonctionne, vous devez créer une application IIS 7/8 sur votre hôte IIS et ajouter le répertoire contenant l'application Web Node.js en tant que répertoire physique. Assurez-vous que votre identité de pool d'applications / applications peut accéder à l'installation Node.js. Cet exemple utilise l'installation Node.js 64 bits.

Projet Strucure

C'est la structure de projet de base d'une application Web IISNode / Node.js. Il semble presque identique à toute application Web non IISNode, à l'exception de l'ajout de Web.config .

- /app_root
  - package.json
  - server.js
  - Web.config

server.js - Application Express

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}`);
});

Configuration & Web.config

Web.config est comme tout autre Web.config IIS, à l'exception des deux éléments suivants: URL <rewrite><rules> et IISNode <handler> . Ces deux éléments sont des enfants de l'élément <system.webServer> .

Configuration

Vous pouvez configurer IISNode en utilisant un fichier iisnode.yml ou en ajoutant l'élément <iisnode> tant qu'enfant de <system.webServer> dans votre Web.config . Ces deux configurations peuvent être utilisées conjointement, mais dans ce cas, Web.config devra spécifier le fichier iisnode.yml ET les conflits de configuration seront pris à partir du fichier iisnode.yml . Ce remplacement de configuration ne peut pas se produire dans l'autre sens.

Gestionnaire IISNode

Pour qu'IIS sache que server.js contient notre application Web Node.js, nous devons le lui indiquer explicitement. Nous pouvons le faire en ajoutant le <handler> IISNode à l'élément <handler> handlers <handlers> .

<handlers>
  <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>

Règles de réécriture d'URL

La dernière partie de la configuration consiste à s'assurer que le trafic destiné à notre application Node.js entrant dans notre instance IIS est dirigé vers IISNode. Sans règles de réécriture d'URL, nous aurions besoin de visiter notre application en accédant à http://<host>/server.js et, pire encore, en essayant de demander une ressource fournie par server.js vous obtiendrez un 404 . C'est pourquoi la réécriture d'URL est nécessaire pour les applications Web IISNode.

<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>

Ceci est un fichier Web.config fonctionnel pour cet exemple , une configuration pour une installation Node.js 64 bits.


Ça y est, maintenant visitez votre site IIS et voyez votre application Node.js fonctionner.

Utiliser un répertoire virtuel IIS ou une application imbriquée via

L'utilisation d'un répertoire virtuel ou d'une application imbriquée dans IIS est un scénario courant et très probable que vous souhaiterez utiliser lors de l'utilisation d'IISNode.

IISNode ne fournit pas de prise en charge directe des répertoires virtuels ou des applications imbriquées via la configuration. Pour y parvenir, nous devons tirer parti d'une fonctionnalité d'IISNode qui ne fait pas partie de la configuration et qui est beaucoup moins connue. Tous les enfants de l'élément <appSettings> avec Web.config sont ajoutés à l'objet process.env tant que propriétés à l'aide de la clé appSetting.

Permet de créer un répertoire virtuel dans nos <appSettings>

<appSettings>
  <add key="virtualDirPath" value="/foo" />
</appSettings>

Dans notre application Node.js, nous pouvons accéder au paramètre virtualDirPath

console.log(process.env.virtualDirPath); // prints /foo

Maintenant que nous pouvons utiliser l'élément <appSettings> pour la configuration, profitons-en et utilisons-le dans notre code de serveur.

// 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');
});

Nous pouvons également utiliser virtualDirPath avec nos ressources statiques

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

Permet de mettre tout cela ensemble

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}`);
});

Utiliser Socket.io avec IISNode

Pour que Socket.io fonctionne avec IISNode, les seules modifications nécessaires lorsque vous n'utilisez pas un répertoire virtuel / une application imbriquée se trouvent dans Web.config .

Étant donné que Socket.io envoie des requêtes commençant par /socket.io , IISNode doit communiquer à IIS pour que ces requêtes soient également gérées par IISNode et ne soient pas uniquement des requêtes de fichiers statiques ou un autre trafic. Cela nécessite un <handler> différent des applications IISNode standard.

<handlers>
    <add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>

Outre les modifications apportées aux <handlers> nous devons également ajouter une règle de réécriture d'URL supplémentaire. La règle de réécriture envoie tout le trafic /socket.io à notre fichier serveur sur lequel le serveur Socket.io est exécuté.

<rule name="SocketIO" patternSyntax="ECMAScript">
    <match url="socket.io.+"/>
    <action type="Rewrite" url="server.js"/>
</rule>

Si vous utilisez IIS 8, vous devez désactiver le paramètre webSockets dans votre fichier Web.config en plus de l'ajout du gestionnaire ci-dessus et des règles de réécriture. Cela n'est pas nécessaire dans IIS 7 car il n'y a pas de prise en charge de webSocket.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow