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 | 
 [Посещений: 2 074, из них сегодня: 1]
 [Посещений: 2 074, из них сегодня: 1]