Различия

Показаны различия между двумя версиями страницы.


Предыдущая версия
fastcgi [2025/07/06 12:38] (текущий) – внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Коротко что такое CGI, FastCGI, PHP-FPM и mod_php ======
 +{{htmlmetatags>
 +metatag-description=(Сравнение режимов работы интерпретатора PHP-скриптов.)
 +}}
  
 +{{ ::cgi_fastcgi_php-fpm_mod_php.jpg?nolink&600 |}}
 +
 +Рекомендации по выбору режима работы PHP (все эти варианты режимов из коробки поддерживает, например [[fastpanel|Fastpanel]]):
 +
 +  * Если сайт не использует файл .htaccess, выбирайте PHP-FPM.
 +  * Если сайт использует .htaccess и для него подходит основная версия PHP, используйте PHP как модуль Apache.
 +  * Если сайт использует .htaccess, но нужна дополнительная версия PHP, выбирайте FastCGI.
 +  * CGI — самый медленный режим, его рекомендуется выбирать только в случаях, если при других режимах сайт работает некорректно.
 +
 +===== CGI =====
 +
 +<alert type="info" icon="glyphicon glyphicon-ok">Основной момент: "CGI" это не язык программирования и не отдельная программа! Это просто протокол (стандарт, спецификация, соглашение, набор правил).</alert>
 +
 +
 +CGI описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры [[HTTP|HTTP]] -запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа. В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, в том числе на shell. CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP. Хотя сам [[PHP|PHP интерпретатор]] позволяет работать в режиме CGI.
 +
 +Стандарт "Common Gateway Interface" (сокращенно CGI) означает, что веб-сервер запускает дополнительный процесс PHP для каждого запроса. Поэтому все модули PHP, php.ini и всю другую конфигурацию необходимо загружать и анализировать при каждом запросе, что неэффективно.
 +
 +
 +==== PHP как CGI ====
 +
 +В этом режиме запускается интерпретатор php-cgi для всех скриптов, для которых установлен CGI в качестве обработчика. Если большая часть сайта состоит из статического содержимого, то CGI будет хорошим выбором, т.к. будет обеспечено экономичное использование оперативной памяти за счет того, что интерпретатор будет вызываться в случае необходимости. Но и в то же время такой метод замедляет исполнение, т.к. при каждом запросе понадобится загрузка интерпретатора в память.
 +
 +Преимущества:
 +
 +  * Все скрипты выполняются с правами пользователя – владельца www-домена.
 +  * Возможность индивидуальной настройки PHP для каждого пользователя.
 +  * Меньший расход оперативной памяти по сравнению с модулем apache
 +  * Ошибки в скриптах не приводят к падению веб-сервера в отличие от режима PHP как модуль apache
 +Недостатки:
 +
 +  * Проблемы с авторизацией средствами PHP (средствами команды Header) по причине того, что не передаются некоторые переменные сервера php-скрипту.
 +
 +===== FastCGI =====
 +**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 — просто спецификация.
 +===== PHP в режиме FastCGI =====
 +
 +Помимо CGI режима, PHP из коробки умеет работать и в FastCGI режиме (с версии 5.3 даже в двух FastCGI режимах). Режим включается флагом при компиляции интерпретатора, флаг зависит от версии PHP.
 +
 +Для работы с [[Apache|Apache]] нужен модуль mod_fcgid или mod_fastcgi, либо связка из mod_proxy_fcgi + PHP-FPM.
 +
 +[[Nginx|Nginx]] умеет работать с FastCGI приложениями из коробки, но именно для PHP дополнительно нужен PHP-FPM.
 +
 +Следует помнить, что при работе PHP в режиме FastCGI в памяти висит сам php интерпретатор, а не какой-то конкретный php-скрипт.
 +
 +По своим свойствам FastCGI является золотой серединой между mod_php и CGI режимами. В нём исключены недостатки CGI и присутствуют его достоинства. При включенном FastCGI, в ОЗУ сервера располагается постоянно запущенный процесс-обработчик. Это избавляет от необходимости при каждом запросе запускать новый процесс, как в случае использования CGI. По быстродействию FastCGI аналогичен mod_php.
 +
 +FastCGI сочетает в себе преимущества всех приведенных выше режимов. В этом случае php-обработчик запускается на постоянной основе, и теперь на каждый запрос не нужно создавать новый процесс, что было свойственно режиму CGI. FastCGI особенно подходит для высоконагруженных сайтов, нагрузка на которые постоянна.
 +
 +Преимущества:
 +
 +  * За счет кэширования некоторых промежуточных данных скрипт не интерпретируется каждый раз при выполнении и достигается более высокая скорость по сравнению с PHP как CGI.
 +Недостатки:
 +
 +  * Лишний процесс пользователя (php-cgi) находится в памяти после первого обращения к процессу.
 +==== Решение частых проблем PHP (mod_fcgid) в режиме FastCGI ====
 +Вопрос ответ на часто встречающие ошибки FastCGI. Документация по модулю [[https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html|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)
 +
 +Да ошибки разные но решаются все в одном месте, установкой параметров:
 +
 +<file>
 +nano /etc/apache2/mods-available/fcgid.conf
 +или
 +nano /etc/httpd/conf.d/fcgid.conf
 +</file>
 +
 +<file>
 +FcgidIdleTimeout 1200
 +FcgidProcessLifeTime 1200
 +FcgidConnectTimeout 1200
 +FcgidIOTimeout 1200
 +FcgidMaxRequestLen 2000000
 +</file>
 +
 +Ubuntu
 +<file>
 +systemctl restart apache2; systemctl restart php7.4-fpm.service
 +</file>
 +Centos
 +<file>
 +systemctl restart httpd; systemctl restart php-fpm.service
 +</file>
 +
 +===== PHP-FPM =====
 +FPM (FastCGI Process Manager, менеджер процессов FastCGI) является альтернативной реализацией PHP FastCGI с несколькими дополнительными возможностями обычно используемыми для высоконагруженных сайтов.
 +
 +Изначально PHP-FPM представлял из себя набор патчей от Андрея Нигматулина, которые устраняли ряд проблем, мешающих полноценно использовать PHP в режиме FastCGI. С версии PHP 5.3 набор патчей включён в ядро, а дополнительные возможности PHP-FPM включаются флагом при компиляции.
 +
 +PHP-FPM используется в основном в связке с [[Nginx|Nginx]], без установки Apache.
 +
 +**Как работает PHP-FPM?**
 +
 +Представим, что в наше приложение одновременно приходит 50 клиентов. Сначала они обращаются в наш NGINX, который по факту пробрасывает запросы сквозь себя на PHP-FPM (за исключением запросов за статическими ресурсами/файлами), а дальше PHP-FPM пытается обработать все запросы с помощью своих процессов (воркеров).
 +
 +Допустим у нас запущено 5 воркеров. В таком случае во время одновременного запроса первые 5 клиентов будут обрабатываться сразу, а остальные 45 становятся в очередь и ждут, когда первые 5 закончат обработку. PHP-FPM позволяет задавать настройки в зависимости от ваших потребностей, будь то динамическое увеличение воркеров для того чтобы клиенты не ждали в очереди или экономия ресурсов с целью ускорения обработки запросов со статическим количеством воркеров.
 +
 +  * [[fastpanel#shag_51kakie_rezhima_raboty_php_podderzhivaet_fastpanel|Какие режима работы PHP поддерживает Fastpanel]]
 +  * [[zabbix_agent#sbor_statistiki_monitoring_php-fpm_v_zabbix|Сбор статистики, мониторинг PHP-FPM в Zabbix]]
 +
 +===== PHP как модуль Apache mod_php =====
 +
 +Это модуль для Apache, позволяющий ему выполнять php скрипты. Является наверно самым популярным и простым способом подружить Apache и PHP. Модуль не использует ни CGI, ни FastCGI. Есть свои минусы — скрипты работают под пользователем веб-сервера, невозможно использовать больше одной версии PHP.
 +
 +===== PHP LSAPI =====
 +PHP LSAPI — это интерфейс API, разработанный для работы с веб-серверами LiteSpeed. Он также может использоваться с другими серверами, такими как Apache (с модулем LiteSpeed) и Nginx (с некоторыми настройками).
 +===== LiteSpeed PHP (LSPHP) =====
 +LiteSpeed PHP (LSPHP) — реализован в виде модуля mod_lsapi на веб-сервере Apache и является наиболее производительным вариантом запуска PHP на серверах под управлением сPanel.
 +
 +Преимущества:
 +
 +  * Увеличение скорости обработки PHP-скриптов, что ускоряет работу всего сайта.
 +  * Отсутствие 500-ой ошибки при наличии php_flag и подобных директив в .htaccess. Актуально при переезде с хостинга, который по умолчанию работал с mod_php.
 +  * Уменьшится потребление ресурсов в вашем виртуальном контейнере.
 +  * Улучшится эффективность работы Opcode Cache
 +
 +Как запустить скрипт [[PHP|PHP]] из планировщика [[cron|cron]]?
 +
 +Скрипт PHP можно запустить с помощью планировщика cron, прописав перед адресом скрипта:
 +<file bash>
 +/usr/bin/php-cgi /(путь...)/script.php
 +</file>
 +Скрипт PHP может находиться в любой директории, т.е. быть недоступным через FTP.
 +
 +===== Заключение =====
 +Если вы используете веб-сервер LiteSpeed или планируете перейти на него, режим PHP LSAPI может предложить лучшую производительность и простоту настройки. Если же вы используете Nginx или другой веб-сервер, FastCGI с PHP-FPM будет лучшим выбором из-за своей гибкости, зрелости и широкой поддержки.

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!