Что такое 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-образ с веб-сервером
Примеры скриптов:
Коротко о 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.
Объясните как работает php-fpm?
Oбъясните как работает PHP-runtime в целом и php-fpm в частности?
- Вопрос задан более трёх лет назад
- 48801 просмотр
Комментировать
Решения вопроса 1
Full-stack developer (Symfony, Angular)
Для начала почитайте что такое SAPI. Затем представьте что apache + mod_php разделили на web-сервер, который проксирует запросы на php-fpm и отдает статику, и собственно отдельный web-сервер который имплементит SAPI и выполняет запросы связанные только с php. То есть статику отдавать мы можем только через php. Суть примерно та же что и у apache2 + prefork + mod_php но оптимизированный только для работы с php. Так же можно поставить на фронт более быстрый и легковесный сервер который умеет проксировать запросы.
То есть php-fpm это эдакий fast-cgi сервер который постоянно держит готовые для работы пул-процессов (сколько в пуле процессов настраивается, так же как и от какого пользователя их запускать и все такое прочее). Каждый новый запрос уходит в какой-либо процесс из пула, запрос отрабатывает, возвращаем результат тому кто попросил (web-серверу обычно). Если процесс падает (fatal допустим) — поднимаем новый.
Принципиальной разницы между apache2+mod_php нету, просто упрощается инфраструктура. Наш web-сервер должен только уметь проксировать запросы и отдавать статику, а php-frpm вообще может быть на разных машинах (балансировщиком можно раскидывать запросы). Ну и сами понимаете, nginx + php-fpm будет быстрее обрабатывать запросы чем apache2+mod_php какой бы мы менеджер процессов не использовали в апаче. Минусов по сравнению с apache+mod_php я даже не могу предложить.
А php-runtime не зависит от этого. Он один на всех, CLI, FPM, mod_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
6 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!!
13 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.