Развертывание приложения Express в службах приложений Azure не отвечает на запросы HTTP-запросов на порт: 8080

Я пытаюсь развернуть свое приложение NestJs (использует экспресс-адаптер) в службах приложений Azure. В журналах докеров я получаю такую ​​ошибку:

2020-11-20T10:42:02.911Z INFO  - docker run -d -p 8947:8080 --name xxx_0_37a36398 -e WEBSITES_PORT=8080 -e WEBSITE_SITE_NAME=xxx -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=xxx.azurewebsites.net -e WEBSITE_INSTANCE_ID=xxx appsvc/node:14-lts_20200918.1 yarn start:prod 

2020-11-20T10:42:02.912Z INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2020-11-20T10:42:05.088Z INFO  - Initiating warmup request to container xxx_0_37a36398 for site xxx
2020-11-20T10:42:20.586Z INFO  - Waiting for response to warmup request for container xxx_0_37a36398. Elapsed time = 15.4982001 sec
2020-11-20T10:48:35.794Z INFO  - Waiting for response to warmup request for container xxx_0_37a36398. Elapsed time = 390.7060158 sec
2020-11-20T10:56:21.027Z INFO  - Waiting for response to warmup request for container xxx_0_37a36398. Elapsed time = 855.9388558 sec
2020-11-20T11:04:08.996Z INFO  - Waiting for response to warmup request for container xxx_0_37a36398. Elapsed time = 1323.907606 sec
2020-11-20T11:11:55.596Z INFO  - Waiting for response to warmup request for container xxx_0_37a36398. Elapsed time = 1790.5073044 sec
2020-11-20T11:12:25.625Z ERROR - Container xxx_i_0_37a36398 for site xxx did not start within expected time limit. Elapsed time = 1820.5363685 sec
2020-11-20T11:12:25.627Z ERROR - Container xxx_0_37a36398 didn't respond to HTTP pings on port: 8080, failing site start. See container logs for debugging.
2020-11-20T11:12:25.637Z INFO  - Stopping site xxx because it failed during startup.

Журнал приложений говорит, что приложение запускается успешно

2020-11-20T10:42:05.150205868Z   _____                               
2020-11-20T10:42:05.150227670Z   /  _  \ __________ _________   ____  
2020-11-20T10:42:05.150232970Z  /  /_\  \___   /  |  \_  __ \_/ __ \ 
2020-11-20T10:42:05.150237271Z /    |    \/    /|  |  /|  | \/\  ___/ 
2020-11-20T10:42:05.150241271Z \____|__  /_____ \____/ |__|    \___  >
2020-11-20T10:42:05.150245371Z         \/      \/                  \/ 
2020-11-20T10:42:05.150249272Z A P P   S E R V I C E   O N   L I N U X
2020-11-20T10:42:05.150252972Z 
2020-11-20T10:42:05.150256472Z Documentation: http://aka.ms/webapp-linux
2020-11-20T10:42:05.150260173Z NodeJS quickstart: https://aka.ms/node-qs
2020-11-20T10:42:05.150263673Z NodeJS Version : v14.7.0
2020-11-20T10:42:05.150267273Z Note: Any data outside '/home' is not persisted
2020-11-20T10:42:05.150270874Z 
2020-11-20T10:42:05.388794060Z Cound not find build manifest file at '/home/site/wwwroot/oryx-manifest.toml'
2020-11-20T10:42:05.389362508Z Could not find operation ID in manifest. Generating an operation id...
2020-11-20T10:42:05.389393011Z Build Operation ID: 5488a73a-f6e1-48d5-9360-7d4e0db141f4
2020-11-20T10:42:06.033354810Z Environment Variables for Application Insight's Codeless Configuration exists..
2020-11-20T10:42:06.603097828Z Writing output script to '/opt/startup/startup.sh'
2020-11-20T10:42:06.946048753Z Running #!/bin/sh
2020-11-20T10:42:06.946644503Z 
2020-11-20T10:42:06.946657204Z # Enter the source directory to make sure the script runs where the user expects
2020-11-20T10:42:06.946662305Z cd "/home/site/wwwroot"
2020-11-20T10:42:06.946666105Z 
2020-11-20T10:42:06.947939813Z export NODE_PATH=/usr/local/lib/node_modules:$NODE_PATH
2020-11-20T10:42:06.947952014Z if [ -z "$PORT" ]; then
2020-11-20T10:42:06.947956114Z      export PORT=8080
2020-11-20T10:42:06.949015304Z fi
2020-11-20T10:42:06.954862399Z 
2020-11-20T10:42:06.954927704Z export NODE_OPTIONS='--require /usr/local/lib/node_modules/applicationinsights/out/Bootstrap/Oryx.js ' $NODE_OPTIONS
2020-11-20T10:42:06.954986409Z PATH="$PATH:/home/site/wwwroot" yarn start:prod
2020-11-20T10:42:08.321443397Z yarn run v1.17.3
2020-11-20T10:42:08.484387733Z $ node dist/src/main 
[...]
2020-11-20T10:42:23.394152218Z Application started on port 8080

Я привязываю экспресс-сервер этой строчкой

 const port = Number(process.env.PORT) || 8080;

Некоторое время я гуглил, чтобы найти решение, но ничего не помогает. Вот шаги, которые я пробовал использовать сейчас.

  • Увеличьте WEBSITES_CONTAINER_START_TIME_LIMIT до 1800
  • Установите WEBSITES_PORT и PORT на 80
  • Восстановите и повторно разверните приложение

У кого-нибудь есть идея, почему эта проблема все еще возникает? Мое приложение отображается на правом порту и возвращает статус HTTP 200 под /, а также реализовал обработчик ошибок 400 (я читал, что это облако также является проблемой).


person Markus    schedule 20.11.2020    source источник
comment
Когда вы сказали «Установить WEBSITES_PORT и PORT Setting на 80», вы обновили код до const port=process.env.PORT || 80? Убедитесь, что ваше приложение прослушивает порт, указанный в переменной среды PORT: process.env.PORT. docs.microsoft.com/en-us/azure/app-service/. Также убедитесь, что инструкция EXPOSE в вашем Dockerfile совпадает с портом.   -  person krishg    schedule 20.11.2020
comment
Привет, спасибо за ответ. Я уверен, что приложение работает на порту, указанном переменной окружения PORT. Что вы имеете в виду под проверкой файла докера? Я использую среду выполнения NodeJs от службы приложений Azure. Значит, в моем проекте нет Dockerfile. Или мне следует?   -  person Markus    schedule 20.11.2020
comment
Таким образом, вы не используете собственный контейнер. Так что игнорируйте часть dockerfile.   -  person krishg    schedule 20.11.2020
comment
Когда вы сказали, что также реализовали обработчик ошибок 400, это 400 или 404?   -  person krishg    schedule 20.11.2020
comment
Для обоих. Ошибка 400 будет обработана так же, как и ошибка 404   -  person Markus    schedule 20.11.2020


Ответы (2)


Вы, может быть, используете Sentry? У нас была аналогичная проблема, и мы смогли отследить ее до Sentry. Попробуйте без Sentry и конфигурации по умолчанию.

person Joël A    schedule 08.12.2020

Источник из https://docs.microsoft.com/azure/app-service/faq-app-service-linux#custom-containers.

Мой настраиваемый контейнер прослушивает порт, отличный от 80. Как настроить приложение для маршрутизации запросов на этот порт?

У нас есть автоматическое определение порта. Вы также можете указать параметр приложения WEBSITES_PORT и присвоить ему значение ожидаемого номера порта. Раньше платформа использовала настройку приложения PORT. Мы планируем отказаться от этой настройки приложения и использовать исключительно WEBSITES_PORT.

Вам не нужно использовать переменную PORT. Автоматическое определение порта определяет порт (порт 80 по умолчанию), мы попытаемся определить, какой порт привязать к вашему контейнеру, но вы также можете использовать параметр приложения WEBSITES_PORT и настроить его со значением для порта, который вы хотите привязать к своему контейнеру. Однако веб-сервер в вашем настраиваемом образе может использовать порт, отличный от 80. Вы сообщаете Azure о порте, который использует ваш настраиваемый контейнер, с помощью параметра приложения WEBSITES_PORT. Для использования другого порта: используйте инструкцию EXPOSE в файле Docker, чтобы открыть соответствующий порт (например, 5000), и используйте параметр приложения WEBSITES_PORT в Azure со значением 5000 для выставить этот порт.

person krishg    schedule 20.11.2020
comment
Привет, спасибо за ответ. Как описано в вопросе, я уже пытался установить переменную среды WEBSITE_PORT. - person Markus; 20.11.2020
comment
"WEBSITE_PORT" - это опечатка в вашем комментарии? Это должно быть WEBSITES_PORT. - person krishg; 20.11.2020
comment
Также, когда вы говорите переменную среды, я надеюсь, что вы установили настройки приложения в службе приложений, верно? - person krishg; 20.11.2020
comment
Да, он задается в настройках приложения на портале Azure. - person Markus; 20.11.2020
comment
Привет, @Markus, тебе удалось это решить? Я застрял на несколько дней и не понимаю, в чем проблема. Он только говорит: "Ожидание ответа на запрос разминки до истечения времени ожидания" и ничего больше, сообщений об ошибках больше нет, я уже установил PORT, WEBSITES_PORT, я использовал EXPOSE в файле dockerfile, удалил проект и начал снова, я схожу с ума - person Marco Portillo; 15.12.2020
comment
Привет @MarcoPortillo. Да, решил проблему. Выполняете ли вы какие-либо дополнительные настройки в своем main.ts? После долгих испытаний моей идеей было развернуть новое приложение NestJs. Это сработало нормально. Поэтому я комментирую все тонкости, сделанные в main.ts, за исключением материала по умолчанию, сгенерированного из клика при создании проекта. Размещение сработало! После этого я шаг за шагом ввел дополнительную конфигурацию и обнаружил проблему. Для меня это была неправильная конфигурация моего постового промежуточного программного обеспечения. Странно было то, что в моих файлах журналов ничего об этом не было. - person Markus; 16.12.2020