Node.js
Używanie IISNode do hostowania aplikacji internetowych Node.js w IIS
Szukaj…
Uwagi
Katalog wirtualny / zagnieżdżona aplikacja z pułapką wyświetleń
Jeśli zamierzasz używać Express do renderowania widoków za pomocą silnika widoków, musisz przekazać wartość virtualDirPath
do swoich widoków
`res.render('index', { virtualDirPath: virtualDirPath });`
Powodem tego jest spowodowanie, aby hiperłącza do innych widoków były hostowane przez aplikację i statyczne ścieżki zasobów, aby wiedzieć, gdzie witryna jest hostowana, bez konieczności modyfikowania wszystkich widoków po wdrożeniu. Jest to jedna z bardziej irytujących i nużących pułapek korzystania z katalogów wirtualnych z IISNode.
Wersje
Wszystkie powyższe przykłady działają z
- Express v4.x
- IIS 7.x / 8.x
- Socket.io v1.3.x lub nowszy
Pierwsze kroki
IISNode umożliwia hostowanie aplikacji sieci Web Node.js w IIS 7/8 tak, jak robiłaby to aplikacja .NET. Oczywiście możesz samodzielnie node.exe
proces node.exe
w systemie Windows, ale po co to robić, gdy możesz po prostu uruchomić aplikację w IIS.
IISNode zajmie skalowania na wiele rdzeni, proces manageement z node.exe
i auto-recykling IIS Application gdy aplikacja jest aktualizowana, żeby wymienić tylko niektóre z jego zalet .
Wymagania
IISNode ma kilka wymagań przed hostowaniem aplikacji Node.js w IIS.
- Plik Node.js musi być zainstalowany na hoście IIS, obsługiwane są wersje 32-bitowa lub 64-bitowa.
- IISNode zainstalował x86 lub x64 , powinno to pasować do bitowości twojego hosta IIS.
- Moduł Microsoft URL-Rewrite dla IIS zainstalowany na twoim hoście IIS.
- To klucz, w przeciwnym razie żądania do Twojej aplikacji Node.js nie będą działać zgodnie z oczekiwaniami.
-
Web.config
w folderze głównym aplikacji Node.js. - Konfiguracja IISNode za pomocą pliku
iisnode.yml
lub elementu<iisnode>
wWeb.config
.
Podstawowy przykład Hello World za pomocą Express
Aby ten przykład działał, musisz utworzyć aplikację IIS 7/8 na hoście IIS i dodać katalog zawierający aplikację sieci Web Node.js jako katalog fizyczny. Upewnij się, że twoja tożsamość aplikacji / puli aplikacji może uzyskać dostęp do instalacji Node.js. W tym przykładzie użyto 64-bitowej instalacji Node.js.
Struktura projektu
Jest to podstawowa struktura projektu aplikacji sieci Web IISNode / Node.js. Wygląda prawie identycznie jak każda aplikacja sieciowa inna niż IISNode, z wyjątkiem dodania Web.config
.
- /app_root
- package.json
- server.js
- Web.config
server.js - Aplikacja ekspresowa
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}`);
});
Konfiguracja i Web.config
Web.config
jest jak każdy inny Web.config
IIS, z wyjątkiem następujących dwóch rzeczy: URL <rewrite><rules>
i IISNode <handler>
moduł <handler>
. Oba te elementy są elementami potomnymi elementu <system.webServer>
.
Konfiguracja
Możesz skonfigurować IISNode przy użyciu pliku iisnode.yml
lub dodając element <iisnode>
jako element podrzędny <system.webServer>
w Web.config
. Obie te konfiguracje mogą być używane w połączeniu ze sobą, jednak w tym przypadku Web.config
będzie musiał określić plik iisnode.yml
ORAZ wszelkie konflikty konfiguracji zostaną iisnode.yml
pliku iisnode.yml
. Zastąpienie konfiguracji nie może nastąpić na odwrót.
Moduł obsługi IISNode
Aby IIS wiedział, że server.js
zawiera naszą aplikację internetową Node.js, musimy to wyraźnie powiedzieć. Możemy to zrobić poprzez dodanie IISNode <handler>
do <handlers>
elementu.
<handlers>
<add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>
Reguły przepisywania adresów URL
Ostatnią częścią konfiguracji jest zapewnienie, że ruch przeznaczony dla naszej aplikacji Node.js wchodzącej do naszego wystąpienia IIS jest kierowany do IISNode. Bez reguł przepisywania adresów URL musielibyśmy odwiedzić naszą aplikację, przechodząc do http://<host>/server.js
a nawet gorzej, gdy próbujesz poprosić o zasób dostarczony przez server.js
, otrzymasz 404
. Dlatego przepisywanie adresów URL jest konieczne w aplikacjach internetowych 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>
To jest działający plik Web.config
dla tego przykładu , skonfigurowany do instalacji 64-bitowej wersji Node.js.
To wszystko, teraz odwiedź swoją witrynę IIS i zobacz, jak działa aplikacja Node.js.
Korzystanie z katalogu wirtualnego IIS lub aplikacji zagnieżdżonej za pośrednictwem
Korzystanie z katalogu wirtualnego lub aplikacji zagnieżdżonej w usługach IIS jest częstym scenariuszem i najprawdopodobniej z niego skorzystasz podczas korzystania z IISNode.
IISNode nie zapewnia bezpośredniego wsparcia dla katalogów wirtualnych lub aplikacji zagnieżdżonych poprzez konfigurację, więc aby to osiągnąć, musimy skorzystać z funkcji IISNode, która nie jest częścią konfiguracji i jest znacznie mniej znana. Wszystkie elementy <appSettings>
elementu <appSettings>
z Web.config
są dodawane do obiektu process.env
jako właściwości za pomocą klucza appSetting.
Utwórzmy katalog wirtualny w naszym <appSettings>
<appSettings>
<add key="virtualDirPath" value="/foo" />
</appSettings>
W naszej aplikacji Node.js możemy uzyskać dostęp do ustawienia virtualDirPath
console.log(process.env.virtualDirPath); // prints /foo
Teraz, gdy możemy użyć elementu <appSettings>
do konfiguracji, skorzystajmy z tego i użyjmy go w kodzie naszego serwera.
// 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');
});
Możemy używać virtualDirPath również z naszymi statycznymi zasobami
// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));
Połączmy to wszystko razem
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}`);
});
Używanie Socket.io z IISNode
Aby Socket.io działał z IISNode, jedyne zmiany niezbędne, gdy nie używa się katalogu wirtualnego / aplikacji zagnieżdżonej, znajdują się w Web.config
.
Ponieważ Socket.io wysyła żądania zaczynające się od /socket.io
, IISNode musi komunikować się z IIS, że powinny one również być obsługiwane przez IISNode i nie są to tylko statyczne żądania plików lub inny ruch. Wymaga to innego <handler>
modułu <handler>
niż standardowe aplikacje IISNode.
<handlers>
<add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>
Oprócz zmian w <handlers>
musimy również dodać dodatkową regułę przepisywania adresów URL. Reguła przepisywania wysyła cały ruch /socket.io
do naszego pliku serwera, na którym działa serwer Socket.io.
<rule name="SocketIO" patternSyntax="ECMAScript">
<match url="socket.io.+"/>
<action type="Rewrite" url="server.js"/>
</rule>
Jeśli używasz IIS 8, musisz dodać ustawienie webSockets w Web.config
oprócz dodania powyższej procedury obsługi i przepisywania. Jest to niepotrzebne w IIS 7, ponieważ nie ma obsługi webSocket.
<webSocket enabled="false" />