#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);
Если я размещу это в веб-приложении и выдам следующую последовательность запросов:
- ПОЛУЧИТЬ /
- ПОЛУЧИТЬ / ошибка
- ПОЛУЧИТЬ /
Тогда первое выдаст 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 подключений в пуле, и, поскольку было много активных подключений, все доступные соединения в пуле были исчерпаны, в результате чего больше не было доступного соединения. Итак, запрос ожидал открытого соединения, и оно не было доступно, следовательно, ожидая, что когда-либо будут блокированы любые новые запросы для обслуживания.