Наверное, многие сталкивались с ситуацией, когда среди проектов, работающих на современном ПО, остается пара полузабытых, а держать отдельную машину под них не хочется. Вариантов решения — масса, но в службе поддержки хостинг-компании данная проблема не теряет своей актуальности. Мои коллеги разработали скрипт, помогающий добавить нужную версию PHP в VestaCP буквально за пару минут. Данный метод уже зарекомендовал себя с хорошей стороны, и он продолжает радовать сотрудников поддержки. Самое время его опубликовать и помочь всем, кто столкнулся с подобной проблемой.
Для того чтобы воспользоваться решением, достаточно скопировать одну строчку в терминал, но мы рассмотрим чуть подробнее, как всё это работает.
Последний аргумент в команде — желаемая версия PHP. В настоящий момент доступны версии PHP: 5.2, 5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2 и 7.3. Скрипт создаст шаблон для Vesta и два сервисных файла: docker.httpd и docker.php.56.
Все сервисы выполняют установку/обновление образов, в связи с чем первый запуск (например, подключение шаблона в “Весте”) либо перезапуск при наличии обновлений может занять некоторое время.
PHP запускается от имени www-data. На хосте будет создан (если еще нет) соответствующий пользователь. Владелец директории сайта будет изменен на www-data, группа останется прежняя. Также будет создана директория /opt/docker/ для хранения конфигурационных файлов.
В итоге мы потратим ~700 Мб на установку самого докера и около ~300Мб на образы, но получим прирост производительности. Результаты измерения производительности средствами Bitrix в 1.5-2 раза выше для связки VestaCP + Docker, чем при использовании аналогичной версии PHP в качестве модуля Apache.
В таких случаях необходимо отредактировать файл /etc/systemd/system/docker.php.56.service (где 5.6 - установленная версия PHP):
--cpus=2 изменить на --cpus=1
Далее перезапустить докер:
Nginx -> apache в контейнере -> php-fpm в контейнере.
Apache потребовалось запаковать в контейнер (~80mb) из-за различий версий между CentOS и Apache. Версия в Centos не позволяет корректно проксировать запросы на fpm.
Apache запускается на порту 9080, поэтому скрипт редактирует конфигурацию nginx. Переключение на стандартный шаблон Vesta (default) вернет прежний порт (8080).
PHP запускается на 9000+version, то есть 9056, 9070, 9072 и т.д.
/etc/hosts — внешние адреса доменов Vesta, они нужны в контейнере для корректной работы сокетов в Bitrix, например. Файл обновляется при каждом переключении шаблонов в Vesta.
/opt/docker/conf/php/56/php.ini — файл, с помощью которого можно повлиять на параметры PHP в контейнере.
Установка будет выглядеть следующим образом: создаем Dockerfile в произвольной директории со следующим содержимым:
сервисном файле стоит удалить ExecStartPre=/usr/bin/docker pull kotpoliglot/php:56, чтобы запускался локальный образ, а не заново скачанный с DockerHub.
Сервисные файлы доступны по пути /etc/systemd/system/.
Если инструмент показался вам полезным — дайте знать, мы подготовим подобное решение, например, для панели ISPConfig.
Источник статьи: https://habr.com/ru/company/timeweb/blog/569338/
Для того чтобы воспользоваться решением, достаточно скопировать одну строчку в терминал, но мы рассмотрим чуть подробнее, как всё это работает.
Установка
Выполняется командой:Будет установлен (если не был установлен ранее) docker через унифицированный инсталлятор (проверялся на CentOS7 и Ubuntu).git clone https://github.com/kotpoliglot/vestaphpinstaller.git && cd vestaphpinstaller && chmod +x dockerize.sh && bash dockerize.sh -s --5.6
Последний аргумент в команде — желаемая версия PHP. В настоящий момент доступны версии PHP: 5.2, 5.3, 5.4, 5.5, 5.6, 7.0, 7.1, 7.2 и 7.3. Скрипт создаст шаблон для Vesta и два сервисных файла: docker.httpd и docker.php.56.
Все сервисы выполняют установку/обновление образов, в связи с чем первый запуск (например, подключение шаблона в “Весте”) либо перезапуск при наличии обновлений может занять некоторое время.
PHP запускается от имени www-data. На хосте будет создан (если еще нет) соответствующий пользователь. Владелец директории сайта будет изменен на www-data, группа останется прежняя. Также будет создана директория /opt/docker/ для хранения конфигурационных файлов.
В итоге мы потратим ~700 Мб на установку самого докера и около ~300Мб на образы, но получим прирост производительности. Результаты измерения производительности средствами Bitrix в 1.5-2 раза выше для связки VestaCP + Docker, чем при использовании аналогичной версии PHP в качестве модуля Apache.
Установка на одноядерный процессор
При установке докер-контейнера на сервер с одноядерным процессором (cpu=1) не будет автоматически запускаться контейнер PHP.В таких случаях необходимо отредактировать файл /etc/systemd/system/docker.php.56.service (где 5.6 - установленная версия PHP):
--cpus=2 изменить на --cpus=1
Далее перезапустить докер:
После чего переключить на нужную версию PHP в панели VestaCP. В случае если нужная версия уже выбрана, то необходимо переключить на дефолтную, сохранить и снова переключить на нужную версию PHP.systemctl stop docker
systemctl start docker
Схема работы
Схема работы выглядит следующим образом:Nginx -> apache в контейнере -> php-fpm в контейнере.
Apache потребовалось запаковать в контейнер (~80mb) из-за различий версий между CentOS и Apache. Версия в Centos не позволяет корректно проксировать запросы на fpm.
Apache запускается на порту 9080, поэтому скрипт редактирует конфигурацию nginx. Переключение на стандартный шаблон Vesta (default) вернет прежний порт (8080).
PHP запускается на 9000+version, то есть 9056, 9070, 9072 и т.д.
HTTPD
httpd запускается следующим образом:В /opt/docker/conf/web лежат хосты, httpd в контейнере с минимальным набором модулей из-за экономии ресурсов, хосты для контейнеров хранятся в /opt/docker/conf/web, в директории Vesta (/home/admin/conf/web/) создается пустой файл.docker run --rm --network host
-v /home:/home
-v /var/log/httpd/domains:/var/log/apache2/domains
-v /opt/docker/conf/web:/usr/local/apache2/conf/vhosts
--name docker-httpd kotpoliglot/php:httpd
PHP
PHP запускается следующим образом:passwd и group передаются в контейнер из-за различных требований к uname и uid в CentOS и Ubuntu.docker run --rm --network host --cpus=2
-v /etc/passwd:/etc/passwd
-v /etc/group:/etc/group
-v /etc/hosts:/etc/hosts
-v /var/lib/mysql/mysql.sock:/var/run/mysqld/mysqld.sock
-v /opt/docker/conf/php/56/php.ini:/usr/local/etc/php/conf.d/docker.ini
-v /home:/home --name php-56 kotpoliglot/php:56
/etc/hosts — внешние адреса доменов Vesta, они нужны в контейнере для корректной работы сокетов в Bitrix, например. Файл обновляется при каждом переключении шаблонов в Vesta.
/opt/docker/conf/php/56/php.ini — файл, с помощью которого можно повлиять на параметры PHP в контейнере.
Добавление модулей и пакетов
При необходимости можно добавить тот или иной модуль или пакет в контейнер. Образы собраны на основе alpine для экономии ресурсов. Пакеты ставятся через apk, например, создаем Dockerfile cо следующим содержимым:Затем сохраняем файл и выполняем:FROM kotpoliglot/php:56
RUN apk add --no-cache libpng-dev
docker build -t kotpoliglot/php:56 .
PHP
В случае, если требуется модуль для PHP, в контейнерах есть набор скриптов docker-php-ext-configure, docker-php-ext-install и docker-php-ext-enable (описание).Установка будет выглядеть следующим образом: создаем Dockerfile в произвольной директории со следующим содержимым:
Затем пересоздаем образ:FROM kotpoliglot/php:56
RUN docker-php-ext-install zip
Будет создан новый образ с прежним именем и установленным модулем.docker build -t kotpoliglot/php:56 .
сервисном файле стоит удалить ExecStartPre=/usr/bin/docker pull kotpoliglot/php:56, чтобы запускался локальный образ, а не заново скачанный с DockerHub.
Сервисные файлы доступны по пути /etc/systemd/system/.
Если инструмент показался вам полезным — дайте знать, мы подготовим подобное решение, например, для панели ISPConfig.
Источник статьи: https://habr.com/ru/company/timeweb/blog/569338/