Уверен, что у многих разработчиков возникает необходимость периодически обновлять версию PHP для своих сайтов. Сейчас напишу инструкцию о том, как установить новую версию PHP для Vesta Control Panel.
Несколько версий PHP для Vesta Control Panel
Для начала, следует сказать, что панель управления Vesta имеет некоторую специфику в работе с версиями PHP. В классической конфигурации панель может иметь только одну определенную версию PHP, которая работает непосредственно с Apache. Однако, мы сделаем небольшую хитрость, которая позволит иметь несколько версий PHP в панели Vesta. Для этого мы будем запускать новые версии PHP в режиме PHP-FPM. Таким образом можно для каждого отдельного сайта выбирать нужную версию интерпретатора. И так, приступим…
Фактически у нас получится сборка apache + php-fpm + nginx, потому что Веста не может работать без Apache из коробки, и мы не будем это исправлять.
Установка новой версии PHP на сервер Ubuntu
Сначала необходимо фактически установить новую версию PHP на сервер Ubuntu. По этому поводу уже существует множество инструкций, поэтому в этой статье я не буду подробно описывать этот процесс.
Мне нравится вот эта инструкция по установке PHP — Установка PHP в Ubuntu — Losst В инструкции устанавливается PHP 8, и также описано как установить другую версию. Однако, в текущей инструкции я буду описывать работу с версией 7.4. В общем, делаем все по инструкции, и затем возвращаемся сюда обратно. Если возникнут сложности с установкой PHP — пишем в комментариях, и мы обсудим эти вопросы.
Включаем новую версию PHP для Vesta
После того как новая версия PHP со всеми нужными расширениями установлена на сервере, мы можем включить ее для Vesta. Для этого необходимо создать новый шаблон конфигурации Vesta. С помощью шаблонов конфигурации мы сможем включать нужную версию PHP для каждого отдельного сайта.
Создаем шаблон конфигурации Vesta
Все шаблоны конфигурации у Vesta располагаются на сервере в следующей директории:
/usr/local/vesta/data/templates/web
Нам нужно создать шаблон для Apache и для Nginx.
Я покажу пример шаблонов для PHP версии 7.4. То есть, у меня на моем одном старом сервере работает Vesta с версией PHP 7.0 по умолчанию. Мне в какой-то момент понадобилось включить версию PHP 7.4 и поэтому я выполнил следующие манипуляции.
Не могу назвать себя “системным администратором“ или DevOps’ом, поэтому полагаю, что код скриптов ниже может быть оптимизирован. Допускаю, что где-то написано что-то лишнее или используется неправильно. Для меня же самое главное, чтобы все работало.
Шаблон конфигурации для Apache на Vesta
Нам понадобятся следующие три файла:
- PHP-FPM-74.sh
- PHP-FPM-74.stpl
- PHP-FPM-74.tpl
Располагаться эти файлы должны в следующей директории
/usr/local/vesta/data/templates/web/apache2
PHP-FPM-74.sh
Содержимое файла PHP-FPM-74.sh. В этом файле написан некоторый скрипт, который будет выполнен в момент переключения на соответствующий “режим” работы Apache для определенного хоста (сайта).
#!/bin/bash
# Adding php pool conf
user="$1"
domain="$2"
ip="$3"
home_dir="$4"
docroot="$5"
pool_conf="[$2]
listen = /run/php/php7.4-fpm-$2.sock
listen.owner = $1
listen.group = $1
listen.mode = 0666
user = $1
group = $1
pm = ondemand
pm.max_children = 16
request_terminate_timeout = 30s
pm.max_requests = 4000
pm.process_idle_timeout = 10s
pm.status_path = /status
php_admin_value[upload_tmp_dir] = /home/$1/tmp
php_admin_value[session.save_path] = /home/$1/tmp
php_admin_value[open_basedir] = $5:/home/$1/tmp:/bin:/usr/bin:/usr/local/bin:/var/www/html:/tmp:/usr/share:/etc/phpmyadmin:/var/lib/phpmyadmin:/etc/roundcube:/var/log/roundcube:/var/lib/roundcube
php_admin_value[upload_max_filesize] = 80M
php_admin_value[max_execution_time] = 20
php_admin_value[post_max_size] = 80M
php_admin_value[memory_limit] = 256M
php_admin_value[sendmail_path] = \"/usr/sbin/sendmail -t -i -f info@$2\"
php_admin_flag[mysql.allow_persistent] = off
php_admin_flag[safe_mode] = off
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /home/$1/tmp
env[TMPDIR] = /home/$1/tmp
env[TEMP] = /home/$1/tmp
"
pool_file_56="/etc/php/5.6/fpm/pool.d/$2.conf"
pool_file_70="/etc/php/7.0/fpm/pool.d/$2.conf"
pool_file_71="/etc/php/7.1/fpm/pool.d/$2.conf"
pool_file_72="/etc/php/7.2/fpm/pool.d/$2.conf"
pool_file_73="/etc/php/7.3/fpm/pool.d/$2.conf"
pool_file_74="/etc/php/7.4/fpm/pool.d/$2.conf"
if [ -f "$pool_file_56" ]; then
rm $pool_file_56
service php5.6-fpm restart
fi
if [ -f "$pool_file_70" ]; then
rm $pool_file_70
service php7.0-fpm restart
fi
if [ -f "$pool_file_71" ]; then
rm $pool_file_71
service php7.1-fpm restart
fi
if [ -f "$pool_file_72" ]; then
rm $pool_file_72
service php7.2-fpm restart
fi
if [ -f "$pool_file_73" ]; then
rm $pool_file_73
service php7-3-fpm restart
fi
write_file=0
if [ ! -f "$pool_file_74" ]; then
write_file=1
else
user_count=$(grep -c "/home/$1/" $pool_file_74)
if [ $user_count -eq 0 ]; then
write_file=1
fi
fi
if [ $write_file -eq 1 ]; then
echo "$pool_conf" > $pool_file_74
service php7.4-fpm restart
fi
if [ -f "/etc/php/7.4/fpm/pool.d/www.conf" ]; then
rm /etc/php/7.4/fpm/pool.d/www.conf
fi
exit 0
Code language: PHP (php)
PHP-FPM-74.tpl
Содержимое файла PHP-FPM-74.tpl
<VirtualHost %ip%:%web_port%>
ServerName %domain_idn%
%alias_string%
ServerAdmin %email%
DocumentRoot %docroot%
ScriptAlias /cgi-bin/ %home%/%user%/web/%domain%/cgi-bin/
Alias /vstats/ %home%/%user%/web/%domain%/stats/
Alias /error/ %home%/%user%/web/%domain%/document_errors/
#SuexecUserGroup %user% %group%
CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
CustomLog /var/log/%web_system%/domains/%domain%.log combined
ErrorLog /var/log/%web_system%/domains/%domain%.error.log
<Directory %home%/%user%/web/%domain%/stats>
AllowOverride All
</Directory>
<Directory %sdocroot%>
AllowOverride All
Options +Includes -Indexes +ExecCGI
</Directory>
<IfModule mod_ruid2.c>
RMode config
RUidGid %user% %group%
RGroups www-data
</IfModule>
# <IfModule itk.c>
# AssignUserID %user% %group%
# </IfModule>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm-%domain%.sock|fcgi://localhost/"
</FilesMatch>
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
IncludeOptional %home%/%user%/conf/web/%web_system%.%domain%.conf*
</VirtualHost>
Code language: HTML, XML (xml)
PHP-FPM-74.stpl
Содержимое файла PHP-FPM-74.stpl
<VirtualHost %ip%:%web_ssl_port%>
ServerName %domain_idn%
%alias_string%
ServerAdmin %email%
DocumentRoot %sdocroot%
ScriptAlias /cgi-bin/ %home%/%user%/web/%domain%/cgi-bin/
Alias /vstats/ %home%/%user%/web/%domain%/stats/
Alias /error/ %home%/%user%/web/%domain%/document_errors/
#SuexecUserGroup %user% %group%
CustomLog /var/log/%web_system%/domains/%domain%.bytes bytes
CustomLog /var/log/%web_system%/domains/%domain%.log combined
ErrorLog /var/log/%web_system%/domains/%domain%.error.log
<Directory %home%/%user%/web/%domain%/stats>
AllowOverride All
</Directory>
<Directory %sdocroot%>
AllowOverride All
SSLRequireSSL
Options +Includes -Indexes +ExecCGI
</Directory>
SSLEngine on
SSLVerifyClient none
SSLCertificateFile %ssl_crt%
SSLCertificateKeyFile %ssl_key%
%ssl_ca_str%SSLCertificateChainFile %ssl_ca%
<IfModule mod_ruid2.c>
RMode config
RUidGid %user% %group%
RGroups www-data
</IfModule>
# <IfModule itk.c>
# AssignUserID %user% %group%
# </IfModule>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm-%domain%.sock|fcgi://localhost/"
</FilesMatch>
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
IncludeOptional %home%/%user%/conf/web/s%web_system%.%domain%.conf*
</VirtualHost>
Code language: HTML, XML (xml)
Это шаблоны подходят для классической ситуации, например для запуска WordPress сайта. Иногда может возникнуть необходимость кастомизирвать конфигурацию, и в таком случае можно просто скопировать шаблоны, переименовать нужным образом и кастомизировать конфигурацию.
Например, для запуска Laravel сайтов я редактирую в файле PHP-FPM-74.sh строку php_admin_value[open_basedir] чтобы предоставить интерпретатору доступ к некоторым другим директориям на сервере, к которым будет обращаться сайт.
Настройка шаблонов Nginx
Для шаблонов никаких дополнительных настроек не требуется. В целом NGinx должен работать в прежнем режиме с новыми версиями PHP.
Как на Vesta поменять версию PHP для сайта
После того как шаблоны были созданы и загружены на сервер, они появятся автоматически в панели Vesta на странице настроек веб-домен. Для того, чтобы выбрать версию PHP для сайта, необходимо установить для Apache нужный шаблон и сохранить настройки домена. При этом будет запущен скрипт PHP-FPM-74.sh, который создаст файл конфигурации для PHP-FPM примерно в следующем расположении:
/etc/php/7.4/fpm/pool.d/your.domain.ru.conf
А из шаблонов PHP-FPM-74.tpl и PHP-FPM-74.stpl будут созданы файлы конфигурации в следующем расположении:
/home/vesta_user_name/conf/web/your.domain.ru.apache2.conf
и
/home/vesta_user_name/conf/web/your.domain.ru.apache2.conf
соответственно.
Возникли ошибки?
Если при использовании этой инструкции возникнут ошибки, то прошу писать комментарии, и вместе попробуем разобраться в причинах. Ошибки действительно могут возникнуть, поскольку может отличаться окружение на сервере, может быть установлено дополнительное ПО или что-то еще. Также не исключаю человеческий фактор. Текст шаблонов взят из моего рабочего конкретного примера, поэтому можно быть уверенным в том, что это рабочая инструкция о том, как обновить версию PHP для сайта на Vesta.