Менеджер процессов 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!!
12 years ago
the fpm process supports the USER2 signal, which is used to reload the config file.
should do the trick.
4 years ago
It looks like the php-fpm daemon is not able to use its groups it is running with.
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.
The only solid information I’ve gathered into why FPM is not available is a bug report explaining that FPM is built around fork(), which is not natively available on windows (https://bugs.php.net/bug.php?id=62447).
9 years ago
Doesn’t work? Enable logging!
The php-fpm.log file is a great place to fault-find errors and get to the bottom of a problem. But be sure to enable logging for your specific worker pool. Or you won’t see anything!
To enable error logging for the default [www] worker pool, add this line in the [www] section of your php-fpm.conf:
5 years ago
I’m very unhappy with the way php-fpm handles requests.
There isn’t even some SCRIPT_FILENAME in the RFC for CGI, an that’s the only standard I found to handle the requests.
Actually what you are doing with PATH_TRANSLATED is supposed to translate to the path, which is broken by media wikis, as they use the PATH_INFO to find the ressource, not some script.
In the original CGI context, the PATH_INFO is passed to the CGI binary to specify some ressource argument. So actually
SCRIPT_NAME ~ argv0
PATH_INFO ~ argv1
in command context.
Conclusion: We should rewrite php-fpm to obey the rfc3875 CGI standard.
Having SCRIPT_NAME pointing to /something.php, must translate to
CWD is the working directory where php-fpm is started (or configured to change to).
In case of chroot CWD = «».
In any case the SCRIPT_NAME php script can be found with ./SCRIPT_NAME, from the CWD. So the undocumented not standardized SCRIPT_FILENAME should vanish! It breaks the CGI standard.
3 months ago
in response to «ikrabbe dot ask at gmail dot com» about SCRIPT_NAME and PATH_INFO being empty, this could be related.
while configuring php-fpm with nginx in debian (actually raspberry pi), a comment line in .conf grabbed my attention
there is a «feature» (that looks more like a bug) reported about 10 years ago in http://trac.nginx.org/nginx/ticket/321 . in which «try_files» could reset the contents of $fastcgi_script_name and $fastcgi_path_info . this is a workaround mentioned in forums by user «zakaria»
location ~ [^/]\. php (/|$)
fastcgi_split_path_info ^(.+?\. php )(/.*)$;
# Save the $fastcgi_path_info before try_files clear it
set $path_info $fastcgi_path_info ;
fastcgi_param PATH_INFO $path_info ;
try_files $fastcgi_script_name = 404 ;
fastcgi_pass unix :/var/ run / php5 — fpm . sock ;
fastcgi_index index . php ;
include fastcgi_params ;
>
?>
7 months ago
@ ikrabbe you might want to look at mod_rewrite to address the environment variable variation(!) between cgi and cli php.
3 months ago
in response to «dreamcat4 at gmail dot com» about enabling logs in php-fpm
i *hate* going blind, so enabling logs is generally the first thing i do.
by doing dreamcat4 suggestion, logs got enabled but mixed with php process logs . instead doing that and to isolate logs from [www] worker pool in its own file, these directives worked for me in «www» worker .ini file (you have to set directories and permissions before)
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
- Установка и настройка
- Общие инструкции по установке
- Установка на Unix-системы
- Установка на macOS
- Установка в системах Windows
- Установка на платформах Cloud Computing
- Менеджер процессов FastCGI (FPM)
- Установка модулей PECL
- Проблемы?
- Конфигурация времени выполнения
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Что такое CGI, FastCGI, php-fpm?
Common Gateway Interface — это стандарт (протокол, спецификация, соглашение, набор правил), который описывает, как веб-сервер должен запускать скрипты (в т.ч. PHP, а также другие программы), как должен передавать им параметры HTTP-запроса и как скрипты должны передавать результаты своей работы веб-серверу. То есть CGI был разработан для того, чтобы расширить возможности веб-сервера и дать возможность создания и обработки динамического контента.
FastCGI
FastCGI — по факту это дальнейшее развитие технологии CGI, является более производительным и безопасным. В чем же главное отличие? В CGI-режиме на каждый запрос создается отдельный процесс, «умирающий» после окончания обработки. В FastCGI процесс работает в качестве демона, то есть один и тот же процесс обрабатывает различные HTTP запросы один за другим. PHP из коробки умеет работать и в FastCGI режиме.
PHP-FPM
FastCGI Process Manager — альтернативная реализация PHP FastCGI, которая позволяет вам достаточно гибко настраивать те самые процессы, о которых я писал выше.
Как работает PHP-FPM?
Представим, что в наше приложение одновременно приходит 50 клиентов. Сначала они обращаются в наш NGINX, который по факту пробрасывает запросы сквозь себя на PHP-FPM (за исключением запросов за статическими ресурсами/файлами), а дальше PHP-FPM пытается обработать все запросы с помощью своих процессов (воркеров).
Допустим у нас запущено 5 воркеров, как на картинке. В таком случае во время одновременного запроса первые 5 клиентов будут обрабатываться сразу, а остальные 45 становятся в очередь и ждут, когда первые 5 закончат обработку. PHP-FPM позволяет задавать настройки в зависимости от ваших потребностей, будь то динамическое увеличение воркеров для того чтобы клиенты не ждали в очереди или экономия ресурсов с целью ускорения обработки запросов со статическим кол-вом воркеров.
Коротко что такое 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

Обновлено: 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-образ с веб-сервером
Примеры скриптов: