Поиск…


замечания

Виртуальный каталог / Вложенное приложение с представлениями Pitfall

Если вы собираетесь использовать Express для визуализации представлений с помощью механизма просмотра, вам нужно передать значение virtualDirPath в свои представления

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

Причина этого заключается в том, чтобы ваши гиперссылки на другие представления, размещаемые вашим приложением и статическими путями ресурсов, знали, где находится сайт, без необходимости изменять все представления после развертывания. Это одна из наиболее раздражающих и утомительных ошибок использования виртуальных каталогов с IISNode.

Версии

Все приведенные выше примеры работают с

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x или выше

Начиная

IISNode позволяет размещать веб-приложения Node.js в IIS 7/8, как и приложение .NET. Конечно, вы можете самостоятельно разместить процесс node.exe в Windows, но зачем это делать, когда вы можете просто запустить приложение в IIS.

IISNode будет обрабатывать масштабирование по нескольким ядрам, управлять процессом node.exe и автоматически перерабатывать ваше приложение IIS всякий раз, когда ваше приложение обновляется, чтобы назвать несколько его преимуществ .

Требования

У IISNode есть несколько требований, прежде чем вы сможете разместить приложение Node.js в IIS.

  1. Node.js должен быть установлен на хост IIS, 32-разрядный или 64-разрядный, либо поддерживаются.
  2. IISNode установлен x86 или x64 , это должно соответствовать битности вашего хоста IIS.
  3. Модуль URL-Rewrite Microsoft для IIS установлен на вашем хосте IIS.
    • Это ключ, иначе запросы к вашему Node.js-приложению не будут функционировать должным образом.
  4. Web.config в корневой папке вашего приложения Node.js.
  5. IISNode через файл iisnode.yml или элемент <iisnode> в вашем Web.config .

Основной пример Hello World с использованием Express

Чтобы этот пример работал, вам нужно создать приложение IIS 7/8 на хосте IIS и добавить каталог, содержащий веб-приложение Node.js в качестве физического каталога. Убедитесь, что идентификатор пула приложений / приложений может получить доступ к установке Node.js. В этом примере используется 64-разрядная установка Node.js.

Project Strucure

Это основная структура проекта веб-приложения IISNode / Node.js. Он выглядит почти идентично любому веб-приложению, отличному от IISNode, за исключением добавления Web.config .

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

server.js - Экспресс-приложение

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

Конфигурация и Web.config

Web.config аналогичен любому другому IIS Web.config за исключением следующих двух вещей: URL <rewrite><rules> и IISNode <handler> . Оба эти элемента являются <system.webServer> элементами элемента <system.webServer> .

конфигурация

Вы можете настроить IISNode с помощью iisnode.yml файл или путем добавления <iisnode> элемент в качестве дочернего <system.webServer> в вашем Web.config . Обе эти конфигурации могут использоваться совместно друг с другом, однако в этом случае Web.config должен будет указать файл iisnode.yml и любые конфликты конфигурации будут iisnode.yml файла iisnode.yml . Это переопределение конфигурации не может произойти наоборот.

Обработчик IISNode

Чтобы IIS знал, что server.js содержит наше веб-приложение Node.js, нам нужно явно сказать об этом. Мы можем сделать это, добавив IISNode <handler> к элементу <handlers> .

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

Правила перезаписи URL-адресов

Последняя часть конфигурации гарантирует, что трафик, предназначенный для нашего приложения Node.js, входящего в наш экземпляр IIS, направляется в IISNode. Без правил перезаписи URL нам нужно будет посетить наше приложение, перейдя по http://<host>/server.js и еще хуже, при попытке запросить ресурс, предоставленный server.js вы получите 404 . Вот почему переписывание URL-адресов необходимо для веб-приложений 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>

Это рабочий файл Web.config для этого примера , установка для 64-разрядной установки Node.js.


Вот и все, теперь зайдите на свой сайт IIS и посмотрите, как работает ваше приложение Node.js.

Использование виртуального каталога IIS или вложенного приложения через

Использование виртуального каталога или вложенного приложения в IIS является распространенным сценарием и, скорее всего, тем, что вы захотите использовать при использовании IISNode.

IISNode не обеспечивает прямую поддержку виртуальных каталогов или вложенных приложений через конфигурацию, поэтому для достижения этой цели нам нужно воспользоваться функцией IISNode, которая не является частью конфигурации и гораздо менее известна. Все дочерние <appSettings> с Web.config добавляются в объект process.env как свойства с помощью ключа appSetting.

Позволяет создать виртуальный каталог в нашем <appSettings>

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

В нашем приложении Node.js мы можем получить доступ к настройке virtualDirPath

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

Теперь, когда мы можем использовать элемент <appSettings> для конфигурации, давайте воспользоваться этим и использовать его в нашем коде сервера.

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

Мы также можем использовать virtualDirPath с нашими статическими ресурсами

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

Давайте все вместе

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

Чтобы получить Socket.io, работающий с IISNode, единственные изменения, необходимые при отсутствии виртуального каталога / вложенного приложения, находятся в Web.config .

Поскольку Socket.io отправляет запросы, начинающиеся с /socket.io , IISNode должен связываться с IIS, чтобы они также обрабатывались IISNode и не были только статическими файловыми запросами или другим трафиком. Для этого требуется другой <handler> чем стандартные приложения IISNode.

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

В дополнение к изменениям в <handlers> нам также необходимо добавить дополнительное правило перезаписи URL. Правило rewrite отправляет весь трафик /socket.io в наш файл сервера, на котором запущен сервер Socket.io.

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

Если вы используете IIS 8, вам нужно отключить параметр webSockets в вашем Web.config в дополнение к добавлению вышеперечисленного и переписать правила. Это не нужно в IIS 7, так как нет поддержки webSocket.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow