Содержание
PHP: Коротко о CGI, FastCGI, PHP-FPM и mod_php
Решил навести в голове порядок о том, как работают вместе веб-сервер и 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.
Подробная лекция от Дмитрия Елисеева.
Коротко о 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 — клиент-серверный протокол взаимодействия веб-сервера и приложения, дальнейшее развитие технологии 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 — просто спецификация.
Помимо 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-скрипт.
Вопрос ответ на часто встречающие ошибки 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
Ubuntu
systemctl restart apache2; systemctl restart php7.4-fpm.service
Centos
systemctl restart httpd; systemctl restart php-fpm.service
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 позволяет задавать настройки в зависимости от ваших потребностей, будь то динамическое увеличение воркеров для того чтобы клиенты не ждали в очереди или экономия ресурсов с целью ускорения обработки запросов со статическим количеством воркеров.
Это модуль для Apache, позволяющий ему выполнять php скрипты. Является наверно самым популярным и простым способом подружить Apache и PHP. Модуль не использует ни CGI, ни FastCGI. Есть свои минусы — скрипты работают под пользователем веб-сервера, невозможно использовать больше одной версии PHP.
Что такое CGI, FastCGI? | База знаний
CGI ( C ommon G ateway I интерфейс) — это веб-технология и протокол, определяющие способ взаимодействия веб-сервера (HTTP-сервера) с внешними приложениями, например PHP. CGI расширяет возможности веб-сервера, позволяя создавать и обрабатывать динамическое содержимое.
CGI используется как интерфейс между веб-сервером и дополнительно установленными приложениями, генерирующими динамический веб-контент. Эти приложения называются сценариями CGI и написаны на разных сценариях и языках программирования, таких как PHP, Perl, Python и т. д.
На заре Всемирной паутины первые веб-серверы предоставляли страницы, содержащие предварительно написанный HTML-код. Это содержимое не могло быть изменено, если только его разработчик не модифицировал файл .html. Раньше веб-контент был статичным, а доступный код веб-страницы передавался с веб-сервера в браузер.
Однако при использовании технологии CGI веб-сервер не отвечает существующим HTML-файлом, а выполняет приложение, в котором он передает данные HTTP-запроса. Затем приложение принимает и обрабатывает аргументы, возвращая выходные данные на веб-сервер. Только после этого сервер возвращает ответ на запрос, пересылая сгенерированный HTML-код.
каталог cgi-bin
Обычно веб-страницы, файлы и все документы, которые передаются с веб-сервера в браузер, хранятся в определенном общедоступном каталоге, таком как home/user/public_html. Когда браузер запрашивает определенный контент, сервер проверяет этот каталог и отправляет требуемый файл в браузер.
Если на сервере установлен CGI, туда также добавляется конкретный каталог cgi-bin, например, home/user/public_html/cgi-bin. CGI-скрипты хранятся в этом каталоге. Каждый файл в каталоге рассматривается как исполняемая программа. При доступе к скрипту из каталога сервер отправляет запрос приложению, отвечающему за этот скрипт, вместо отправки содержимого файла в браузер. После завершения обработки входных данных приложение отправляет выходные данные на веб-сервер, который пересылает данные HTTP-клиенту.
Например, при доступе к сценарию CGI http://mysitename.com/ cgi-bin/file.pl сервер запустит соответствующее приложение Perl через CGI. Данные, сгенерированные в результате выполнения скрипта, будут отправлены приложением на веб-сервер. Сервер, с другой стороны, будет передавать данные в браузер. Если бы на сервере не было CGI, браузер сам бы отобразил код файла .pl.
Сервер можно настроить так, чтобы он распознавал не только CGI-скрипты в каталоге cgi-bin, но и файлы с определенным расширением как CG-скрипты. Например, все файлы с расширением .php можно рассматривать как сценарии CGI. В этом случае их не обязательно хранить в каталоге cgi-bin. В настройках веб-сервера вы можете выбрать приложение, которое будет использоваться при доступе к файлу с расширением .php.
FastCGI
FastCGI — это более новая веб-технология, улучшенная версия CGI, так как основная функциональность остается прежней.
Необходимость в разработке FastCGI заключается в том, что Интернет возник из-за быстрого развития и сложности приложений, а также для устранения недостатков масштабируемости технологии CGI. Чтобы удовлетворить эти требования, компания Open Market представила FastCGI — высокопроизводительную версию технологии CGI с расширенными возможностями.
Мы выявили некоторые различия между двумя веб-технологиями, чтобы подробно описать функции FastCGI.
CGI CGI запускает приложение, которое работает с запрошенным скриптом для каждого HTTP-запроса. После того, как приложение завершает обработку и возвращает выходные данные, CGI завершает процесс приложения. В следующем запросе CGI запускает приложение. Каждый следующий запуск может потребовать больше времени и ресурсов, чем сама генерация выходных данных. Чем больше запущено процессов, тем больше ресурсов, таких как ОЗУ или вычислительная мощность, будет задействовано. Время загрузки веб-страницы теперь определяется не только загрузкой сервера, но и временем загрузки приложения. | FastCGI Отличие от CGI заключается в том, что с FastCGI процесс выполнения приложения длится дольше и не прерывается сразу. После того, как приложение завершает обработку и возвращает выходные данные, процесс не завершается и используется для обработки дальнейших запросов. Это приводит к снижению нагрузки на сервер и сокращению времени загрузки страницы. Еще одно отличие состоит в том, что FastCGI можно использовать на удаленном сервере, отличном от веб-сервера. Основной функцией приложений CGI является обработка данных запроса HTTP и возврат ответа HTTP. Это так называемая роль «Responder» в FastCGI. Кроме того, приложение также может выполнять роли Авторизатора и Фильтра. |
PHP и HTTP-сервер Apache
Существует два распространенных способа обработки PHP веб-сервером Apache.
1. Используя CGI или FastCGI , сервер запускает исполняемый двоичный файл, который является интерпретатором PHP. Это изолированный процесс, выполняемый вне процесса веб-сервера.
После изменения настроек PHP (в файле php.ini) можно перезапустить только процесс PHP без влияния на веб-сервер.
2. При использовании PHP в качестве модуля на сервере Apache (mod_php) интерпретатор PHP находится в коде веб-сервера. Процесс PHP является частью процесса веб-сервера.
Если есть какие-либо изменения в настройках PHP, необходимо перезапустить веб-сервер, чтобы они вступили в силу. Директивы PHP (php_flag, php_value…) могут быть размещены в файле .htaccess на сервере.
На серверах виртуального хостинга от SuperHosting.BG PHP может работать как CGI или FastCGI .
Технология CGI была первоначально представлена в 1993 году как часть веб-сервера NCSA HTTPd ( N национальный C вход для S эмон). Первая версия CGI v.1.1 была выпущена в 1997 году.
Самый популярный и широко используемый HTTP-сервер Apache изначально был основан на веб-сервере NCSA HTTP, который фактически является продолжением первого веб-сервера в Интернете — CERN httpd.
Различия между CGI, FastCGI, PHP-CGI, PHP-FPM, Spawn-FCGI · PersonalWiki
Работает на GitBook
Компьютерная графика
- CGI , Common Gateway Interface, представляет собой инструмент для HTTP-сервера для связи с программами на других серверах, который можно использовать на любых языках со стандартным вводом, стандартным выводом и переменными среды, такими как PHP, Perl или Tcl.
FastCGI
- FastCGI — это долгоживущая CGI, которая всегда будет работать. С FastCGI для разветвления потребуется меньше времени (что является проблемой режима разветвления и выполнения в CGI). Кроме того, FastCGI также поддерживает распределенные вычисления.
Это также не связано с языком, который является открытым расширением CGI, которое используется для поддержания работы CGI в памяти. Общеизвестно, что загрузка CGI была основной причиной низкой производительности.
основной процесс запуска FastCGI:
- Загрузка диспетчера процессов FastCGI при загрузке веб-сервера (модуль IIS ISAPI или Apache)
- Менеджер процессов FastCGI инициирует создание нескольких процессов CGI, которые используются для ожидания подключения веб-серверов.
- Когда запросы от клиентов достигают веб-сервера, диспетчер процессов FastCGI выберет CGI, настроенный до подключения, чьи переменные среды и стандартный ввод будут отправлены в подпроцесс
php-cgi
FastCGI. - Этот подпроцесс вернет стандартный вывод и информацию об ошибках на веб-сервер с тем же подключением. Запросы будут завершены, когда он закроет соединение.
- Таким образом, FastCGI устанавливается только один раз для разбора
php.ini
, загрузки расширений и инициализации всех структур данных.
ярлыки
- Из-за нескольких процессов FastCGI будет стоить больше памяти, чем CGI, каждый процесс которого (PHP-CGI) будет стоить от 7 до 25 МБ памяти.
- Данные из статьи: Nginx 0.8x + PHP 5.2.13(FastCGI) в 10 раз лучше, чем Apache(Edition 6)
- , когда 30k соединение происходит параллельно, 10 процессов Nginx будут стоить всего 150Mb Mem (15Mb 10), а 64 PHP-CGI будут стоить всего около 1280Mb (20Mb 64).
PHP-CGI
- PHP-CGI — это один из видов диспетчера процессов FastCGI, который находится внутри самого php.
- Команда для загрузки выглядит следующим образом:
php-cgi -b 127.0.0.1:9000
ярлыки
- После изменения
php.ini
вы должны перезагрузить PHP-CGI, чтобы новыйphp.ini
заработал. - Когда процесс PHP-CGI завершается, весь код PHP не может быть запущен. (PHP-FPM и Spawn-FCGI не имеют такой же проблемы)
PHP-FPM
- PHP-FPM — еще один вид диспетчера процессов FastCGI, который можно скачать здесь.
- На самом деле это патч для PHP, который используется для интеграции диспетчера процессов FastCGI в PHP, который должен быть включен в PHP до версии 5.3.2.
- PHP-FPM может использоваться для управления подпроцессами PHP-CGI:
/usr/local/php/sbin/php-fpm [параметры]
# параметры
# --start: запустить процесс fastcgi для php
# --stop: принудительно завершить процесс fastcgi php
# --quit: гладко завершить процесс fastcgi php
# --restart: перезапустить процесс fastcgi php
# --reload: гладко перезагрузить php.