Instalar VestaCP en VPS, usar docker para degradar PHP

¡Buen tiempo!

Dejaré aquí una solución para mi hosting en VPS por 5 euros, principalmente con el objetivo de preservar la implementación de la solución a mi problema.

Hace unos años alquilé un servidor dedicado para más de 20 sitios, un servicio de alojamiento de archivos, una base de datos en PostgreSQL para 1C, un servidor de correo IMAP. Utilicé ISPmanager con una licencia "perpetua" como panel de control, CentOS 7 (o incluso 6) se utilizó como sistema operativo, lo que realmente no respeto, me gusta más Debian / Ubuntu. En el futuro, los proyectos fueron a las redes sociales, los sitios dejaron de ser necesarios, los nombres de dominio fueron liberados.

En 2019, me di cuenta de que mi sitio y dos sitios de clientes realmente estaban girando, solo necesitaba IMAP con el almacenamiento de correos electrónicos en el alojamiento, los servicios de intercambio de archivos también fueron a los servicios en la nube.



Qué hacer si un sitio de alojamiento no funciona con PHP superior a 5.4

Decidí tratar de limpiar el proyecto e implementarlo en un VPS más barato con disco duro de 40 GB, 2 CPU, 4 RAM versus 8 núcleos i7, 750 SSD, 24 RAM.

La base postgresql se trasladó a una mini computadora i5 HP con 16 GB de RAM en un armario de su casa, sacó RouterOS en el nuevo VPS en la ventana acoplable, configuró L2TP y accedió a través de las bases de datos del túnel 1C desde otro VPS con Windows 8.1 a bordo. Sería posible implementar el sistema operativo Windows en una máquina en un armario para estos fines, pero todos los scripts de servicio PostgreSQL se agudizan en Linux, subjetivamente, funciona más rápido en Linux, hay clientes fuera de mis máquinas que alojan la base de datos.

Tan introductorio:

  1. El tamaño total en un hosting de 30 GB junto con SO, sitios y correo;
  2. Copia de seguridad de datos a la nube;
  3. Un sitio auto escrito, dos en WP;
  4. Bases de datos en MySQL;
  5. La capacidad de agregar sitios según sea necesario;
  6. Control mínimo en la consola ssh (necesita un panel de control del sitio);
  7. La capacidad de implementar un proyecto en un hosting (espacio libre y capacidad libre).

Después de estudiar ofertas para paneles de control gratuitos, decidí parar en VestaCP, aunque me sorprendió un poco que CP no sea compatible con las últimas versiones de las distribuciones populares de RedHat / Debian. Aquí hay una captura de pantalla en el momento de la escritura.



Según los requisitos mínimos del sistema, todo es excelente con mi VPS.

Entonces, hetzner.cloud, crea un proyecto, crea una máquina CX21 en él.

VestaCP pone el proxy nginx en apache2, se crea una configuración para cada sitio / usuario.

No describiré todos los intentos, solo el final es Debian 9.

Obtención de una clave SSH-2 RSA usando PuTTY
PuTTY puttygen SSH-2 RSA , Dropbox.

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

Actualización del sistema:

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

Ponemos VestaCP en Debian 9
.
Debian , exim - , «y» exim. - , :

/bin/bash vst-install-debian.sh

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


Después de instalar el panel, inmediatamente fui a revisar el Firewall y me sorprendió que una de las reglas permita el acceso externo a MySQL (MariaDB está instalado).



Recomiendo deshabilitar de inmediato el acceso a dichos servicios, mis contraseñas de fuerza bruta cayeron aproximadamente 5 minutos después de la instalación.

Verificamos la versión de PHP: 7.0.33 fuera de la caja. Me dirijo a resolver el problema de degradar PHP a 5.4.16 (se decidió implementarlo como en el viejo alojamiento 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

(Si aún no se ha registrado, debe registrarse en el Docker Hub.

Primero, complete el script del sitio en VestaCP y la base de datos del sitio. El script se encuentra por defecto: /home/site1/wev/site1.ru/public_html

En Docker , creamos nuestra propia versión de CentOS basada en centos predeterminados: 7. Traeré mi 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

Entonces, ¿qué estoy haciendo?

DESDE centos: 7: selecciono la instalación de docker hub
VOLUME / home / site1: reenvío el directorio del sistema operativo a la máquina invitada
EXPOSE 8082: abro el puerto httpd: 8082
RUN: ejecuto el comando en la máquina sin la consola
RUN yum clean all: borro caché para que la máquina ocupe menos espacio.

Estoy empezando a crear mi propia imagen acoplable para 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

y llegamos a la consola (-it switch) de la instancia de docker creada.

Para llegar a la consola de instancia en el futuro, utilizo la ID de máquina, que se puede obtener con el comando
docker ps -a
tipo de "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


y estoy adentro

En el futuro, rechacé EXPOSE: no necesito abrir el puerto afuera, es adecuado que nginx vea el sitio dentro de la red 172.17.0.0/24, en el puerto 8082 de la instancia de Docker.

Llave

--restart always

le dice a la máquina que se reinicie siempre cuando se reinicia el servicio Docker, si lo olvida, puede hacer esto:

docker update --restart always e8b6d6ef6c1a

Compruebe si el reenvío del directorio del host está enganchado:

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

Aquí están las configuraciones clave para la instancia httpd mientras estamos en la consola:
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>


Cada sitio VestaCP tendrá su propio directorio de inicio, site1.ru - test, por ejemplo.

A continuación, trataremos con la ejecución automática de Docker y la máquina en ella, además, systemctl da un error al intentar iniciar el servicio httpd dentro de la instancia, comenzamos desde 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

Cree previamente un servicio para iniciar el arranque rc.local .

Debo decir que todas las manipulaciones con la configuración del sitio se realizan desde VestaCP o VPS, con una advertencia: editar nginx.conf para acceder a 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*;
}

Además, es una cuestión técnica: nos conectamos a MySQL, configurando el archivo del sitio correspondiente que contiene la configuración de conexión, indicando la dirección interna 172.17.0.1 del VPS principal, por supuesto, la base ya debe estar implementada y el acceso está configurado.

Como resultado, al acceder al sitio site1.ru, todo debería funcionar correctamente, si no, en algún lugar el error de configuración se deslizó, verifique nuevamente.

Todos los demás sitios funcionan correctamente con PHP 7.0, por lo que no describiré la configuración de VestaCP.

Por lo tanto, logré las tareas que me propuse. Lo dejaré fuera del alcance de este artículo para averiguar la dirección IP de la instancia de docker 172.17.0.xxx, pings y otras cosas, no están en el DockerFile, instalé los paquetes correspondientes a través de yum.

PD: En el camino, decidí implementar RouterOS también en Docker, tenía una copia de seguridad del archivo de configuración del servidor L2TP desde mi enrutador doméstico, así que solo el proceso:

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

Agregaremos acceso a winbox a iptables a través de iptables.lst (agregaremos un puerto de acceso por analogía con los puertos reenviados al crear 8728 y 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

y aplicable en VPS:

iptables-restore < iptables.lst

Reenviar puertos a instancias que hace Docker al inicializar la máquina, durante la actualización de Docker, o puede ingresarlos usted mismo a través del firewall de iptables: todo se trata del gusto.

Luego, implementé la configuración de RouterOS, reenvié los puertos para acceder dentro de Docker RouterOS, todo funciona.

No daré mediciones de rendimiento, por el momento todo me conviene a mí y a los clientes. Si es necesario, tomaré el próximo VPS con un aumento de potencia y RAM.

Gracias por su atención, espero que alguien pueda ayudar al artículo a tratar rápidamente con Docker, y pueda volver a leerlo después de un tiempo y recordar todo el proceso de instalación.

All Articles