Поддерживать работу приложения узла в службе приложений Azure

#node.js #azure #azure-web-app-service #iisnode

#node.js #azure #azure-web-app-service #iisnode

Вопрос:

Я развернул веб-приложение node js в службе приложений в Azure. Проблема в том, что мое приложение иногда убивается по неизвестной причине. Я выполнил исчерпывающий поиск по всем штрафам журнала, используя kudu.

Если я перезапущу службу приложений, приложение начнет работать.

Могу ли я каким-либо образом перезапустить свое приложение узла после его сбоя. Вид запуска навсегда, несмотря ни на что. Например, если какая-либо ошибка возникает в asp.net код, развернутый в IIS, IIS никогда не выходит из строя, он продолжает обслуживать другие входящие запросы.

Что-то вроде использования forever / pm2 в службе приложений Azure.

Ответ №1:

node.js в Azure App Services работает на базе IISNode, который выполняет все, что вы описали, включая мониторинг вашего процесса на предмет сбоев и его перезапуск.

Рассмотрим следующий POC:

 var http = require('http');    
http.createServer(function (req, res) {
    if (req.url == '/bad') {
        throw 'bad';
    }
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('bye');
}).listen(process.env.PORT || 1337);
 

Если я размещу это в веб-приложении и выдам следующую последовательность запросов:

  1. ПОЛУЧИТЬ /
  2. ПОЛУЧИТЬ / ошибка
  3. ПОЛУЧИТЬ /

Тогда первое выдаст HTTP 200, второе отправит на сервер и выдаст HTTP 500, а третье выдаст HTTP 200 без необходимости что-либо делать. IISNode просто обнаружит сбой и перезапустит процесс.

Поэтому вам не понадобится PM2 или аналогичное решение, поскольку оно встроено в службы приложений. Однако, если вы действительно хотите, у них теперь есть App Services Preview в Linux, который работает на PM2 и позволяет настраивать PM2. Подробнее об этом здесь . Но опять же, вы уже получаете это из коробки.

Еще одна вещь, которую следует учитывать, — это всегда включенная настройка, которая включена по умолчанию:

По умолчанию веб-приложения выгружаются, если они простаивают в течение некоторого периода времени. Это позволяет системе экономить ресурсы. В базовом или стандартном режиме вы можете включить всегда включено, чтобы приложение постоянно загружалось. Если ваше приложение выполняет непрерывные веб-задания, вам следует включить «Всегда включено», иначе веб-задания могут выполняться ненадежно.

Это еще одна возможная основная причина вашей проблемы, и решение состоит в том, чтобы отключить Always On для вашего веб-приложения (см. Ссылку выше).

Комментарии:

1. Не уверен, в чем проблема. Не похоже, что iisnode перезапускается автоматически

2. попробуйте включить подробное ведение журнала и отслеживать вывод на консоль с помощью опции потоковой передачи журнала в веб-приложении

3. Отвечает ли это на ваш первоначальный вопрос? Если да, пожалуйста, отметьте как ответ

4. К сожалению, при подробном включении не получается никакой полезной информации. Все еще ищете решение

5. Решение чего ..? ваш вопрос касается обнаружения сбоев в node.exe и перезапускается автоматически, верно?

Ответ №2:

Я действительно хочу поблагодарить itaysk за вашу поддержку в этой проблеме.

Проблема была не в том, что я подозревал. На самом деле сервер узла перезапускался при сбое правильно.

Возникла другая проблема. Причина, по которой мой веб-сайт не реагировал, кроется в другой причине. Вот что происходило-

Мы использовали rethinkdbdash для подключения к базе данных rethinkdb и использовали пул соединений. Возникла проблема с кодированием / дизайном. У нас есть около 15 каналов изменений, реализованных вместе с socket.io . И канал изменений инициализировался для каждого пользователя, вошедшего в систему. Это увеличивало количество активных подключений в пуле. И rethinkdbdash имеет ограничение по умолчанию в 1000 подключений в пуле, и, поскольку было много активных подключений, все доступные соединения в пуле были исчерпаны, в результате чего больше не было доступного соединения. Итак, запрос ожидал открытого соединения, и оно не было доступно, следовательно, ожидая, что когда-либо будут блокированы любые новые запросы для обслуживания.