Могут ли веб-приложения запускаться по требованию с помощью nginx (как это делает heroku)

Я хочу создать сервер приложений для размещения нескольких приложений, но большую часть времени поддерживать эти приложения в спящем режиме и запускать их по требованию, как маршрутизатор heroku для бесплатных приложений.

Нужно ли мне добавить прокси-приложение, которое запускает приложения, или можно настроить nginx для обработки этого каким-либо образом?

Я думал о добавлении приложения узла, которое запускает приложение по требованию и прокси-запрос там, но я боюсь, что это может добавить много времени, так как потребуется прокси-сервер для каждого запроса, а также я могу потерять первый запрос, так как приложение может не будь готов ответить на это.

Я также подумал, что мог бы использовать модуль ngx_http_auth_request для запуска приложения, но я не уверен, что это может сработать.

Идея состоит в том, что у меня нет списка всех приложений, которые я буду запускать, так как новые приложения могут быть установлены в любое время.

3 ответа

Да, это возможно с помощью nginx в качестве обратного прокси и использования systemd (или любая другая встроенная замена).

В качестве стратегии вы можете назначить каждому приложению свой собственный порт TCP для прослушивания при запуске - и настроить nginx направлять запросы к этому приложению.

Затем вы можете настроить модули типа сокета systemd на каждом порте приложений и настроить его для запуска приложения при каждом запросе.

https://www.freedesktop.org/software/systemd/man/systemd.socket.html

В комментариях к двум существующим ответам вы упоминаете, что (1) вам на самом деле не нужно, чтобы это было производственным классом, и (2) inetd решение именно то, что вы ищете, но без необходимости иметь inetd / xinetd / systemd зависимость.

Что ж, у меня есть для вас новость - nginx - это веб-сервер промышленного уровня, предназначенный для решения проблемы C10K. Inetd-подобное решение, где CGI скрипт создается для каждого отдельного запроса, настолько далек от качества промышленного уровня, насколько это возможно, и который не способен обрабатывать C10K на скромном оборудовании.

Поэтому неудивительно, что nginx не поддерживает исходную модель CGI (где каждый запрос вызывает отдельную копию скрипта CGI), а поддерживает только FastCGI и т. П. (Где один процесс способен обслуживающих более одного запроса). Если вы хотите реализовать оригинальную не масштабируемую старую школу /cgi-bin/ в стиле архитектуры, вам, безусловно, придется полагаться на сторонние веб-серверы или какие-либо вспомогательные утилиты - в nginx это никогда не будет работать "из коробки" так же, как .htaccess поддержка никогда не будет добавлена ​​в nginx, так как оба они ужасно неэффективны и не масштабируются.

По сути, это звучит так, как будто вы хотите реализовать базовую функциональность Heroku, и вы хотите, чтобы она была надежной, производственной категории и, предположительно, всего за несколько строк кода.

Ну, это не совсем так! За Heroku происходит много всего; очень много времени затрачивается на то, чтобы приложения могли нормально спать и активироваться, о чем заботится значительная база кода в Erlang, языке, известном своей параллельной дружественной парадигмой.

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

В конце концов, вы также должны подумать о том, что на самом деле делают ваши приложения, когда им нужно "заснуть". В старые времена Perl и PHP до появления Facebook каждый запрос браузера часто приводил к тому, что сервер запускал отдельный процесс для обработки указанного запроса, что было довольно неэффективно. "Новый" подход заключается в том, чтобы сценарии всегда были готовы, что позволяет обслуживать большее количество запросов на сценарий.

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

Другие вопросы по тегам