Коротко о CGI, FastCGI, PHP-FPM и mod_php
Основной момент: «CGI» это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).
CGI описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры HTTP -запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа. В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, в том числе на shell. CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP. Хотя сам PHP интерпретатор позволяет работать в режиме CGI.
Стандарт «Common Gateway Interface» (сокращенно CGI) означает, что веб-сервер запускает дополнительный процесс PHP для каждого запроса. Поэтому все модули PHP, php.ini и всю другую конфигурацию необходимо загружать и анализировать при каждом запросе, что неэффективно.
FastCGI
FastCGI — клиент-серверный протокол взаимодействия веб-сервера и приложения, дальнейшее развитие технологии CGI. По сравнению с CGI является более производительным и безопасным.
CGI- программы взаимодействуют с сервером через STDIN и STDOUT запущенного CGI- процесса, FastCGI- процессы используют Unix Domain Sockets или TCP/IP для связи с сервером. Это даёт следующее преимущество над обычными CGI- программами: FastCGI- программы могут быть запущены не только на этом же сервере, но и где угодно в сети. Также возможна обработка запросов несколькими FastCGI- процессами, работающими параллельно.
Дальнейшее развитие технологии CGI, является более производительным и безопасным, снимает множество ограничений CGI-программ.
FastCGI программа работает следующим образом: программа единожды загружается в память в качестве демона (независимо от HTTP-сервера), а затем входит в цикл обработки запросов от HTTP-сервера. Один и тот же процесс обрабатывает несколько различных запросов один за другим, что отличается от работы в CGI-режиме, когда на каждый запрос создается отдельный процесс, «умирающий» после окончания обработки.
Написание FastCGI программ-демонов сложнее чем CGI, нужны дополнительные библиотеки, зависящие от языка.
Опять же, сама аббревиатура FastCGI это не язык программирования и не отдельная программа, это как и в случае CGI — просто спецификация.
PHP в режиме FastCGI
Помимо CGI режима, PHP из коробки умеет работать и в FastCGI режиме (с версии 5.3 даже в двух FastCGI режимах). Режим включается флагом при компиляции интерпретатора, флаг зависит от версии PHP.
Для работы с Apache нужен модуль mod_fcgid или mod_fastcgi, либо связка из mod_proxy_fcgi + PHP-FPM.
Nginx умеет работать с FastCGI приложениями из коробки, но именно для PHP дополнительно нужен PHP-FPM.
Следует помнить, что при работе PHP в режиме FastCGI в памяти висит сам php интерпретатор, а не какой-то конкретный php-скрипт.
Решение частых проблем PHP (mod_fcgid) в режиме FastCGI
Вопрос ответ на часто встречающие ошибки FastCGI. Документация по модулю Apache mod_fcgid.
Ошибка 1: [fcgid:warn] [pid 2382] [client 10.76.58.13:57496] mod_fcgid: HTTP request length 134544 (so far) exceeds MaxRequestLen (131072)
Исправляет параметр FcgidMaxRequestLen.
Ошибка 2: [proxy_fcgi:error] [pid 6573:tid 139966382327552] (70007)The timeout specified has expired: [client 207.46.13.24:0] AH01075: Error dispatching request to : (polling)
Да ошибки разные но решаются все в одном месте, установкой параметров:
nano /etc/apache2/mods-available/fcgid.conf или nano /etc/httpd/conf.d/fcgid.conf
FcgidIdleTimeout 1200 FcgidProcessLifeTime 1200 FcgidConnectTimeout 1200 FcgidIOTimeout 1200 FcgidMaxRequestLen 2000000
systemctl restart apache2; systemctl restart php7.4-fpm.service
systemctl restart httpd; systemctl restart php-fpm.service
PHP-FPM
FPM (FastCGI Process Manager, менеджер процессов FastCGI) является альтернативной реализацией PHP FastCGI с несколькими дополнительными возможностями обычно используемыми для высоконагруженных сайтов.
Изначально PHP-FPM представлял из себя набор патчей от Андрея Нигматулина, которые устраняли ряд проблем, мешающих полноценно использовать PHP в режиме FastCGI (список улучшений). С версии PHP 5.3 набор патчей включён в ядро, а дополнительные возможности PHP-FPM включаются флагом при компиляции.
PHP-FPM используется в основном в связке с Nginx, без установки Apache.
Как работает PHP-FPM?
Представим, что в наше приложение одновременно приходит 50 клиентов. Сначала они обращаются в наш NGINX, который по факту пробрасывает запросы сквозь себя на PHP-FPM (за исключением запросов за статическими ресурсами/файлами), а дальше PHP-FPM пытается обработать все запросы с помощью своих процессов (воркеров).
Допустим у нас запущено 5 воркеров. В таком случае во время одновременного запроса первые 5 клиентов будут обрабатываться сразу, а остальные 45 становятся в очередь и ждут, когда первые 5 закончат обработку. PHP-FPM позволяет задавать настройки в зависимости от ваших потребностей, будь то динамическое увеличение воркеров для того чтобы клиенты не ждали в очереди или экономия ресурсов с целью ускорения обработки запросов со статическим количеством воркеров.
mod_php
Это модуль для Apache, позволяющий ему выполнять php скрипты. Является наверно самым популярным и простым способом подружить Apache и PHP. Модуль не использует ни CGI, ни FastCGI. Есть свои минусы — скрипты работают под пользователем веб-сервера, невозможно использовать больше одной версии PHP.
Менеджер процессов FastCGI (FPM)
FPM (FastCGI Process Manager, менеджер процессов FastCGI) является альтернативной реализацией PHP FastCGI с несколькими дополнительными возможностями обычно используемыми для высоконагруженных сайтов.
- Продвинутое управление процессами с корректной (graceful) процедурой остановки и запуска;
- Пулы, дающие возможность запуска воркеров с разными uid/gid/chroot/окружением, прослушивая разные порты и используя разные php.ini (замещение safe_mode);
- Настраиваемое ведение журнала потоков вывода (stdout) и ошибок (stderr);
- Аварийный перезапуск в случае внезапного разрушения opcode-кеша;
- Поддержка ускоренной загрузки (accelerated upload);
- «slowlog» — логирование необычно медленно выполняющихся скриптов (не только их имена, но также и их трассировки. Это достигается с помощью ptrace и других подобных утилит для чтения данных исполнения удалённых процессов);
- fastcgi_finish_request() — специальная функция для завершения запроса и сброса всех буферов данных, причём процесс может продолжать выполнение каких-либо длительных действий (конвертирование видео, обработка статистики и т.п.);
- Динамическое/по требованию/статическое порождение дочерних процессов;
- Базовая и расширенная информация о состоянии (аналогично Apache mod_status) с поддержкой различных форматов, таких как json, xml и openmetrics;
- Конфигурационный файл, основанный на php.ini.
User Contributed Notes 11 notes
10 years ago
PHP-FPM is FAST — but be wary of using it while your code base is stored on NFS — under average load your NFS server will feel some serious strain. I have yet to find a work around for this bug: https://bugs.php.net/bug.php?id=52312
5 years ago
php-fpm is not avaliable on Windows, but you can use IIS or Apache as the «fastcgi process manager».
If you have to use Nginx, here is a solution. Nginx provides a load balancing module. We can distribute the request to different php-cgi.exe process.
This is the origin nginx conf.
«`
location ~ \.php$ try_files $uri = 404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
>
«`
You can replace it by
«`
upstream php server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
>
location ~ \.php$ try_files $uri = 404;
fastcgi_pass php;
fastcgi_index index.php;
include fastcgi.conf;
>
«`
php-cgi.exe process will die after several requests, so you have to restart the php-cgi.exe manually to keep a process listening the port.
DON’T USE THIS SOLUTION IN PRODUCTION!!
12 years ago
Init script setup
===
You will probably want to create an init script for your new php-fpm. Fortunately, PHP 5.3.3 provides one for you, which you should copy to your init directory and change permissions:
$ cp /sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm
It requires a certain amount of setup. First of all, make sure your php-fpm.conf file is set up to create a PID file when php-fpm starts. E.g.:
—-
pid = /var/run/php-fpm.pid
—-
(also make sure your php-fpm user has permission to create this file).
Now open up your new init script (/etc/init.d/php-fpm) and set the variables at the top to their relevant values. E.g.:
—
prefix=
exec_prefix=
php_fpm_BIN=/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
—
Your init script is now ready. You should now be able to start, stop and reload php-fpm:
$ /etc/init.d/php-fpm start
$ /etc/init.d/php-fpm stop
$ /etc/init.d/php-fpm reload
The one remaining thing you may wish to do is to add your new php-fpm init script to system start-up. E.g. in CentOS:
$ /sbin/chkconfig php-fpm on
Disclaimer: Although I did just do this on my own server about 20 mins ago, everything I’ve written here is off the top of my head, so it may not be 100% correct. Also, allow for differences in system setup. Some understanding of what you are doing is assumed.
6 years ago
It is important to note that FPM is not built with the windows binaries. Many of the guides you may find online rely on php-cgi.exe. Unfortunately they call it FPM but this is incorrect!
The executable php-cgi.exe that is bundled with the windows binaries is a FastCGI interface but it is *not* FPM (Fastcgi Process Manager). php-cgi.exe does not have multi-threading or concurrent request support, nor support for any of the FPM configuration options.
Что такое PHP-FPM

Обновлено: 05.01.2018 Опубликовано: 25.03.2017
программный пакет, позволяющий выполнить обработку скриптов, написанных на языке PHP. Включен в состав PHP с версии 5.3.3, для более ранних версий необходима установка отдельно. Является альтернативой FastCGI — протоколу взаимодействия веб-сервера с программами. FPM расшифровывается как Fastcgi Process Manager.
Часто применяется для настройки вместе с веб-серверомами NGINX или Lighttpd. Последний обрабатывает статические данные, а обработку скриптов отдает PHP-FPM. Такая реализация работает быстрее, по сравнению с, также распространенной, NGINX + Apache + модуль mod_php.
PHP-FPM запускается как отдельный процесс. По умолчанию, взаимодействует с веб-сервером через порт 9000 или сокетный файл. Есть поддержка всех известных операционных систем, а именно — FreeBSD, Linux (например, CentOS или Ubuntu), Windows.

phpinfo — включенный php-fpm
Еще немного о PHP-FPM на Википедии
Встречается в статьях
Инструкции:
- Как установить и настроить связку Asterisk + FreePBX на CentOS 8
- Как установить и настроить связку Asterisk + FreePBX на Ubuntu
- Настройка веб-сервера на CentOS 7 со всем необходимым для правильной работы
- Настройка веб-сервера на CentOS 8 со всем необходимым для правильной работы
- Как вручную настроить сервер хостинга на CentOS 7
- Как настроить почту для корпоративной среды на CentOS 8
- Как настроить почту для корпоративной среды на Debian
- Как настроить почту для корпоративной среды на Ubuntu Server
- Настройка веб-сервера на Ubuntu со всем необходимым для правильной работы
- Как настроить почту на базе Postfix для корпоративной среды (CentOS 7)
- Установка Nginx + PHP + MySQL + PostgreSQL на Astra Linux
Мини-инструкции:
- Как установить NGINX на CentOS 7
- Установка и настройка OwnCloud на CentOS 7 или 8
- Инструкция по установке и настройке phplist
- Как и где настраивать время сессии PHP
- Анализ и мониторинг нагрузки веб-сервера на базе Linux
- Настройка проксирования почты с NGINX для IMAP, POP3 и SMTP
- Установка и настройка Nextcloud + NGINX на Ubuntu
- Настройка сервера мониторинга Zabbix на Linux CentOS 7
- Настройка сервера мониторинга Zabbix на Ubuntu
- Установка панели управления ISPmanager на Ubuntu или CentOS
- Инструкция по развертыванию Nextcloud с Apache на Ubuntu
- Инструкция по установке и настройке phplist на Linux Ubuntu / Debian
- Установка и настройка сервера NextCloud на Rocky Linux
- Установка и использование почтового клиента WebMail Lite на Linux CentOS
- Настройка сервера мониторинга Zabbix 5 на Linux CentOS 8
- Организация сервиса календаря и адресной книги на базе Baikal
- Как создать собственный Docker-образ с веб-сервером
Примеры скриптов:
Nginx, Php-Fpm и что это вообще?
PHP-FPM — это разновидность SAPI для PHP. Чтобы понять, что это такое, стоит рассказать о понятии SAPI.
FPM
SAPI, он же Server API. В php есть несколько таких API для разных вариантов его работы:
- CLI SAPI — в качестве консольной команды `php` для запуска наших кронов и других cli-программ (Command Line Interface)
- apxs2 SAPI — в качестве модуля к apache2
- CGI SAPI — в качестве запускаемого на каждом запросе CGI (сейчас так почти никто не делает)
- FPM SAPI — Fast Process Manager, написанный для PHP разработчиками из комании Badoo и теперь поддерживаемый сообществом
Работа с FPM отличается от работы с Apache в первую очередь тем, что FPM — это только PHP. Это не веб-сервер, не что-то умное. Это наоборот — максимально простой, легкий и быстрый менеджер процессов для PHP. В отличие от апача, он даже не использует http-протокол, а работает со специальным fastcgi-протоколом. В первую очередь FPM быстрее обрабатывает запросы благодаря его легковесности и простоте.
Во вторую очередь, FPM действительно умный менеджер процессов. Он контролирует количество работающих PHP-процессов, частоту их перезапуска для борьбы с утечками памяти (да, модули php как и всегда текут) и прочие простые вещи, необходимые для контроля сервера.
Нужно помнить, что независимо от того, какое SAPI вы используете, будь то модуль Apache, CGI или PHP-FPM — это не отнимает ни каких особенностей php. А первая его особенность:
- Один процесс одновременно обрабатывает один запрос. Это абсолютно так же свойственно для PHP-FPM, как и для Apache.
- Количество процессов определяет, сколько одновременно может «висеть» запросов в обработке.
- Точно также, как и Apache, FPM подвержен DoS-атакам путем «длительных запросов». Допустим, у Вас на сервере работает не более 50-ти процессов PHP-FPM, а это значит, что если 50 пользователей одновременно начнут делать upload файла (пусть даже небольшого, но главное, чтобы они делали это медленно) — пятьдесят первый пользователь получит ошибку 504, т.к. FPM не возьмет его запрос на обработку, пока не разберется с теми, что у него уже есть.
NGINX
Nginx — это разработанный Игорем Сысоевым http-proxy-сервер (он сам чаще называет его proxy-сервером, чем web-сервером). Это и есть его основное отличие от Apache (обычно к nginx приходят те, кто испытывает проблемы с Apache). Благодаря тому, что Nginx сам не выполняет никакой тяжелой работы, Игорь смог заложить в него прекрасную асинхронную событийную архитектуру.
Благодаря этой архитектуре nginx на порядки быстрее обрабатывает запросы, чем любой другой сервер и благодаря ей же потребляет при этом сильно меньше ресурсов. Как это происходит?
Один рабочий процесс nginx обрабатывает не один запрос пользователя (как apache), а тысячи этих запросов. Ввиду того, что nginx — это proxy-сервер, для него не составляет никакого труда получить запрос пользователя, отправить его на backend (например php-fpm), а пока бакенд занят трудом — обрабатывать остальные запросы пользователей, когда FPM ответит Nginx-у о том что тот самый первый запрос обработан и отдаст ответ, nginx передаст ответ назад пользователю.
Nginx работает как конвейер — он просто быстро перекладывает запросы и ответы между backend и пользователями.
В эту схему отлично вписалась асинхронная работа со статическими файлами. Благодаря тому, что в современном мире с файлами можно работать почти так же асинхронно, как и с backend, Nginx отлично разделяет работу на две части: статику отдает с диска, динамику обрабатывает в PHP-FPM.
В чем выигрыш?
Возьмем тот же Apache (prefork или itk). Мы выставили у него максимальное количество рабочих процессов, равное 35. Что это значит? Это значит, что мы сможем одновременно обработать только 35 запросов пользователей и это не важно — запрос это за статикой или за динамикой. 35 всего.
У вас на странице 100 картинок+js+css-ок? Значит, большая их часть будет висеть в очереди внутри сервера Apache и ждать, когда пользователь получит предыдущие 35 ответов.
В случае с Nginx + PHP-FPM важнее всего количество процессов PHP-FPM. Мы можем поставить его таким же равным тридцати пяти. Что это значит? Это значит, что мы можем одновременно обрабатывать 35 запросов к динамике, запросы же к статике nginx разгребет своими силами в количестве 3000+ одновременных почти на любой слабой VPS.
Расход оперативной памяти при использовании Nginx+PHP-FPM меньше, чем на «голом» Apache, при равном количестве процессов (FPM и Apache). Скорость обработки запросов выше.
На расход CPU внутри PHP замена Apache на FPM никак не скажется. CPU в первую очередь кушает Ваш PHP-код, а пока его никто не оптимизирует, работать быстрее и экономичнее он не начнет.
Итог
- Все проблемы PHP (процесс на запрос, не оптимальный код самого проекта) никуда не деваются.
- Появляется возможность перелопачивать тонны запросов за статикой, которой нет в Apache.
- Вы экономите оперативную память, что сказывается на цене оборудования или VPS.
- Появляется море приятного функционала самого Nginx.
- Пропадает возможность использовать htaccess, но честно скажу, конфигурация nginx куда более простая и понятная, чем htaccess.
Post Views: 1 852
Читайте также
Directly connect to PHP-FPM During debugging, we often need to isolate problem first to make sure if its really PHP problem or Nginx is…
Passing system environment variables to PHP-FPM when using NGINX Sometimes it comes in handy to set system environment variables (env var from now on!) and get the PHP to…
Make PHP great again! Зачем нужен PHP? С какими задачами справляется PHP С какими задачами PHP не справляется Сравнение PHP с другими языками Производительность…
