В рамках статьи рассматривается установка и конфигурация mod_fastcgi и PHP-FPM на сервере с Debian 7 на котором используется Apache. По умолчанию Apache использует mod_php, весь контент (в том числе HTML и JavaScript) запрашиваемый пользователями при этом обрабатывается PHP, что означает нерациональное расходование ресурсов сервера и на высоких нагрузках (более 1000 одновременных соединений) может вызвать «торможение».
Вместо mod_php используется mod_fastcgi и FastCGI Process Manager(PHP-FPM), позволяющий значительно экономить ресурсы сервера.
Представленный материал является практически полным переводом статьи с сайта linode.com.
Как mod_fastcgi, так и PHP-FPM могут быть установлены непосредственно из репозиториев Debian 7.
Обновляем список репозиториев
apt-get update && apt-get upgrade —show-upgraded
Смотрим доступен ли для установки модуль libapache2-mod-fastcgi
apt-cache search libapache2-mod-fastcgi
Если нет — в /etc/apt/sources.list потребуется добавить репозитории в которых он присутствует, затем вновь выполнить apt-get update
Пакет присутствует в репозиториях Debian 7, добавить можно их
deb http://ftp.es.debian.org/debian stable main contrib non-free
deb-src http://ftp.es.debian.org/debian stable main contrib non-free
deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
deb-src http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free
Устанавливаем mod_fastcgi и PHP-FPM.
apt-get install libapache2-mod-fastcgi php5-fpm
Перезапускаем apache2
service apache2 restart
Также потребуется установить какой-либо мультипроцессорный модель
Ищем варианты в репозиториии
apt-cache search apache2-mpm
Устанавливаем prefork
apt-get install apache2-mpm-prefork
Снова перезапускаем
service apache2 restart
Активируем модуль actions
a2enmod actions
service apache2 restart
Чтобы увеличить производительность заставим PHP-FPM использовать UNIX сокеты вместо TCP
grep -E '^\s*listen\s*=\s*[a-zA-Z/]+' /etc/php5/fpm/pool.d/www.conf
По умолчанию они используются и вывод команды должен быть следующим:
listen = /var/run/php5-fpm.sock
Если сокет в выводе не упоминается — открываем следующий файл и вносим необходимые изменения
mcedit /etc/php5/fpm/pool.d/www.conf
Добавляем строку
listen = /var/run/php5-fpm.sock
Удаляем или комментируем
listen = 127.0.0.1:9000
Перезапускаем php5-fpm
service php5-fpm restart
Смотрим используемый версию веб сервера
apache2 -v
Далее потребуется вносить изменения в файл /etc/apache2/mods-enabled/fastcgi.conf
mcedit /etc/apache2/mods-enabled/fastcgi.conf
При использовании Apache версии 2.2 и ниже (версию мы установили на предыдущем шаге) добавляем следующий код (имеющийся в файле комментируем)
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>
При использовании Apache версии 2.4 и выше
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Проверяем конфигурацию
apache2ctl configtest
Если видим Syntax OK — перезапускаем Apache
service apache2 restart
cd /var/www/
mv index.html index.php
«<?php phpinfo(); ?>» > /var/www/index.php
Открываем браузер и при запросе IP адреса сервера видим информацию о текущей конфигурации PHP
Конфигурацрование Apache для работы с PHP-FPM
Настроим Apache для передачи всех запросов к файлам с расширением PHP непосредственно к PHP посредством враппера FastCGI.
Опциональная настройка PHP
PHP-FPM использует понятие поулов (pools). Используя пулы можно контролировать количество ресурсов, выделяемое виртуальным хостам, а также запускать скрипты от имени разных пользователей.
Сконфигурируем PHP-FPM для работы с доменом example.ru и пользователем tester (скрипты будут выполняться от его имени).
Создаем копию дефолтного конфигурационного файла, ее и будем редактировать
cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/example.com.conf
Открываем и меняем имя сайта, сокета и пользователя/группу пользователя
mcedit /etc/php5/fpm/pool.d/example.com.conf
; Start a new pool named 'www'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('www' here)
[example.ru]
…
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = tester
group = tester
…
listen = /var/run/php5-fpm_example.ru.sock
Перезапускаем сервис чтобы новый пул создался
service php5-fpm restart
Создаем виртуальный хост
mcedit /etc/apache2/sites-available/example.ru.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.ru
ServerAlias www.example.ru
DocumentRoot /var/www/example.ru/public_html/
ErrorLog /var/www/example.ru/error.log
CustomLog /var/www/example.ru/access.log combined
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi_example.ru
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi_example.ru -socket /var/run/php5-fpm_example.ru.sock -pass-header Authorization
</IfModule>
</VirtualHost>
Проверяем корректность конфигурации веб-сервера
apache2ctl configtest
Перезапускаем
service apache2 restart
Добавляем в каталог /var/www/example.ru/public_html index.php с любым тестовым кодом и тестируем через браузер.
Настройка mod_fastcgi и PHP-FPM на Debian 7 Wheezy с Apache завершена. Читайте также про настройку PHP как fastcgi без FPM на Debian 9.