Почему node.js не загружает сайт после перезагрузки сервера?

Я использую Windows Server Standard 2019 для размещения веб-сайта Angular 11 Universal с ASP.net Core 3.1.1. Сайт работал отлично до перезагрузки сервера. Я сделал много тестов, чтобы убедиться, что нет утечки памяти или какой-либо ошибки из приложения angular, и все абсолютно идеально. Затем мне пришлось перезапустить сервер, чтобы установить некоторые обновления Windows, после чего сайт перестал работать. Делает бесконечную загрузку.

Дело в том, что если я остановлю среду выполнения JavasScript Node.js, работающую в фоновых процессах, которые запускаются после перезапуска сервера, и немедленно обновлю веб-сайт, Node запустит новый процесс, и веб-сайт будет работать должным образом до следующего перезапуска сервера. Я сделал много других тестов, чтобы найти этот конкретный сценарий.

Итак, я не уверен, как это решить. Естественно, я хочу, чтобы сайт работал сразу после перезагрузки сервера без какого-либо вмешательства с моей стороны. Вот файлы и конфигурации, которые, я думаю, должны помочь решить проблему, дайте мне знать, если вам нужна дополнительная информация:

Структура папок сайта:

  • дист (папка)
  • iisnode (папка)
  • main.js
  • node_start.cmd
  • Web.config

Сначала я установил nodejs 14.16.0 LTS, затем 15.11.0 Current, а также Url Rewrite 2.1 и iisnode-full-v0.2.21-x64.

IIS - это версия 10. Я попытался настроить пулы приложений на:

  • Немедленно запустить пул приложений
  • Режим запуска: Всегда работает
  • Действие по тайм-ауту простоя: приостановить
  • Максимальный рабочий процесс: 0
  • Предварительная загрузка включена: True

Я повторяю, что веб-сайт работает должным образом, когда я завершаю среду выполнения JavasScript Node.js в фоновом режиме, которая запускается после перезапуска сервера, а затем нажимаю «Обновить», чтобы перейти на веб-сайт. Наконец, сайт работает с действующим SSL-сертификатом.

Здесь содержимое node_start.cmd

cd C:\inetpub\wwwroot\championstogether C:\Program Files\nodejs\node.exe C:\inetpub\wwwroot\championstogether\main.js

Затем Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
    <system.webServer>        
      <handlers>
                <add name="StaticFilesCss" path="*.css" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />  
                <add name="StaticFilesPng" path="*.png" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="iisnode" path="main.js" verb="*" modules="iisnode" responseBufferLimit="0" />
      </handlers>
      <iisnode nodeProcessCommandLine="C:\Program Files\nodejs\node.exe --no-deprecation --no-warnings" 
        flushResponse="false" 
                promoteServerVars="HTTP_UID,HTTP_PUBCOOKIE_USER,LOGON_USER,HTTP_SHIBSESSIONID"
                node_env="production"
                nodeProcessCountPerApplication="0"
                debugHeaderEnabled="false"
                devErrorsEnabled="false"
        gracefulShutdownTimeout="60000"
        maxConcurrentRequestsPerProcess="1024"
        maxNamedPipeConnectionRetry="100"
        namedPipeConnectionRetryDelay="250"
        maxNamedPipeConnectionPoolSize="512"
        maxNamedPipePooledConnectionAge="30000"
        asyncCompletionThreadCount="0"
        initialRequestBufferSize="4096"
        maxRequestBufferSize="65536"
        uncFileChangesPollingInterval="5000"
        loggingEnabled="true"
        logDirectory="iisnode"
        debuggingEnabled="true"
        debuggerPortRange="5058-6058"
        debuggerPathSegment="debug"
        maxLogFileSizeInKB="128"
        maxTotalLogFileSizeInKB="1024"
        maxLogFiles="20"
        enableXFF="false"
        configOverrides="iisnode.yml"
                watchedFiles="web.config;*.js;routes\*.js;views\*.pug"/>
      <rewrite>
        <rules>
            <rule name="DynamicContent">
                 <match url="/*" />
                 <action type="Rewrite" url="main.js" />
            </rule>
            <rule name="StaticContent" stopProcessing="true">  
                  <match url="([\S]+[.](jpg|jpeg|gif|css|png|js|ts|cscc|less|ico|html|map|svg))" />
                  <action type="None" />
            </rule>
         <rule name="SocketIO" patternSyntax="ECMAScript">
               <match url="socket.io.+"/>
            <action type="Rewrite" url="main.js"/>
         </rule>
          <!-- Don't interfere with requests for node-inspector debugging -->
          <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
            <match url="^main.js\/debug[\/]?"/>
          </rule>
       </rules>
      </rewrite>
      <!-- Make sure error responses are left untouched -->
    <httpErrors existingResponse="PassThrough" />
    <modules runAllManagedModulesForAllRequests="false" />
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" />
      <remove fileExtension=".svg" />
      <remove fileExtension=".eot" />
      <remove fileExtension=".ttf" />
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />
      <remove fileExtension=".otf" />
      <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
      <mimeMap fileExtension=".woff" mimeType="application/x-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/x-woff" />
      <mimeMap fileExtension=".otf" mimeType="application/otf" />
     </staticContent>    
    </system.webServer>
    </location>
  </configuration>

Спасибо за любую помощь,

Саманта


person Samantha Létourneau    schedule 12.03.2021    source источник


Ответы (2)


Саманта -

Судя по вашему файлу web.config, вы используете модуль iisnode. На самом деле в модуле iisnode есть ошибка, требующая ручного перезапуска процесса Node.js после перезагрузки сервера, и, насколько мне известно, окончательное исправление так и не было разработано.

Хотя теперь Microsoft владеет кодом, они не создавали его и не поддерживают его активно. Честно говоря, я удивлен, что они еще не опубликовали официальное уведомление об устаревании.

Альтернативные варианты запуска приложений node.js в IIS — либо использовать модуль ARR (обратный прокси-сервер), либо модуль HttpPlatformHandler. ARR чрезвычайно общий; он не поддерживает конкретные переменные Node.js или даже спецификацию того, что Node используется в web.config.

Я бы предложил использовать модуль HttpPlatformHandler, который может управлять любым процессом, включая Node, а также любыми прокси-запросами к родительскому процессу и от него. Хотя этот модуль по-прежнему является обратным прокси-сервером, его можно настроить для процесса node.js. web.config должно выглядеть примерно так.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="main.js" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
        <httpPlatform processPath="C:\Program Files\nodejs\node.exe"
                      arguments="" 
                      startupTimeLimit=20
                      startupRetryCount=10
                      rapidFailsPerMinute=10
                      requestTimeout="00:02:00"
                      stdoutLogEnabled=true
                      stdoutLogFile="httpplatform-stdout"
                      processesPerApplication=0
                      forwardWindowsAuthToken=false>
            <environmentVariables>
                <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
                <environmentVariable name="NODE_ENV" value="Production" />
            </environmentVariables>
         </httpPlatform>
     // add the config details for the rest of your module here
  </system.webServer>
</configuration>

ДОПОЛНИТЕЛЬНЫЕ ССЫЛКИ --

Официальный

Microsoft Документация

Страница загрузки и поддержки

Сообщество

Тема обсуждения конфигурации узла и IIS

Статья в блоге Питера Эйзермана

person killshot13    schedule 12.03.2021
comment
Сам бы я такое не нашел, спасибо большое! Я сделал несколько попыток с httpPlaform, и он отлично работает, но похоже, что я не могу настроить большинство параметров iisnode. Я покажу новый web.config в эти выходные. - person Samantha Létourneau; 13.03.2021
comment
Я заметил, что некоторые из ограничений, доступных в iisnode, либо не переводятся напрямую, либо полностью отсутствуют в httpplatform. Предположительно, это связано с тем, что последний не является специфичным для Node и, следовательно, является более обобщенным. Надеюсь, вы сможете найти альтернативные средства принудительного применения указанных параметров или, возможно, даже полностью исключить некоторые из них. - person killshot13; 17.03.2021

Основываясь на ответе @ killshot13, я заставил nodejs работать с HttpPlatformHandler. Сайт загружается примерно 3 минуты в первый раз после перезагрузки сервера. Я немного разочарован тем, что не могу настроить nodejs с помощью nodeProcessCountPerApplication = 0 или flushResponse = false, но, возможно, кто-то еще знает, как это сделать.

Так вот ответ:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
    <system.webServer>        
      <handlers>
        <add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" requireAccess="Script" />
      </handlers>
      <httpPlatform 
           arguments=".\main.js"
           stdoutLogEnabled="true"
           stdoutLogFile=".\node.log"
           startupTimeLimit="20"
           startupRetryCount="10"
           rapidFailsPerMinute="10"
           requestTimeout="00:02:00"
           processesPerApplication="2"
           processPath="C:\Program Files\nodejs\node.exe --no-deprecation --no-warnings">
            <environmentVariables>
                <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
                <environmentVariable name="NODE_ENV" value="production" />
            </environmentVariables>            
        </httpPlatform>
      <!-- Make sure error responses are left untouched -->
    <httpErrors existingResponse="PassThrough" />
    <modules runAllManagedModulesForAllRequests="false" />
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" />
      <remove fileExtension=".svg" />
      <remove fileExtension=".eot" />
      <remove fileExtension=".ttf" />
      <remove fileExtension=".woff" />
      <remove fileExtension=".woff2" />
      <remove fileExtension=".otf" />
      <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
      <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
      <mimeMap fileExtension=".woff" mimeType="application/x-woff" />
      <mimeMap fileExtension=".woff2" mimeType="application/x-woff" />
      <mimeMap fileExtension=".otf" mimeType="application/otf" />
     </staticContent>    
    </system.webServer>
    </location>
    <system.webServer>
        <defaultDocument>
            <files>
                <clear />
                <add value="index.html" />
                <add value="index.htm" />
                <add value="iisstart.htm" />
                <add value="default.aspx" />
            </files>
        </defaultDocument>
    </system.webServer>
  </configuration>
person Samantha Létourneau    schedule 13.03.2021
comment
Рассматривали ли вы передачу nodeProcessCountPerApplication="0" и/или flushResponse="false" под arguments? Документация довольно расплывчата в отношении того, что именно здесь можно определить; это читается следующим образом. arguments -- Необязательное строковое значение. Аргументы для исполняемого файла или скрипта, указанные в параметре processPath. Там нет значения по умолчанию. - person killshot13; 17.03.2021
comment
Это то, что нужно проверять аргументами, я не проверял. Эти параметры не будут работать с processPath. Я также принял решение вернуться к iisnode и убить среду выполнения JavasScript Node.js при перезапуске сервера. Я предпочитаю иметь доступ ко всем параметрам для повышения производительности, поскольку перезапуск сервера будет происходить редко. Надеюсь, Microsoft увидит это и примет меры. - person Samantha Létourneau; 19.03.2021