FastCGI
FastCGI — это протокол, который связывает веб-сервер (Nginx, Apache) с приложением или интерпретатором языка (PHP, Python, Perl).
Что даёт
Древний протокол CGI на каждый клик пользователя поднимал в операционке новый процесс приложения с нуля, читал ответ и тут же убивал его. На пару визитов в день этого хватало, но под нагрузкой сервер моментально умирал из-за бесконечного создания процессов и жутких расходов CPU.
FastCGI решает эту проблему банально: он держит процессы приложения постоянно запущенными в памяти (persistent processes). Веб-сервер принимают входящий HTTP-запрос, переводит его в бинарный формат FastCGI и отдаёт по сокету (TCP или UNIX) уже готовому процессу-воркеру. Процесс выполняет код, возвращает результат и не завершается, а встаёт в ожидание следующего клиента.
Плюсы протокола:
- Минимальный оверхед. Нет затрат времени и ресурсов на инициализацию окружения, подгрузку библиотек и парсинг конфигов при каждом запросе.
- Гибкая масштабируемость. Приложение можно вынести на отдельный физический сервер или размазать по пулу машин, общаясь с веб-сервером по сети через TCP-сокет.
- Изоляция и стабильность. Если скрипт падает с паникой или фатальной ошибкой, погибает только один рабочий процесс. Менеджер процессов тут же поднимет ему замену, а сам веб-сервер продолжит раздавать статику.
Как использовать
В современном бэкенде с FastCGI напрямую почти не работают — протокол спрятан под капотом менеджеров процессов. Самый частый пример — связка Nginx и PHP-FPM (FastCGI Process Manager).
- Выбор типа сокета. Для общения веб-сервера и PHP на одной машине используют UNIX-сокет (unix:/run/php/php8.2-fpm.sock). Он работает быстрее, так как данные идут через память ядра без накладных расходов сетевого стека TCP/IP. Если бэкенд вынесен на отдельную ноду, выбирают TCP-сокет (127.0.0.1:9000).
- Проксирование в веб-сервере. В конфиге Nginx задают директиву fastcgi_pass, передают заголовки через include fastcgi_params; и явно указывают путь к исполняемому файлу через fastcgi_param SCRIPT_FILENAME.
- Тюнинг пула воркеров. Настройки пула (pm.max_children, pm.start_servers) подбирают исходя из доступной RAM. Если процессов слишком много, сервер уйдет в swap, если мало — запросы встанут в очередь (fastcgi_read_timeout).