Могут ли веб-приложения запускаться по требованию с помощью 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 каждый запрос браузера часто приводил к тому, что сервер запускал отдельный процесс для обработки указанного запроса, что было довольно неэффективно. "Новый" подход заключается в том, чтобы сценарии всегда были готовы, что позволяет обслуживать большее количество запросов на сценарий.
Не очень ясно, какие практические потребности вы можете удовлетворить в настоящее время, если ваши приложения спят по требованию - если вы запускаете несколько приложений в определенной системе, и большинство из них ничего не делают, то они не обязательно потребляют ценные ресурсы - планировщик в конечном итоге пометит свою неиспользуемую память как пригодную для подкачки, и, если они действительно простаивают, они также не должны потреблять никакого процессора.