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 сокет. Чтобы его использовать, в том же файле пропишите:
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:
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