Разные версии PHP в Apache в Ubuntu

В качестве сервера чаще всего мы используем Apache или Nginx. И там и там есть возможность использовать разные версии php. Здесь речь пойдет о Apache

Установка из репозиториев

для Ubuntu 18.04 необходимо установить пакет libapache2-mod-fcgid для 16.04 libapache2-mod-fastcgi хотя у меня для 16.04 пошел только первый пакет и все сработало нормально (видимо зависит от версии apache2).

Может понадобиться установить software-properties-common

sudo apt install software-properties-common

Чтобы установить другие версии php можно использовать репозиторий

sudo add-apt-repository ppa:ondrej/php && sudo apt update

Нажать enter и репозиторий установится.
Может случиться ситуация, что возникнет ошибка

Err:18 http://dl.google.com/linux/chrome/deb stable Release.gpg
The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 6494C6D6997C215E

в этом случае нужно добавить ключ вручную

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 6494C6D6997C215E

и снова запустить sudo apt-get update

Установка PHP

очевидно, что установить можно любую версию, важно отметить что основную версию php7.2 можно не ставить, для наших нужнд достаточно php7.2-fpm, хотя в целом в данном случае это ни на что не влияет.

sudo apt install php7.2 php7.2-fpm

после установки необходимо найти сокеты в /var/run/php/

ls /var/run/php/
total 8
-rw-r--r-- 1 root     root     4 Feb 17 16:50 php5.6-fpm.pid
srw-rw---- 1 www-data www-data 0 Feb 17 16:50 php5.6-fpm.sock
-rw-r--r-- 1 root     root     5 Feb 17 16:51 php7.2-fpm.pid
srw-rw---- 1 www-data www-data 0 Feb 17 16:51 php7.2-fpm.sock

Необходимо добавить необходимые плагины/библиотеки PHP (список может быть другой)

sudo apt install php7.2-mysql
sudo apt install php7.2-curl
sudo apt install php7.2-mbstring
sudo apt install php7.2-intl
sudo apt install php7.2-xml

Настройка

Ubuntu 18.04 (для моего 16.04 подошел именно этот вариант)

sudo a2enmod actions alias proxy_fcgi fcgid

Ubuntu 16.04

sudo a2enmod actions alias proxy_fcgi fastcgi

Перезагружаем Apache

sudo systemctl restart apache2
# или
sudo service apache2 restart

Virtual Host

<VirtualHost *:80>

...

    <FilesMatch \.php$>
        # Apache 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>

...

</VirtualHost>
sudo systemctl restart apache2

Доступы

После запуска сайта через сокет php может возникнуть ситуация и ошибка

502 Bad Gateway
503
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Если посмотреть текст ошибки в логах, например в /etc/apache2/logs/error_log или в /var/www/vhosts/example.com/logs/error_log и увидеть там что-то типа этого

(13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /var/www/vhosts/system/example.com/php-fpm.sock (127.0.0.1) failed

Это значит, что сокет запускается от имени пользователя, который находится в другой группе и текущему пользователю запрещен доступ. Другими словами сокет запускается от пользователя www-data (33), но текущий процесс может быть запущем не от www-data, это значит что текущего пользователя необхоидмо добавить в группу www-data. (Это можно изменить в настройках php7.2-fpm например. В файле /etc/php/7.2/fpm/pool.d/www.conf)

sudo usermod -a -G www-data user

здесь user — имя пользователя, от которого запускается apache2

Источники

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.