Node.js
Utilisation d'IISNode pour héberger les applications Web Node.js dans IIS
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.
- Node.js doit être installé sur l'hôte IIS, 32 bits ou 64 bits, soit pris en charge.
- IISNode installé x86 ou x64 , cela devrait correspondre au bitness de votre hôte IIS.
- 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.
- Un
Web.config
dans le dossier racine de votre application Node.js. - Configuration IISNode via un fichier
iisnode.yml
ou un élément<iisnode>
dans votre fichierWeb.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" />