Решил навести в голове порядок о том, как работают вместе веб-сервер и PHP.
CGI
Common Gateway Interface, "общий интерфейс шлюза" — это стандарт, который описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры HTTP-запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа.
В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, в том числе на shell.
CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP. Хотя сам PHP интерпретатор позволяет работать в режиме CGI (см. ниже).
Основной момент: "CGI" это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).
Примеры 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
отличная статья. Коротко, по делу и дает ответы на все вопросы. спасибо!
Спасибо большое! Познавательно
Замечательная статья. Заменила две недели поисков информации в интернете.
Спасибо большое!
Подскажите, а PHP-FPM содержит в себе php? Если я ставлю PHP-FPM мне не нужно ставить php, получается это как бы надстройка над интерпретатором ?
Смотря что, как и где ставите. Читайте документацию.
а в случае PHP-FPM сам скрипт компилируется 1 раз и потом отдаётся всем уже из памяти?
если не стоит какой-нибудь opcache, который это умеет, то нет
стоит, стоит, конечно стоит
он же в составе идёт с 5.5 вроде
вот это вот
Основной момент: "CGI" это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).
очень помогло
Спасибо!!! Коротко, емко, грамотно!
Большое спасибо за статью! Лаконично и понятно.
Спасибо, понятно и по полочкам)))
Гуд!
Спасибо за статью, многое, что не мог нигде найти стало понятно!
Огромное спасибо. Статья была полезна
Спасибо за статью
Спасибо, очень коротко и понятно!
CGI - Самый стабильный и надежный, вероятность падения сервера минимальная (самый медленный из всех режимов) СОВЕТУЮ ЕГО в большинстве случаев где есть работа с базой и важными данными. Так как вероятность что покрашится база минимальная. Для крупных стабильных проектов
Apache - Самый быстрый, но так как все работает в одной оболочке, любой из багнутых запоросов может положить весь сервак. В случае с cgi то там повиснет только один процесс, но система продолжит работать, процесс через какое то время будет убит автоматом.
Подойдет для работы с графикой сложными вычислениями и т.д
FastCGI - Просто середина, не рыба не мясо. Подойдет для простых сайтиков типа лендинга или блога где не часто происходит запись данных в базу
ЭТО ВСЕ ЧТО НУЖНО ВАМ ЗНАТЬ _)
to Катриченко Денис
"...Apache - Самый быстрый..." - дальше можно не читать.
Nginx +PHP-FPM - на продакшн сайтах - хайлоад - полет нормальный
Добавить комментарий