Cgi fastcgi: PHP: Коротко о CGI, FastCGI, PHP-FPM и mod_php

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:

    1. Загрузка диспетчера процессов FastCGI при загрузке веб-сервера (модуль IIS ISAPI или Apache)
    2. Менеджер процессов FastCGI инициирует создание нескольких процессов CGI, которые используются для ожидания подключения веб-серверов.
    3. Когда запросы от клиентов достигают веб-сервера, диспетчер процессов FastCGI выберет CGI, настроенный до подключения, чьи переменные среды и стандартный ввод будут отправлены в подпроцесс php-cgi FastCGI.
    4. Этот подпроцесс вернет стандартный вывод и информацию об ошибках на веб-сервер с тем же подключением. Запросы будут завершены, когда он закроет соединение.
  • Таким образом, 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.

This entry was posted in Популярное