PHP → Коротко о CGI, FastCGI, PHP-FPM и mod_php

16.12.2015

Решил навести в голове порядок о том, как работают вместе веб-сервер и 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.

Подробная лекция от Дмитрия Елисеева.

Похожие записи

Комментарии

dosug-kazan.info
24.12.2015, 12:05

недавно начали ддосить! взял сервак нанял сисадмина настроил все гуд!
Nginx + PHP-FPM

Гость
24.08.2016, 00:17

отличная статья. Коротко, по делу и дает ответы на все вопросы. спасибо!

Гость
20.09.2016, 16:35

Спасибо большое! Познавательно

Гость
02.12.2016, 06:38

Замечательная статья. Заменила две недели поисков информации в интернете.

Гость
30.12.2016, 00:49

Спасибо большое!
Подскажите, а PHP-FPM содержит в себе php? Если я ставлю PHP-FPM мне не нужно ставить php, получается это как бы надстройка над интерпретатором ?

Смотря что, как и где ставите. Читайте документацию.

Гость
01.02.2017, 18:34

а в случае PHP-FPM сам скрипт компилируется 1 раз и потом отдаётся всем уже из памяти?

если не стоит какой-нибудь opcache, который это умеет, то нет

Гость
01.02.2017, 19:17

стоит, стоит, конечно стоит
он же в составе идёт с 5.5 вроде

Гость
27.03.2017, 16:19

вот это вот

Основной момент: "CGI" это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).

очень помогло

Гость
03.07.2017, 18:17

Спасибо!!! Коротко, емко, грамотно!

Гость
03.12.2017, 19:04

Большое спасибо за статью! Лаконично и понятно.

Pashaster
05.10.2018, 14:36

Спасибо, понятно и по полочкам)))

Спасибо за статью, многое, что не мог нигде найти стало понятно!

anton4ik08
25.07.2019, 12:31

Огромное спасибо. Статья была полезна

Гость
16.10.2020, 15:08

Спасибо, очень коротко и понятно!

Катриченко Денис
12.07.2021, 11:39

CGI - Самый стабильный и надежный, вероятность падения сервера минимальная (самый медленный из всех режимов) СОВЕТУЮ ЕГО в большинстве случаев где есть работа с базой и важными данными. Так как вероятность что покрашится база минимальная. Для крупных стабильных проектов

Apache - Самый быстрый, но так как все работает в одной оболочке, любой из багнутых запоросов может положить весь сервак. В случае с cgi то там повиснет только один процесс, но система продолжит работать, процесс через какое то время будет убит автоматом.
Подойдет для работы с графикой сложными вычислениями и т.д

FastCGI - Просто середина, не рыба не мясо. Подойдет для простых сайтиков типа лендинга или блога где не часто происходит запись данных в базу

ЭТО ВСЕ ЧТО НУЖНО ВАМ ЗНАТЬ _)

to Катриченко Денис
"...Apache - Самый быстрый..." - дальше можно не читать.
Nginx +PHP-FPM - на продакшн сайтах - хайлоад - полет нормальный

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