В качестве сервера чаще всего мы используем 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
Источники
- How to Run Multiple PHP Versions with Apache on Ubuntu 18.04 / 16.04
- The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY [duplicate]