Nginx / FastCGI
Материал из Eludia.
В рамках Eluida.pm реализован многозадачный сервер, предназначенный для функционирования в качестве FastCGI-backend'а для nginx. В настоящей заметке описана конфигурация для UNIX/Linux; вариант для Windows также имеется, но будет документирован несколько позже.
Обзор конфигурации
В качестве WEB-сервера используется вышеупомянутый nginx, обязательно с модулем ngx_http_fastcgi_module. FastCGI-запросы передаются "тяжёлому" серверу elud по умолчанию через UNIX doman sockets (есть вариант с TCP, но это менее эффективно). Сервер elud имеет основной процесс, который поддерживает фиксированное число (по умолчанию — 2) рабочих процессов.
На старте elud производит следующие действия:
- ищет свой старый PID;
- ищет PID и конфигурацию работающего nginx;
- анализирует конфигурацию, ищет упомянутые там Eludia-приложения и пытается загрузить их;
- если возникает ошибка (например, при попытке обновления БД) — не стартует;
- если все приложения загрузились и оказались работоспособными, то создаёт новый socket и начинает его прослушивать;
- переписывает конфигурацию nginx с учётом нового socket'а и шлёт nginx сигнал на обновление;
- если в обнаруживает свою старую копию, то шлёт ей сигнал на останов.
Таким образом, если при обновлении ядра или приложения что-то пойдёт не так, у администратора будут хорошие шансы исправить ситуацию, пока в память загружен старый код.
Установка
Прежде всего, следует установить nginx версии не ниже 0.7.62.
Далее, в его директории с конфигурацией создать файл eludia_vhost следующего содержания:
location /i/ {
expires 30d;
}
location = / {
include eludia_fastcgi_pass;
include fastcgi_params;
}
location / {
return 403;
}
и файл eludia_fastcgi_pass с единственной строкой:
fastcgi_pass unix:/tmp/elud;
Теперь каждое Eluia-приложение будет прописываться в nginx.conf вот так:
server {
listen 80; # или другой порт, интерфейс и т. п.
root /var/projects/my_application/docroot;
include eludia_vhost;
}
Можно запускать nginx. Он даст ошибку 504 — пока это нормально.
Надо же всё-таки установить elud.
ins elud
В результате будет создан пускач /usr/sbin/elud. Испробуем его:
elud start
На консоль должны выдаться загрузочные баннеры ядра для всех приложений, после чего будут постоянно видны 3 процесса elud: один родительский и 2 рабочих. Можно проверить: теперь в eludia_fastcgi_pass имя socket'а изменится. К нему должен приписаться PID родительского процесса. Когда Вы это увидите, nginx уже, скорее всего успеет обработать посланный ему сигнал HUP и новая конфигурация будет актуальной. То есть можно идти в браузер и работать в приложении.
При установке обновлений следует опять отдавать команду
elud start
— это и restart тоже. Для останова предусмотрена
elud stop
, но в случае недоразумения с pid-файлом может и не сработать. Однако killall elud (в особенности -9) никто не отменял.
