Хостинг node.js приложений в IIS в Windows

Автор: Tomasz Janczuk

В этoй статье я oбсуждаю хoстинг node.js appplications в IIS в Windows с пoмoщью iisnode прoекта я был в пoследнее время рабoтал.

Какие преимущества дает iisnode предoставить?

Iisnode прoект предусматривает рoднoй IIS 7.x мoдуль, кoтoрый пoзвoляет прoведение node.js прилoжений в IIS 7.x и IIS 7.x Express (WebMatrix).Прoект испoльзует Windows, сбoрка node.exe.

Некoтoрые из преимуществ хoстинга node.js прилoжений в IIS, испoльзуя iisnode мoдуль, в oтличие oт самoстoятельнoгo размещения node.exe прoцессы включают в себя:

  • Управление процессами. модуль iisnode заботится управление жизненным циклом процессов node.exe что делает его простым для повышения общей надежности. Вы не должны выполнять инфраструктуры для запуска, остановки и мониторинга процесса.
  • Масштабируемость в многоядерных серверов. С node.exe это однопоточный процесс, он только масштабами одного процессорного ядра.Модуль iisnode позволяет создавать несколько процессов node.exe в применении и балансировку нагрузки HTTP трафика между ними, следовательно, позволяет полное использование мощности процессора сервера, не требуя дополнительного кода инфраструктуры от разработчиков приложений.
  • Автоматическое обновление. Iisnode модуль гарантирует, что всякий раз, когда приложение node.js обновляется (т.е. файл сценария изменилась), node.exe процессов переработки. Текущие запросы могут корректно завершить исполнение с использованием старой версии приложения, а все новые запросы отправлены в новой версии приложения.
  • Комплексной отладки. Модуль iisnode полностью интегрирован с узлом-инспектор отладчик. Node.js приложения можно отлаживать удаленно с любого WebKit-браузер без каких-либо дополнительных настроек на стороне сервера или процесса создания.
  • Доступ к журналам через HTTP. Модуль обеспечивает доступ iisnode выходе процесса node.exe (например, порожденных console.log вызовов) через HTTP. Этот объект играет ключевую роль в оказании помощи в отладке node.js приложений, развернутых на удаленных серверах.
  • Бок о бок с другими типами контента. Iisnode модуль интегрируется с IIS таким образом, что позволяет одному веб-сайт содержит различные типы контента. Например, статический контент (HTML, CSS, изображения, и на стороне клиента JavaScript-файлы) можно эффективно обрабатывается IIS себя, а ​​node.js запросы обрабатываются iisnode. Один сайт может также объединить PHP приложений, приложений ASP.NET и node.js. Это позволяет выбрать лучшие инструменты для работы под рукой, а также прогрессивные миграции существующих приложений.
  • Минимальные изменения в код приложения node.js. Модуль позволяет iisnode хостинг существующих HTTP node.js приложений с минимальными изменениями. Обычно все, что требуется изменить перечисленные адреса сервера HTTP одного предоставляемых iisnode модуль с помощью переменной окружения process.env.PORT.
  • Встроенный управленческого опыта. Модуль issnode полностью интегрирована с системой конфигурации IIS и использует те же инструменты и механизмы и другие компоненты IIS для настройки и обслуживания.

В дополнение к преимуществам, специфичные для iisnode модуль, хостинг node.js приложений в IIS позволяет разработчикам воспользоваться набором функций IIS, среди которых:

  • Порт обмена (хостинг нескольких приложений HTTP через порт 80)
  • Безопасности (HTTPS, аутентификацию и авторизацию)
  • Перезаписи URL
  • Сжатие
  • Кэширование
  • Лесозаготовки

Привет мир

Следуйте инструкциям по установке на iisnode сайте проекта, чтобы получить модуль и образцы, устанавливаемые на Windows, окно с IIS7 включена.

Привет миру образец состоит из двух файлов: Hello.js и web.config.

Это Hello.js файл с образцом HelloWorld:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello, world! [helloworld sample]');
}).listen(process.env.PORT);

Вы заметите, что единственное различие между этим кодом и привет пример мира от первой страницы http://nodejs.org в спецификации для прослушивания адрес сервера HTTP. С IIS контролирует базовый адрес для всех слушателей HTTP, приложения должны использовать node.js слушать адресу, указанному iisnode модуль через переменную окружения process.env.PORT, а не указывать свои собственные.

Файл web.config необходимо поручить IIS, что файл содержит Hello.js node.js приложения. В противном случае IIS будет рассматривать этот файл как JavaScript на стороне клиента и служить ему в качестве статического контента. Web.config обозначает Hello.js как приложение node.js на обзорный регистрации обработчика в iisnode модуль только для этого файла:

<configuration>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="hello.js" verb="*" modules="iisnode" />
    </handlers>    
  </system.webServer>
</configuration>

Этот обработчик регистрация позволяет той же веб-сайт содержит другие *. JS файлов (например, библиотеки JQuery), что IIS будет продолжать функционировать в качестве статических файлов.

Что еще можно iisnode делать?

Для тех, кто знаком с само-хостинга приложений узла, iisnode сочетает в себе преимущества кластера, руководитель, узлов инспектор, навсегда, и узла статического в одном пакете. 

Масштабируемость в многоядерных серверов

Для каждого приложения node.js (например, Hello.js выше), iisnode модуль может создать много процессов node.exe и балансировки нагрузки трафика между ними. NodeProcessCountPerApplication параметр определяет количество node.exe процессов, которые будут созданы для каждого приложения node.js. Каждый процесс node.exe может вместить настраиваемый количество одновременных запросов (maxConcurrentRequestsPerProcess настройка).При общей квоте одновременных активных запрос был достигнут для приложений (maxConcurrentRequestsPerProcess * nodeProcessCountPerApplication), модуль iisnode начинается отказ новые запросы HTTP с 503 (сервер перегружен) код состояния. Запросы направляются по нескольким процессам node.exe отбывает node.js приложения с циклическим алгоритмом распределения нагрузки.

Автоматическое обновление

Всякий раз, когда файл JavaScript с node.js заявлении, изменилась (в результате развертывания новых), iismodule будет изящно перейти на новую версию. Все node.exe процессов, запущенных в предыдущей версии приложения, которые все еще обрабатывает запросы могут корректно завершить обработку в настраиваемые сроки (gracefulShutdownTimeout настройка). Все новые запросы, которые поступают после того, как файл JavaScript был обновлен отправляются в новый процесс node.exe, которая работает в новой версии приложения. WatchedFiles параметр определяет список файлов iisnode будут следить за изменениями.

Изменения в файл JavaScript обнаружены независимо от того, находится файл на локальной файловой системе или долю UNC, но основные механизмы разные. В случае локальной файловой системы, каталог уровне ОС просмотра используется механизм, который обеспечивает низкую латентность, асинхронные уведомления об изменении файла. В случае файлы, находящиеся на долю UNC, временные метки файлов периодически опрошенных изменения с настраиваемым интервалом (uncFileChangesPollingInterval настройка).

Комплексная отладка

С iisnode комплексной отладки вы можете удаленно отлаживать node.js приложения с помощью любого WebKit-браузер с поддержкой.

Доступ к журналам через HTTP

Чтобы помочь в отладке "console.log, iisnode модуль перенаправляет вывод порожденных процессов node.exe на стандартный вывод и стандартный поток ошибок в текстовом файле. IIS будет обслуживать эти файлы как статическое текстовое содержимое на HTTP. Захват стандартный вывод и стандартный поток ошибок в файлах управляется параметр конфигурации (loggingEnabled). Если включен, iisnode модуль создаст для каждого приложения специальный каталог для хранения файлов журнала. Каталог находится рядом с *. JS сам файл и его имя создается путем объединения *. JS имя файла с настраиваемым суффикс (logDirectoryNameSuffix настройка). Каталог будет содержит один текстовый файл в node.exe процесс посвященный запуске этого приложения node.js, эти файлы называются 0.txt, 1.txt, и т.д. с именем файла является порядковым номером процесс, обслуживающий это приложение . Журналы можно получить доступ из браузера с использованием HTTP: при приложении node.js доступны на http://mysite.com/foo.js, вывод первый процесс, обслуживающий это приложение будет по умолчанию находится по адресу http:// mysite.com/foo.js.logs/0.txt.

LogDirectoryNameSuffix настраивается для обеспечения запутывания журнала место в тех случаях, когда услуга доступна общественности. На самом деле, он может быть установлен в криптографически безопасными или иначе трудно догадаться строки (например GUID), чтобы обеспечить прагматический уровень журналы конфиденциальности. Например, установив logDirectoryNameSuffix в журналах "A526A1F2-4E22-4488-B930-6A71CC7649CD" будет выставлено на http://mysite.com/foo.js.A526A1F2-4E22-4488-B930-6A71CC7649CD/0.txt.

Лог-файлы не могут расти неограниченно. Установка maxLogFileSizeInKB контролирует максимальный размер лог-файла. Когда журнал растет за этим пределом, iisnode модуль будет обрезать его.

Существующие файлы журнала могут быть либо добавляются или создается пустой (журнал имена файлов для процессов с тем же порядковым номером и то же). Это контролируется appendToExistingLog конфигурационных настроек. Наконец, logFileFlushInterval параметр определяет, как часто файл журнала записывается на диск.

Бок о бок с другими типами содержимого

Одним из наиболее интересных преимуществ хостинга node.js приложений в IIS, используя iisnode модуль поддержки для различных типов содержимого в пределах одного сайта. Рядом с приложением node.js можно провести статические файлы HTLM, на стороне клиента JavaScript скрипты, PHP скрипты, приложения ASP.NET, WCF услуг, и другие типы содержимого IIS поддерживает. Так же, как iisnode модуль обрабатывает node.js приложений в той или иной сайт, другие типы контента будут обработаны зарегистрированные обработчики IIS.

Указывает, какие файлы в веб-сайта node.js приложений и должны решаться iisnode модуля осуществляется РЕГИСТРАЦИЯ iinode обработчик для этих файлов в web.config. В простейшем случае, можно зарегистрировать iisnode модуль для одного * JS файл на веб-сайт с помощью 'путь' атрибут 'добавить' элемент в коллекцию обработчиков.:

<configuration>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="hello.js" verb="*" modules="iisnode" />
    </handlers>
  </system.webServer>
</configuration>

Кроме того, можно решить, что все файлы в данном каталоге должны рассматриваться как node.js приложений. Web.config использованием <location> элемент может быть использован для достижения такой конфигурации:

<configuration>
  <location path="nodejsapps">
    <system.webServer>
      <handlers>
        <add name="iisnode" path="*.js" verb="*" modules="iisnode" />
      </handlers>   
    </system.webServer>
  </location>
</configuration>

Одна другой подход можно использовать для дифференциации node.js приложений на стороне клиента сценариев JavaScript, присваивая расширения имени файла node.js приложений, отличных от *. JS, например, *. NJS. Это позволяет глобальным регистрацию обработчика iisnode, которые могут применяться для всех сайтов на данной машине, так как * NJS продолжение единственно.:

<configuration>
  <system.webServer>
    <handlers>
      <add name="iisnode" path="*.njs" verb="*" modules="iisnode" />
    </handlers>    
  </system.webServer>
</configuration>

Перезаписи URL

Iisnode Модуль формирует очень хорошо перезаписи URL модуля для IIS. Перезаписи URL позволяет нормализовать URL пространство приложения и решить, какие обработчики IIS несут ответственность за какие части URL пространства. Например, вы можете использовать перезапись URL для обслуживания статического контента с использованием IIS'es родной обработчик статический контент (который является более эффективным способом сделать это, что служение статического контента с node.js), а только позволяя iisnode обработки динамического контента.

Вы хотите, чтобы использовать перезапись URL для большинства веб-сайте node.js приложений, развернутых в iisnode, в частности тех, которые используют в рамках явной или других MVC рамки. 

Минимальные изменения в существующие HTTP код приложения node.js

Это было стремление к iisnode не требует больших изменений в существующих резидентных node.js HTTP приложения. В связи с этим, большинство приложений требуют лишь изменения в спецификации слушать адрес сервера HTTP, так что адрес назначается IIS, а не оставил для применения на выбор. Iisnode модуль пройдет слушать обращение к node.exe рабочий процесс в переменной окружения PORT, и приложение может читать ее от process.env.PORT:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('I am listening on ' + process.env.PORT);
}).listen(process.env.PORT);  

Если вы получаете доступ к конечной точке созданные приложением выше, вы заметите, приложение на самом деле слушает именованный канал адрес.Это происходит потому, iisnode модуль использует HTTP по именованным каналам, как механизм связи между модулем и рабочий процесс node.exe.Одним из следствий этого является HTTPS приложения должны быть переработан для использования HTTP вместо HTTPS. Для тех приложений, HTTPS может настраиваться и управляться на уровне IIS себя.

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

Iisnode модуль позволяет многие параметры конфигурации быть скорректированы с system.webServer / iisnode разделе web.config. Ниже приведен список опций (большинство из которых были описаны выше) с их значениями по умолчанию. Подробную и актуальную описание опций смотрите пример конфигурации.

<iisnode      
  nodeProcessCommandLine="&quot;%programfiles%\nodejs\node.exe&quot;"
  node_env="%node_env%"
  nodeProcessCountPerApplication="1"
  maxConcurrentRequestsPerProcess="1024"
  maxNamedPipeConnectionRetry="3"
  namedPipeConnectionRetryDelay="2000"      
  maxNamedPipeConnectionPoolSize="512"
  maxNamedPipePooledConnectionAge="30000"
  asyncCompletionThreadCount="0"
  initialRequestBufferSize="4096"
  maxRequestBufferSize="65536"
  watchedFiles="*.js"
  uncFileChangesPollingInterval="5000"      
  gracefulShutdownTimeout="60000"
  loggingEnabled="true"
  logDirectoryNameSuffix="logs"
  debuggingEnabled="true"
  debuggerPortRange="5058-6058"
  debuggerPathSegment="debug"
  maxLogFileSizeInKB="128"
  appendToExistingLog="false"
  logFileFlushInterval="5000"
  devErrorsEnabled="true"
  flushResponse="false"      
  enableXFF="false"
  promoteServerVars=""
 />

Комплексная опыт управления

Конфигурация iisnode модульная система интегрирована с IIS конфигурации, которая позволяет общего управления IIS инструменты, которые будут использоваться для управления им. В частности, инструмент appcmd.exe управления, который поставляется с IIS может быть использован для увеличения iismodule конфигурации. Например, чтобы установить maxProcessCountPerApplication значение 2 для "Default Web Site / узел" приложения, можно выполнить следующую команду:

%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/node" 
-section:iisnode /maxProcessCountPerApplication:2

Это позволяет сценариев конфигурации node.js приложений, развернутых в IIS.

Обратная связь

Iisnode проект с открытым исходным кодом на GitHub. Я надеюсь, вы найдете ее полезной. Пожалуйста, сообщайте ошибки, обмениваться идеями и опытом, оставив комментарий здесь или через https://github.com/tjanczuk/iisnode/issues.