что такое php fpm
PHP-FPM — менеджер процессов PHP FastCGI
PHP-FPM — это альтернативная реализация PHP FastCGI с несколькими дополнительными возможностями, которые обычно используются для высоконагруженных сайтов.
FastCGI, PHP и PHP-FPM
FastCGI это высокопроизводительный и масштабируемый интерфейс для взаимодействия web-сервера и приложений, дальнейшее развитие технологии CGI. Основное преимущество FastCGI в изолировании динамического языка от web-сервера — запуск FastCGI процесса возможен под пользователем, отличным от пользователя web-сервера, а также процесс может находиться в chroot’е, отличном от chroot’а web-сервера. Помимо всего прочего, эта технология позволяет запускать web-сервера и CGI процессы (php скрипты, в случае php-fpm) на различных хостах, что улучшает масштабируемость и также способствует безопасности без существенной потери в производительности.
PHP «умеет» работать в режиме FastCGI и без PHP-FPM, но PHP-FPM устраняет ряд проблем мешающих использовать PHP в режиме FastCGI на высоконагруженных системах.
PHP-FPM — это:
Использование PHP-FPM
Наиболее часто используется связка nginx и PHP-FPM, которая работает эффективнее «классического» использования Apache с mod_php, а в ряде случаев показывает более высокую производительность, нежели более «продвинутое» использование в качестве фронтенда веб-сервера nginx, а в качестве бекенда — Apache с mod_php.
Язык программирования PHP
PHP — язык программирования, который наиболее распространён в сфере веб-разработки.
В сфере создания динамических веб-сайтов и веб-приложений PHP занимает значительную долю рынка. Практически все популярные CMS для веб-разработки написаны на PHP. Наиболее важные преимущества PHP — простота освоения, адекватная скорость работы, мультипарадигмальность. Критикуют PHP обычно за низкий средний уровень разработчиков и, как следствие, за низкую культуру разработки, проблемы с сопровождаемостью и надёжности проектов.
PHP — язык для веб-разработки, который можно назвать основным для «масс-маркета», то есть для разработки типовых сайтов на коробочных CMS.
PHP — скриптовый язык общего назначения, часто применяемый для разработки веб-сайтов.
PHP — интерпретируемый язык программирования, позволяющий создавать программы в процедурном и объектно-ориентированном стиле. PHP — хороший язык для разработки проектов на CMS. И c технической точки зрения современный PHP весьма неплох. Но экосистема языка и особенности кадрового рынка делают PHP не самым лучшим выбором для разработки сложных проектов.
Русские Блоги
Nginx + Php-fpm подробный принцип работы
Примеры в реальной жизни
1. Экспедитор: посетите google.com
Как показано выше, так как Google заблокирован стеной, нам нужно перейти через vpn через стену, чтобы получить доступ к google.com.
vpn воспринимается как «мы» (мы подключаемся к vpn), vpn не воспринимается как «сервер google» (Google знает только, что поступают запросы http).
Для людей, которые могут воспринимать, но сервер не воспринимает сервер, мы называем его прямым прокси-сервером.
2. Обратный прокси: балансировка нагрузки через обратный прокси
Как показано выше, когда мы заходим на сайт baidu.com, у baidu есть прокси-сервер, с помощью которого вы можете выполнять балансировку нагрузки и маршрутизировать на разные серверы.
Этот прокси-сервер незаметен для «мы» (мы можем только ощущать, что мы обращаемся к серверу Baidu, и мы не знаем, что в середине находится прокси-сервер для балансировки нагрузки).
Этот прокси-сервер воспринимается для «server1 server2 server3» (маршрут балансировки нагрузки прокси-сервера на разные серверы)
Не воспринимаемый людьми, но воспринимаемый серверами, мы называем его обратным прокси-сервером
подводить итоги
2. Первое знакомство с Nginx и Php-fpm.
Что такое Nginx
Что такое Php-fpm
1. cgi, протокол fast-cgi
Ранние веб-серверы обрабатывали только статические файлы, такие как html, но с развитием технологии появились динамические языки, такие как php.
Веб-сервер не может справиться с этим, что мне делать? Тогда пусть интерпретатор php справится с этим!
Хорошо передать его интерпретатору php, но как интерпретатор php взаимодействует с веб-сервером?
Чтобы разрешить взаимодействие между различными языковыми интерпретаторами (такими как PHP и Python-интерпретаторы) и веб-сервером, появился протокол cgi. Пока вы пишете программу в соответствии с протоколом cgi, вы можете установить связь между переводчиком языка и веб-сервером. Например, программа php-cgi.
Вы обнаружили, что это пустая трата ресурсов?
В результате появилась улучшенная версия cgi, fast-cgi. Fast-cgi не убивает процесс после обработки запроса каждый раз, но сохраняет процесс так, чтобы процесс мог обрабатывать несколько запросов одновременно. Это избавляет от необходимости каждый раз пересматривать процесс, значительно повышая эффективность.
2. Что такое php-fpm
3. Как Nginx сочетается с Php-fpm
Как мы уже говорили выше, Nginx не только обрабатывает HTTP-запросы, но и действует как обратный прокси-сервер. Nginx перенаправляет динамические запросы на внутренний Php-fpm через функцию обратного прокси.
Давайте настроим новый Nginx + Php-fpm
1. Настройте файл nginx.conf
Войдите в каталог nginx и отредактируйте файл nginx.conf.
Как показано на рисунке, добавьте включаемый файл в последнюю строку nginx.conf
2. Добавьте соответствующий сервер
Введите путь, указанный выше, и добавьте сервер.
Ниже мы объясним значение элементов конфигурации:
Вкратце: когда мы посещаем www.example.com, процесс обработки выглядит следующим образом:
Ниже мы включаем php-fpm php для обработки этого запроса.
Откройте файл php-fpm.conf, мы увидим следующую конфигурацию:
То есть: модуль php-fpm прослушивает порт 127.0.0.1:9000 и ожидает обработки запросов.
4. Резюме
Сочетание nginx и php-fpm, весь процесс выглядит следующим образом.
V. Отображение эффекта
1. Запустите модули nginx и php-fpm.
Успешно началось, мы проверяем процесс php-fpm
Как показано выше, есть главный процесс и 3 рабочих процесса.
PHP → Коротко о CGI, FastCGI, PHP-FPM и mod_php
Решил навести в голове порядок о том, как работают вместе веб-сервер и PHP.
Common Gateway Interface, «общий интерфейс шлюза» — это стандарт, который описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры HTTP-запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа.
В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, в том числе на shell.
CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP. Хотя сам PHP интерпретатор позволяет работать в режиме CGI (см. ниже).
Основной момент: «CGI» это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).
FastCGI
Дальнейшее развитие технологии CGI, является более производительным и безопасным, снимает множество ограничений CGI-программ.
FastCGI программа работает следующим образом: программа единожды загружается в память в качестве демона (независимо от HTTP-сервера), а затем входит в цикл обработки запросов от HTTP-сервера. Один и тот же процесс обрабатывает несколько различных запросов один за другим, что отличается от работы в CGI-режиме, когда на каждый запрос создается отдельный процесс, «умирающий» после окончания обработки.
Написание FastCGI программ-демонов сложнее чем CGI, нужны дополнительные библиотеки, зависящие от языка.
Опять же, сама аббревиатура FastCGI это не язык программирования и не отдельная программа, это как и в случае CGI — просто спецификация.
PHP в режиме CGI
PHP в режиме CGI это самый старый способ выполнения php-скриптов веб-сервером. Режим доступен по умолчанию, однако может быть отключён при компиляции.
Для Apache нужен модуль mod_cgi (поставляется вместе с Apache). Nginx из коробки поддержки не имеет, хотя существуют дополнительные инструменты.
В данный момент режим используется редко в силу малой производительности.
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-FPM
FastCGI Process Manager, «Менеджер процессов FastCGI». Это альтернативная реализация FastCGI режима в PHP с несколькими дополнительными возможностями, которые обычно используются для высоконагруженных сайтов.
Изначально PHP-FPM представлял из себя набор патчей от Андрея Нигматулина, которые устраняли ряд проблем, мешающих полноценно использовать PHP в режиме FastCGI (список улучшений). С версии PHP 5.3 набор патчей включён в ядро, а дополнительные возможности PHP-FPM включаются флагом при компиляции.
PHP-FPM используется в основном в связке с Nginx, без установки Apache.
mod_php
Это модуль для Apache, позволяющий ему выполнять php скрипты. Является наверно самым популярным и простым способом подружить Apache и PHP. Модуль не использует ни CGI, ни FastCGI. Есть свои минусы — скрипты работают под пользователем веб-сервера, невозможно использовать больше одной версии PHP.
Nginx, Php-Fpm и что это вообще?
FPM
SAPI, он же Server API. В php есть несколько таких API для разных вариантов его работы:
Во вторую очередь, FPM действительно умный менеджер процессов. Он контролирует количество работающих PHP-процессов, частоту их перезапуска для борьбы с утечками памяти (да, модули php как и всегда текут) и прочие простые вещи, необходимые для контроля сервера.
Один процесс одновременно обрабатывает один запрос. Это абсолютно так же свойственно для PHP-FPM, как и для Apache.
Количество процессов определяет, сколько одновременно может «висеть» запросов в обработке.
NGINX
Благодаря этой архитектуре nginx на порядки быстрее обрабатывает запросы, чем любой другой сервер и благодаря ей же потребляет при этом сильно меньше ресурсов. Как это происходит?
В эту схему отлично вписалась асинхронная работа со статическими файлами. Благодаря тому, что в современном мире с файлами можно работать почти так же асинхронно, как и с backend, Nginx отлично разделяет работу на две части: статику отдает с диска, динамику обрабатывает в PHP-FPM.
В чем выигрыш?
У вас на странице 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.
Установка PHP и модулей на Ubuntu/Debian
В Debian/Ubuntu это делается легко и просто, зачастую не требуется ничего собирать
Капризы WebSocket и при чём здесь костыли
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
Curl в PHP
Почему timeout для curl в php необходим
IoT Highload: особенности и подводные камни
Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории
О безопасности, рисках и вложениях
Как сделать так, чтобы Ваш IT-отдел не стал местом утечки информации, за которую Вы отвечаете?
Установка PHP и модулей на Ubuntu/Debian
В Debian/Ubuntu это делается легко и просто, зачастую не требуется ничего собирать
Капризы WebSocket и при чём здесь костыли
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
Curl в PHP
Почему timeout для curl в php необходим
IoT Highload: особенности и подводные камни
Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории
О безопасности, рисках и вложениях
Как сделать так, чтобы Ваш IT-отдел не стал местом утечки информации, за которую Вы отвечаете?
Что такое php fpm
Та не, не сломаешь, в принципе. Но и DLE не будет работать нормально.
На всякий случай просто сохрани текущий конфиг, до переключения.
Просто ISP бывает глючит, когда слишком сильно модифицируешь дефолтный конфиг. А в случае с DLE его нужно модифицировать очень сильно, либо подключать инклюдом (самый верный вариант).
А если не будешь руками лазить в конфиг, и уверен, что DLE работает с дефолтным конфигом Apache — то можно и туда-обратно тыкать, ничего не сломаешь.
Это в ISP 4 с этим сложней было, там панель вообще не понимает изменения в конфигах которые вручную вносили, никакие. И сносит их к херам если начинаешь через панель трогать домены.
Что касается CGI — не совсем так, CGI точно так же через апач работает.
«Чтобы иметь преимущества php 7 его нужно обновить общесистемный. Тогда и высокопроизводительный сервис PHP-fpm станет работать на этой же версии. Но чего делать пока не рекомендуется, да и нету его еще в стабильных репозиториях большинства OS.»
Спасибо за эту статью и видео! Видео кстати также будет полезно тем, кто интересуется темой «как надо работать в терминале» )
P.S. Php7 сам по себе должен быть быстрее 5-го, т.к. в нем обновлен движок Zend и выброшено много устаревшего
Ну на самом деле тут в этой статье инфа немного уже устарела, ибо писалась на форуме более чем полгода назад. По крайней мере применительно к использованию php 7 в режиме php-fpm, особенно на сервере под управлением панельки ISPmanager 5. В нем можно в любом режиме удобно юзать любую версию PHP. И 7, и даже 7.1. Это я как раз и показывал на видео. И в другой статье http://vpsadm.ru/php-7-ispmanager-5-kak-ustanovit/
Что касается работы без панели — то сложности могут быть только при запуске в режиме апач-модуля.
В том же centos такую возможность не знаю как вкорячить. Технически это разумеется возможно, просто я пока не знаю как)
Далее по версиям OS. Это зависит исключительно от удобства администрирования, от привычки работы с ними. Для большинства задач и сайтов мне видится Centos удобней. В Debian 8 легко можно поставить обе версии параллельно. По-умолчанию там ставится из стабильных официальных репов 5.6 версия. Но можно установить дополнительно 7ю версию и переключаться между ними. В режиме php-fpm можно запускать сайты параллельно на разных версиях, в режиме модуля апача можно юзать либо ту либо другую, легко между ними переключаться. В режиме CGI тоже можно, но его вообще не стоит юзать. Если только для отладки.
На продакшн ставят то, что нормально работает) Поэтому перед продакшном надо погонять в тестах 🙂 Буквально на прошлой неделе переводил на php 7 как раз самый что ни на есть продакшн — огромную онлайн-библиотеку с трафом 200к в сутки, работающую на кластере из трёх серваков. В паре с разрабом, так задолбались, несколько дней по ночам. Оно работало на debian 7, в который вообще нет технической возможности поставить толком php 7 в режиме апача. Пришлось апгрейдить OS до debian 8, и потом только ставить php 7. Переключить у нас получилось только с третьей попытки, первые две была нестабильность, тормоза, глюки и отвалившийся функционал. Причем, это с учетом того, что до этого было протестировано на PHP 7.