Перейти к содержимому

Как работает php fpm

  • автор:

Что такое 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.

Включенная поддержка php-fpm

phpinfo — включенный php-fpm

Еще немного о PHP-FPM на Википедии

Встречается в статьях

Инструкции:

  1. Как установить и настроить связку Asterisk + FreePBX на CentOS 8
  2. Как установить и настроить связку Asterisk + FreePBX на Ubuntu
  3. Настройка веб-сервера на CentOS 7 со всем необходимым для правильной работы
  4. Настройка веб-сервера на CentOS 8 со всем необходимым для правильной работы
  5. Как вручную настроить сервер хостинга на CentOS 7
  6. Как настроить почту для корпоративной среды на CentOS 8
  7. Как настроить почту для корпоративной среды на Debian
  8. Как настроить почту для корпоративной среды на Ubuntu Server
  9. Настройка веб-сервера на Ubuntu со всем необходимым для правильной работы
  10. Как настроить почту на базе Postfix для корпоративной среды (CentOS 7)
  11. Установка Nginx + PHP + MySQL + PostgreSQL на Astra Linux

Мини-инструкции:

  1. Как установить NGINX на CentOS 7
  2. Установка и настройка OwnCloud на CentOS 7 или 8
  3. Инструкция по установке и настройке phplist
  4. Как и где настраивать время сессии PHP
  5. Анализ и мониторинг нагрузки веб-сервера на базе Linux
  6. Настройка проксирования почты с NGINX для IMAP, POP3 и SMTP
  7. Установка и настройка Nextcloud + NGINX на Ubuntu
  8. Настройка сервера мониторинга Zabbix на Linux CentOS 7
  9. Настройка сервера мониторинга Zabbix на Ubuntu
  10. Установка панели управления ISPmanager на Ubuntu или CentOS
  11. Инструкция по развертыванию Nextcloud с Apache на Ubuntu
  12. Инструкция по установке и настройке phplist на Linux Ubuntu / Debian
  13. Установка и настройка сервера NextCloud на Rocky Linux
  14. Установка и использование почтового клиента WebMail Lite на Linux CentOS
  15. Настройка сервера мониторинга Zabbix 5 на Linux CentOS 8
  16. Организация сервиса календаря и адресной книги на базе Baikal
  17. Как создать собственный 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *