Как стать автором
Обновить

Установка VestaCP на VPS, использование docker для понижения версии PHP

Время на прочтение 7 мин
Количество просмотров 7.5K
Доброго времени!

Оставлю тут решение для своего хостинга на VPS за 5 евро, в основном с целью сохранить реализацию решения по своей проблеме.

Несколько лет назад я арендовал выделенный сервер под 20+ сайтов, файлообменник, базу даных на PostgreSQL для 1С, почтовый сервер IMAP. В качестве панели управления использовал ISPmanager с «вечной» лицензией, в качестве ОС был использован изначально CentOS 7 (или даже 6), который я не очень уважаю, больше нравится Debian/Ubuntu. В дальнейшем проекты уходили в соцсети, сайты переставали быть необходимыми, доменные имена освобождались.

В 2019 году я понял, что реально крутится мой сайт и два сайта клиентов, потребность в IMAP с хранением писем на хостинге только у меня, файлообменники так же ушли в облачные сервисы.



Что делать, если один сайт на хостинге не работает с PHP выше 5.4

Решил попробовать почистить проект и развернуть его на более дешевом VPS с 40Гб hdd, 2 CPU, 4ОЗУ против 8 ядер i7, 750 SSD, 24ОЗУ.

База postgresql переехала на i5 HP мини компьютер с 16Гб ОЗУ на платяной шкаф дома, в новом VPS в docker завел RouterOS, настроил L2TP и получаю доступ через туннель к базам данных 1С из другого VPS с Windows 8.1 на борту. Можно было бы развернуть ОС Windows на машине на платяном шкафу под эти цели, но все скрипты обслуживания PostgreSQL заточены под Linux, субъективно он быстрее отрабатывает под Linux, есть клиенты вне моих машин на хостинг базы данных.

Итак вводная:

  1. Итоговый размер на хостинге 30Гб вместе с ОС, сайтами и почтой;
  2. Бекап данных в облако;
  3. Один сайт самописный, два на WP;
  4. Базы в MySQL;
  5. Возможность добавлять сайты по необходимости;
  6. Минимально управлять в консоли ssh (нужна панель управления сайтами);
  7. Возможность развернуть какой-либо проект на хостинге (свободное место и свободная мощность).

После изучения предложений по бесплатным панелям управления решил остановиться на VestaCP, хотя несколько удивлен, что CP не поддерживает последние версии популярных RedHat/Debian дистрибутивов. Привожу скриншот на момент написания статьи



По минимальным требованиям к системе с моей VPS все здорово.

Итак, hetzner.cloud, создаю проект (project), в нем машина CX21, создать.

VestaCP ставит nginx proxy к apache2, конфиг создается для каждого сайта/пользователя.

Не буду описывать все попытки, только финальная — Debian 9.

Получаем SSH-2 RSA ключ с помощью PuTTY
В PuTTY утилитой puttygen генерирую SSH-2 RSA ключ, традиционно закидываю его себе в Dropbox.

В разделе Acess проекта hetzner.cloud добавляю отпечаток ключа RSA, указываю в самом PuTTY в настройках доступа в разделе SSH->Аутентификация (у меня PuTTY RUS) файл с ключом идентификации из Dropbox. В результате получаю доступ к консоли машины.

Обновляем систему:

apt-get update -y
apt-get upgrade -y 
apt-get install mc -y
reboot

Ставим VestaCP на Debian 9
Процесс простой.
В Debian установщик ругнулся на то, что exim по-умолчанию имеет конфигурацию, выбрал «y» в пункте продолжать с модификацией exim. Правда сначала почему-то меня выкинуло из установщика, пришлось скрипт запускать еще раз:

/bin/bash vst-install-debian.sh

Второй момент — в конце установки VestaCP дала табличку с настройкой доступа http://:8083/ admin password, нужно сохранить эти данные.


После инсталляции панели сразу пошел проверять Firewall и был удивлен, что одно из правил разрешает доступ извне к MySQL (ставится MariaDB).



Рекомендую сразу отключать доступы к таким сервисам, у меня брутфорс паролей пошел минут через 5 после инсталляции.

Проверяем версию PHP: 7.0.33 из коробки. Перехожу к решению задачи по понижению версии PHP до 5.4.16(решено было развернуть как на старом хостинге CentOS 7, epel, httpd + php:

wget https://download.docker.com/linux/debian/gpg
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee -a /etc/apt/sources.list.d/docker.list
apt-get install docker-ce
systemctl enable docker
docker login

(если еще не зарегистрированы, то нужно зарегистрироваться в Докер Хаб

Предварительно заливаем скрипт сайта в VestaCP и базу данных для сайта. Скрипт расположен по-умолчанию: /home/site1/wev/site1.ru/public_html

В docker создаем собственный релиз CentOS на базе default centos:7. Приведу свой DockerFile:

FROM centos:7
MAINTAINER Dmitry Luponos <info@adm55.ru>
VOLUME /home/site1
EXPOSE 8082
RUN yum update -y && yum install mc -y
RUN yum install epel-release -y
RUN yum install yum-utils -y
RUN yum-config-manager --disable remi-safe
RUN yum-config-manager --enable remi
RUN yum-config-manager --enable remi-php54
RUN yum install -y httpd
RUN yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json -y
RUN yum clean all

Итак, что я делаю:

FROM centos:7 — выбираю инсталляцию docker hub
VOLUME /home/site1 — пробрасываю директорию из ОС в гостевую машину
EXPOSE 8082 — открываю порт httpd — 8082
RUN — запускаю в машине команду без консоли
RUN yum clean all — очищаю кэш, чтобы машина занимала меньше места.

Приступаю к созданию собственного образа docker для CentOS 7:

docker pull centos:7
cd /<путь до Dockerfile>
docker build -t bessome/centos:7 . 
docker run -it --name centphp54 --expose 8082 --restart always -v /home/site1:/home/site1 bessome/centos7:php54 /bin/bash

и попадаем в консоль (ключ -it) созданного инстанса docker.

Чтобы в дальнейшем попадать в консоль инстанса я использую ID машины, который можно получить командой
docker ps -a
вида «e8b6d6ef6c1a».

docker exec -it e8b6d6ef6c1a /bin/bash


и я внутри.

В дальнейшем я отказался от EXPOSE — мне не надо открывать порт наружу, устраивает что nginx видит сайт внутри сети 172.17.0.0/24, на порту 8082 инстанса docker.

Ключ

--restart always

указывает машине рестартовать всегда при перезапуске службы Docker, если забыли то можно так:

docker update --restart always e8b6d6ef6c1a

Проверяем, зацепился ли проброс директории хоста:

ls /home/site1
[root@e8b6d6ef6c1a centos.docker]# cd /home/site1
[root@e8b6d6ef6c1a centos.docker]# ls
conf  mail  tmp  web
du -sh
418M    .

Приведу ключевые настройки httpd инстанса, пока мы в консоли:
httpd.conf:
Listen 8082
IncludeOptional conf.d/*.conf

и забираю из /home/site1/conf настройку сайта в /etc/httpd/conf.d/site1.conf:

<VirtualHost *:8082>

    ServerName site1.ru
    ServerAlias www.site1.ru
    ServerAdmin info@site1.ru
    AddDefaultCharset off
    DocumentRoot /home/site1/web/site1.ru/public_html
    ScriptAlias /cgi-bin/ /home/site1/web/site1.ru/cgi-bin/
    Alias /vstats/ /home/site1/web/site1.ru/stats/
    Alias /error/ /home/site1/web/site1.ru/document_errors/
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    DirectoryIndex index.html index.php
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    <Directory /home/site1/web/site1.ru/public_html>
        AllowOverride All
        Require all granted
        Options +Includes -Indexes +ExecCGI
        php_admin_value open_basedir /home/tehnolit/web/site1.ru/public_html:/home/site1/tmp
        php_admin_value upload_tmp_dir /home/site1/tmp
        php_admin_value session.save_path /home/site1/tmp
        php_admin_flag engine on
    </Directory>
    <Directory /home/site1/web/site1.ru/stats>
        AllowOverride All
    </Directory>

    IncludeOptional /home/site1/conf/web/apache2.site1.ru.conf*

</VirtualHost>


У каждого сайта VestaCP будет своя домашняя директория, site1.ru — тестовая, для примера.

Далее разберемся с автозапуском docker и машины в нем, кроме того systemctl выдает ошибку при попытке запустить службу httpd внутри инстанса, стартуем из rc.local VPS:

 cat rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

docker exec 5473051a7b3c /usr/sbin/httpd
/opt/mpr-start
iptables-restore < /usr/src/iptables.lst

exit 0

Предварительно создав службу для старта rc.local при загрузке.

Нужно сказать, что все манипуляции с настройками сайта производятся из VestaCP или VPS, с одной оговоркой: правка nginx.conf для доступа к httpd CentOS7:

server {
    listen      <IP-VPS>:80;
    server_name site1.ru www.site1.ru;
    error_log  /var/log/apache2/domains/site1.ru.error.log error;

    location / {
#Наш ВНУТРЕННИЙ адрес docker инстанса: 
        proxy_pass      http://172.17.0.2:8082;
        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
            root           /home/site1/web/site1.ru/public_html;
            access_log     /var/log/apache2/domains/site1.ru.log combined;
            access_log     /var/log/apache2/domains/site1.ru.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location /error/ {
        alias   /home/site1/web/site1.ru/document_errors/;
    }

    location @fallback {
#Наш ВНУТРЕННИЙ адрес docker инстанса: 
        proxy_pass      http://172.17.0.2:8082;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include /home/site1/conf/web/nginx.site1.ru.conf*;
}

Далее дело техники — зацепляемся к MySQL, настраивая соответствующий файл сайта, содержащий настройки подключения, с указанием внутреннего адреса 172.17.0.1 головной VPS, естественно база должна быть уже развернута и доступ к ней настроен.

В результате, при обращении к сайту site1.ru все должно работать штатно, если нет, то где-то закралась ошибка настроек, перепроверяем.

Все остальные сайты работают с PHP 7.0 корректно, поэтому не буду описывать настройку самой VestaCP.

Таким образом, я достиг задач, которые ставил перед собой. Оставлю за рамками этой статьи выяснение ip-адреса 172.17.0.ххх инстанса docker, пинги и прочие моменты, их в DockerFile нет, ставил через yum соответствующие пакеты.

P.S. Попутно решил развернуть RouterOS так же в Docker, бекап конфигурационного файла сервера L2TP с домашнего роутера у меня был, так что только процесс:

docker pull evilfreelancer/docker-routeros
docker run -d -p 22202:22 -p 8728:8728 -p 8729:8729 -p 5900:5900 --restart always -ti evilfreelancer/docker-routeros

iptables-save > iptables.lst

Внесем в iptables через iptables.lst доступ для winbox (добавим порт доступа по аналогии с проброшенными при создании 8728 и 5900):

-A INPUT -p tcp -m tcp --dport 8291 -j ACCEPT
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8291 -j ACCEPT
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8291 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8291 -j DNAT --to-destination 172.17.0.3:8291

и применим в VPS:

iptables-restore < iptables.lst

Пробросы портов до инстансов docker делает при инициализации машины, при docker update, либо можно вписать их самому через файрволл iptables — все дело во вкусе.

Далее развернул конфигурацию RouterOS, пробросил порты для доступа внутрь docker RouterOS, все работает.

Замеров производительности приводить не буду, на данный момент меня и клиентов все устраивает. Если потребуется, возьму следующий VPS с увеличением мощности и ОЗУ.

Спасибо за внимание, надеюсь кому-либо статья поможет быстро разобраться с docker, а я к ней смогу вернуться через некоторое время и воскресить в памяти весь процесс установки.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+3
Комментарии 20
Комментарии Комментарии 20

Публикации

Истории

Работа

DevOps инженер
39 вакансий
PHP программист
171 вакансия

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн