Installation von VestaCP auf VPS mit Docker zum Downgrade von PHP

Gute Zeit!

Ich werde hier eine Lösung für mein Hosting auf VPS für 5 Euro hinterlassen, hauptsächlich mit dem Ziel, die Implementierung der Lösung für mein Problem beizubehalten.

Vor einigen Jahren habe ich einen dedizierten Server für mehr als 20 Websites, einen Datei-Hosting-Service, eine Datenbank auf PostgreSQL für 1C, einen IMAP-Mailserver, gemietet. Ich habe ISPmanager mit einer "unbefristeten" Lizenz als Control Panel verwendet, CentOS 7 (oder sogar 6) wurde als Betriebssystem verwendet, was ich nicht wirklich respektiere, ich mag Debian / Ubuntu mehr. In Zukunft gingen Projekte an soziale Netzwerke, Websites waren nicht mehr notwendig, Domain-Namen wurden freigegeben.

Im Jahr 2019 stellte ich fest, dass sich meine Site und zwei Client-Sites wirklich drehten. Ich brauchte nur IMAP, um E-Mails auf dem Hosting zu speichern. Filesharing-Dienste gingen auch an Cloud-Dienste.



Was tun, wenn eine Hosting-Site mit PHP über 5.4 nicht funktioniert?

Ich habe mich entschlossen, das Projekt zu bereinigen und auf einem günstigeren VPS mit 40 GB Festplatte, 2 CPUs, 4 RAM im Vergleich zu 8 Kernen i7, 750 SSD und 24 RAM bereitzustellen.

Die Postgresql-Basis wurde auf einen i5 HP Mini-Computer mit 16 GB RAM in einem Kleiderschrank zu Hause verschoben, RouterOS im neuen VPS im Docker aufgerufen, L2TP konfiguriert und über die Tunnel-1C-Datenbanken von einem anderen VPS mit Windows 8.1 an Bord zugegriffen. Zu diesen Zwecken wäre es möglich, das Windows-Betriebssystem auf einem Computer in einem Kleiderschrank bereitzustellen, aber alle PostgreSQL-Dienstskripte werden unter Linux geschärft. Subjektiv funktioniert es unter Linux schneller. Es gibt Clients außerhalb meiner Computer, auf denen die Datenbank gehostet wird.

Also einleitend:

  1. Die Gesamtgröße auf einem Hosting von 30 GB zusammen mit Betriebssystem, Websites und E-Mail;
  2. Daten in die Cloud sichern;
  3. Eine selbst geschriebene Seite, zwei auf WP;
  4. Datenbanken in MySQL;
  5. Die Möglichkeit, Websites nach Bedarf hinzuzufügen;
  6. Minimale Kontrolle in der SSH-Konsole (benötigt ein Site Control Panel);
  7. Die Möglichkeit, ein Projekt auf einem Hosting bereitzustellen (freier Speicherplatz und freie Kapazität).

Nachdem ich Angebote für kostenlose Control Panels studiert hatte, entschied ich mich, bei VestaCP anzuhalten, obwohl ich etwas überrascht war, dass CP die neuesten Versionen der beliebten RedHat / Debian-Distributionen nicht unterstützt. Hier ist ein Screenshot zum Zeitpunkt des Schreibens.



Bei den Mindestsystemanforderungen ist mit meinem VPS alles in Ordnung.

Also, hetzner.cloud, erstellen Sie ein Projekt, erstellen Sie eine CX21-Maschine darin.

VestaCP stellt Apache2 einen Nginx-Proxy zur Verfügung. Für jede Site / jeden Benutzer wird eine Konfiguration erstellt.

Ich werde nicht alle Versuche beschreiben, nur der letzte ist Debian 9.

Erhalten eines SSH-2-RSA-Schlüssels mit PuTTY
PuTTY puttygen SSH-2 RSA , Dropbox.

Acess hetzner.cloud RSA, PuTTY SSH-> ( PuTTY RUS) Dropbox. .

System aktualisieren:

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

Wir haben VestaCP auf Debian 9 gesetzt
.
Debian , exim - , «y» exim. - , :

/bin/bash vst-install-debian.sh

— VestaCP http://:8083/ admin password, .


Nach der Installation des Panels habe ich sofort die Firewall überprüft und war überrascht, dass eine der Regeln den externen Zugriff auf MySQL ermöglicht (MariaDB ist installiert).



Ich empfehle, den Zugriff auf solche Dienste sofort zu deaktivieren. Meine Bruteforce-Kennwörter gingen ungefähr 5 Minuten nach der Installation verloren.

Wir überprüfen die Version von PHP: 7.0.33 aus der Box. Ich werde das Problem des Downgrades von PHP auf 5.4.16 lösen (es wurde beschlossen, es auf dem alten CentOS 7-Hosting, epel, httpd + php bereitzustellen:

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

(Wenn Sie sich noch nicht registriert haben, müssen Sie sich im Docker Hub registrieren .

Geben Sie zunächst das Site-Skript in VestaCP und die Datenbank für die Site ein. Das Skript befindet sich standardmäßig: /home/site1/wev/site1.ru/public_html

Im Docker erstellen wir unsere eigene CentOS-Version basierend auf Standard-Centos: 7. Ich werde meine DockerFile mitbringen:

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

Also, was mache ich:

FROM centos: 7 - Ich wähle die Installation des Docker-Hubs
VOLUME / home / site1 - Ich leite das Verzeichnis vom Betriebssystem an den
EXPOSE 8082-Gastcomputer weiter - Ich öffne den httpd-Port - 8082
RUN - Ich führe den Befehl auf dem Computer aus, ohne dass die
RUN- Konsole yum clean all - Ich lösche Cache, damit der Computer weniger Platz beansprucht.

Ich fange an, mein eigenes Docker-Image für CentOS 7 zu erstellen:

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

und wir gelangen zur Konsole (-it switch) der erstellten Docker-Instanz.

Um in Zukunft zur Instanzkonsole zu gelangen, verwende ich die Maschinen-ID, die mit dem Befehl abgerufen werden kann
docker ps -a
Art von "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


und ich bin drinnen.

In Zukunft habe ich EXPOSE abgelehnt - ich muss den Port nicht außerhalb öffnen, es passt, dass nginx die Site innerhalb des Netzwerks 172.17.0.0/24 auf Port 8082 der Docker-Instanz sieht.

Schlüssel

--restart always

Weist den Computer an, immer neu zu starten, wenn der Docker-Dienst neu gestartet wird. Wenn Sie dies vergessen, können Sie Folgendes tun:

docker update --restart always e8b6d6ef6c1a

Überprüfen Sie, ob die Weiterleitung des Hostverzeichnisses verknüpft ist:

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

Hier sind die wichtigsten Einstellungen für die httpd-Instanz, während wir uns in der Konsole befinden:
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>


Jede Site VestaCP verfügt über ein eigenes Home-Verzeichnis, beispielsweise site1.ru - test.

Als nächstes werden wir uns mit Docker-Autorun und den darin enthaltenen Maschinen befassen. Außerdem gibt systemctl einen Fehler aus, wenn versucht wird, den httpd-Dienst innerhalb der Instanz zu starten. Wir starten von 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

Prä- erstellen einen Dienst das rc.local Boot zu starten .

Ich muss sagen, dass alle Manipulationen mit den Site-Einstellungen von VestaCP oder VPS vorgenommen werden, mit einer Einschränkung: Bearbeiten von nginx.conf, um auf httpd CentOS7 zuzugreifen:

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*;
}

Außerdem ist es eine technische Angelegenheit - wir schließen uns MySQL an, richten die entsprechende Site-Datei mit den Verbindungseinstellungen ein und geben die interne Adresse 172.17.0.1 des Head-VPS an. Natürlich sollte die Datenbank bereits bereitgestellt und der Zugriff darauf konfiguriert sein.

Wenn Sie auf die Site site1.ru zugreifen, sollte daher alles ordnungsgemäß funktionieren. Wenn dies nicht der Fall ist, hat sich der Konfigurationsfehler irgendwo eingeschlichen und erneut überprüft.

Alle anderen Sites funktionieren korrekt mit PHP 7.0, daher werde ich die Konfiguration von VestaCP selbst nicht beschreiben.

So habe ich die Aufgaben erfüllt, die ich mir gestellt habe. Ich werde es außerhalb des Geltungsbereichs dieses Artikels belassen, um die IP-Adresse der Docker-Instanz 172.17.0.xxx, Pings und andere Dinge herauszufinden. Sie befinden sich nicht in der Docker-Datei. Ich habe die entsprechenden Pakete über yum installiert.

PS Auf dem Weg entschied ich mich, RouterOS auch in Docker bereitzustellen. Ich hatte eine Sicherungskopie der L2TP-Serverkonfigurationsdatei von meinem Heimrouter, also nur den Prozess:

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

Wir werden iptables über iptables.lst den Zugriff auf winbox hinzufügen (wir werden einen Zugriffsport hinzufügen, der den beim Erstellen von 8728 und 5900 weitergeleiteten ähnlich ist):

-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

und anwendbar in VPS:

iptables-restore < iptables.lst

Leiten Sie Ports an Instanzen weiter, die Docker beim Initialisieren des Computers, während des Docker-Updates erstellt, oder Sie können sie selbst über die iptables-Firewall eingeben - es geht nur um den Geschmack.

Als Nächstes habe ich die RouterOS-Konfiguration bereitgestellt und die Ports für den Zugriff auf Docker RouterOS weitergeleitet. Alles funktioniert.

Ich werde keine Leistungsmessungen durchführen, im Moment passt alles zu mir und den Kunden. Bei Bedarf nehme ich den nächsten VPS mit einer Erhöhung der Leistung und des Arbeitsspeichers.

Vielen Dank für Ihre Aufmerksamkeit. Ich hoffe, jemand kann dem Artikel helfen, sich schnell mit Docker zu befassen, und ich kann nach einer Weile darauf zurückkommen und mich an den gesamten Installationsprozess erinnern.

All Articles