Node.js
Använda IISNode för att vara värd för Node.js webbappar i IIS
Sök…
Anmärkningar
Virtual Directory / Nested Application with Views Pitfall
Om du ska använda Express för att återge vyer med hjälp av en View Engine måste du virtualDirPath
värdet till dina vyer
`res.render('index', { virtualDirPath: virtualDirPath });`
Anledningen till att göra detta är att göra dina hyperlänkar till andra vyer värda av din app och statiska resursvägar för att veta var webbplatsen är värd utan att behöva ändra alla vyer efter installationen. Detta är en av de mer irriterande och tråkiga fallgroparna med att använda virtuella kataloger med IISNode.
versioner
Alla exemplen ovan fungerar med
- Express v4.x
- IIS 7.x / 8.x
- Socket.io v1.3.x eller högre
Komma igång
IISNode tillåter Node.js webbappar att vara värd på IIS 7/8 precis som en .NET-applikation skulle göra. Naturligtvis kan du själv värd för din node.exe
process i Windows men varför gör du det när du bara kan köra din app i IIS.
IISNode kommer att hantera skalning över flera kärnor, processhantering av node.exe
och automatiskt återvinna din IIS-applikation när din app uppdateras, bara för att nämna några av dess fördelar .
Krav
IISNode har några krav innan du kan vara värd för din Node.js-app i IIS.
- Node.js måste installeras på IIS-värden, 32-bitars eller 64-bitars, antingen stöds.
- IISNode installerade x86 eller x64 , detta ska matcha biten hos din IIS-värd.
- Microsoft URL-omskrivningsmodul för IIS installerad på din IIS-värd.
- Detta är nyckel, annars fungerar inte förfrågningar till din Node.js-app som förväntat.
- En
Web.config
iWeb.config
för din Node.js-app. - IISNode-konfiguration via en
iisnode.yml
fil eller ett<iisnode>
-element i dinWeb.config
.
Grundläggande Hello World-exempel med Express
För att detta exempel ska fungera måste du skapa en IIS 7/8-app på din IIS-värd och lägga till katalogen som innehåller Node.js-webbapp som fysisk katalog. Se till att din Application / Application Pool Identity har åtkomst till Node.js-installationen. Det här exemplet använder Node.js 64-bitarsinstallation.
Projektstruktur
Detta är den grundläggande projektstrukturen för en IISNode / Node.js webbapp. Den ser nästan identisk ut med alla webbappar som inte är IISNode förutom tillägget av Web.config
.
- /app_root
- package.json
- server.js
- Web.config
server.js - Expressapplikation
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
Web.config
är precis som alla andra IIS Web.config
förutom att följande två saker måste vara närvarande, URL <rewrite><rules>
och en IISNode <handler>
. Båda dessa element är barn av <system.webServer>
.
Konfiguration
Du kan konfigurera IISNode genom att använda en iisnode.yml
fil eller genom att lägga till <iisnode>
-elementet som ett barn till <system.webServer>
i din Web.config
. Båda dessa konfigurationer kan användas i samband med varandra, men i detta fall Web.config
ange iisnode.yml
filen OCH alla konfigurationskonflikter kommer att tas från iisnode.yml
filen istället . Denna konfigurationsöverskridande kan inte ske tvärtom.
IISNode Handler
För att IIS ska veta att server.js
innehåller vår Node.js webbapp måste vi uttryckligen berätta det. Vi kan göra detta genom att lägga till IISNode <handler>
till elementet <handlers>
.
<handlers>
<add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>
Regler för URL-omskrivning
Den sista delen av konfigurationen är att se till att trafik avsedd för vår Node.js-app som kommer till vår IIS-instans riktas till IISNode. Utan URL-omskrivningsregler skulle vi behöva besöka vår app genom att gå till http://<host>/server.js
och ännu värre, när du försöker begära en resurs från server.js
får du en 404
. Det är därför URL-omskrivning är nödvändig för IISNode-webbappar.
<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>
Detta är en fungerande Web.config
fil för detta exempel , installation för en 64-bitars Node.js-installation.
Det är det, besök nu din IIS-webbplats och se din Node.js-applikation fungera.
Med hjälp av en IIS Virtual Directory eller Nested Application via
Att använda en virtuell katalog eller en kapslad applikation i IIS är ett vanligt scenario och sannolikt ett som du vill utnyttja när du använder IISNode.
IISNode tillhandahåller inte direkt stöd för virtuella kataloger eller kapslade applikationer via konfiguration så för att uppnå detta måste vi dra fördel av en funktion i IISNode som inte är en del av konfigurationen och är mycket mindre känd. Alla barn i <appSettings>
med Web.config
läggs till i process.env
objektet som egenskaper med appSetting-tangenten.
Låter skapa en virtuell katalog i <appSettings>
<appSettings>
<add key="virtualDirPath" value="/foo" />
</appSettings>
I vår Node.js-app kan vi komma virtualDirPath
inställningen virtualDirPath
console.log(process.env.virtualDirPath); // prints /foo
Nu <appSettings>
vi kan använda <appSettings>
för konfiguration, låter vi dra nytta av det och använda det i vår serverkod.
// 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');
});
Vi kan också använda virtualDirPath med våra statiska resurser
// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));
Kan sätta ihop allt detta
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}`);
});
Använda Socket.io med IISNode
För att få Socket.io att arbeta med IISNode, är de enda ändringar som krävs när du inte använder en Virtual Directory / Nested Application inom Web.config
.
Eftersom Socket.io skickar förfrågningar som börjar med /socket.io
, måste IISNode kommunicera till IIS att dessa också ska hanteras IISNode och inte bara är statiska filförfrågningar eller annan trafik. Detta kräver en annan <handler>
än standard IISNode-appar.
<handlers>
<add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>
Förutom ändringarna i <handlers>
måste vi också lägga till en extra URL-omskrivningsregel. Omskrivningsregeln skickar all /socket.io
till vår serverfil där Socket.io-servern körs.
<rule name="SocketIO" patternSyntax="ECMAScript">
<match url="socket.io.+"/>
<action type="Rewrite" url="server.js"/>
</rule>
Om du använder IIS 8 måste du inaktivera inställningen för webSockets i din Web.config
förutom att lägga till ovanstående hanterare och skriva om reglerna. Detta är onödigt i IIS 7 eftersom det inte finns något webSocket-stöd.
<webSocket enabled="false" />