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 030, из них сегодня: 1]

Добавить комментарий