CentOS 7 идет с PHP 5.4 на борту, его можно проапдейтить стандартным способом:
yum -y upgrade php* |
Однако что, если нам надо установить две и более версий PHP одновременно? Полноценных инструкций по установке и настройке от начала до конца я не нашел, поэтому решил написать свою.
Установка второй версии PHP
Устанавливать PHP можно из исходников или пакетов. Делается это командами
./configure (с набором параметров, указываемых через --) make make install |
Обратите внимание, что make install
не будет создавать INI-файл.
Но мы такой подход использовать не будет, потому что он требует тщательного конфигурирования в последствии. Я буду ставить PHP из пакетов репозитария REMI.
Для начала, откройте https://rpms.remirepo.net/wizard/ и выберите нужную версию PHP и операционной системы в Wizard и укажите, что тип установки: Multiple versions simultaneously. Мастер предложит вам последовательность команд для данной версии.
В моем случае это CentOS 7 и PHP 7.3:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install yum-utils -y yum-config-manager --enable remi-php73 yum install php73 -y yum install php73-php-fpm -y |
Проверяем установленную версию:
php73 -v |
и конфигурацию, которую он использует:
php73 -i |
php73 --modules |
Видим, что многих полезных модулей не хватает. Доустановим их:
yum -y install php73-php-bcmath php73-php-gd php73-php-mbstring php73-php-mysqlnd php73-php-pdo php73-php-pdo-dblib php73-php-pecl-http php73-php-pecl-http-debuginfo php73-php-pecl-mcrypt php73-php-pecl-mysql php73-php-pecl-propro php73-php-pecl-raphf php73-php-pecl-zip php73-php-soap php73-php-xml php73-php-xmlrpc |
Включаем загрузку и запустим PHP-FPM
systemctl enable php73-php-fpm
systemctl start php73-php-fpm |
Настройка Apache и PHP-FPM
Apache продолжает использовать версию PHP по умолчанию. Есть вариант проксирования трафика на FastCGI через FPM (FPM/FastCGI) или использование обертки CGI для FastCGI (CGI/FastCGI). Второй метод считается устаревшим и не рекомендуется.
FPM запускается как сервис и по умолчанию случают подключения на 127.0.0.1:9000. Проверить это можно командой:
netstat -na | grep "9000" |
Если у вас уже установлен FPM для другой версии PHP, то вам надо разнести их по портам. Для этого надо изменить привязку к порту в конфигурационном файле (в данном примере с 9000 на 9072):
sed -i 's/:9000/:9072/' /etc/opt/remi/php73/php-fpm.d/www.conf |
После перезапуска службы php73-php-fpm, проверяйте, что она слушает на новом порту. Но в моем случае это не потребовалось.
В conf файлах нужного вам сайта Apache необходимо указать новый обработчик для файлов с расширением PHP:
<VirtualHost *:*> # mod_proxy_fcgi options <IfModule mod_proxy_fcgi.c> <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </IfModule> </VirtualHost> |
В главном файле конфигурации Apache необходимо включить модуль proxy_fcgi_module
. По умолчанию, этот модуль отключен или даже не установлен. Чтобы его включить, в файле /usr/local/apache/conf/httpd.conf
раскомментируйте строчку
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
а если FastCGI вообще не установлен, то сначала его можно доустановить командой:
yum install mod_fcgid |
и перезапустите Apache:
service httpd reload |
Далее, необходимо в файле конфигурации php-fpm указать логин и пароль пользователя, под которым работает apache. В моем случае это nobody (по умолчанию там прописано apache). Изменения делаются в файле /etc/opt/remi/php73/php-fpm.d/www.conf
:
user = nobody group = nobody |
Как мы видим, в стандартной конфигурации PHP-FPM использует TCP сокет, однако более быстрым решением считается Unix сокет. Чтобы его использовать, в том же файле пропишите:
1 2 3 | listen = /run/php-fpm/www.sock listen.owner = apache listen.mode = 0660 |
Ну и замените пользователя на реального пользователя apache (в моем случае, nobody). В таком сценарии в конфигурации Apache должно быть:
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" |
Если у вас разные frontend и backend сервера Apache и FPM, то пропишите разные IP
listen = 10.0.0.2:9000
listen.allowed_clients = 10.0.0.1 |
а в httpd.conf:
SetHandler "proxy:fcgi://10.0.0.2:9000" |
А еще один сценарий, когда у вас несколько бэкенд серверов PHP-FPM для балансировки:
# Load balancer creation
<Proxy balancer://phpfpmlb>
BalancerMember fcgi://10.0.0.2:9000
BalancerMember fcgi://10.0.0.3:9000
BalancerMember fcgi://10.0.0.4:9000
</Proxy>
# Redirect PHP execution to the balancer
<FilesMatch \.php$>
SetHandler "proxy:balancer://phpfpmlb"
</FilesMatch>
И последний вариант, когда отдельно взятое приложение или путь использует отдельную версию FPM:
# Use PHP 7.1 by default
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9071"
</FilesMatch>
# Some legacy application use PHP 5.4
<Directory /var/www/html/old>
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
</Directory>
После этого перезагрузите php-fpm или Apache:
systemctl reload php73-php-fpm httpd |
Установка и настройка PHP-FPM для Nginx
yum install php-fpm |
Редактируем файл php-fpm конфигурации /etc/opt/remi/php73/php-fpm.d/
(расположение может отличаться, например быть /etc/php-fpm.d/www.conf):
user = nginx group = nginx listen = /run/php-fpm/www.sock listen.owner = nginx listen.group = nginx |
Убеждаемся, что пользователь, указанный в конфигурации, имеет права на папку с сессиями php:
chown -R root:nginx /var/lib/php systemctl enable php-fpm systemctl start php-fpm |
Настраиваем виртуальный сервер nginx:
1 2 3 4 5 6 7 8 9 10 | server { location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } |
systemctl restart nginx |