mod_fastcgi и PHP-FPM

В рамках статьи рассматривается установка и конфигурация 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

Установка mod_fastcgi и PHP-FPM на Debian 7 Wheezy с Apache

Конфигурацрование 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.