Опубликовано:

Установка нескольких версии PHP в панели Vesta CP

Уверен, что у многих разработчиков возникает необходимость периодически обновлять версию 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 0Code 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.

Опубликовано:
Присоединяйся!

Подписывайся на блог и развивайся вместе со мной.

Внимание! Чтобы получать письма, необходимо подтвердить подписку. Для этого перейдите по ссылке в письме, которое я вам отправил на указанный Email.

Ваши комментарии