使用docker降级PHP在VPS上安装VestaCP

美好时光!

我将在这里留下5欧元在VPS上托管的解决方案,主要目的是保留解决方案的实施。

几年前,我租用了一个专用服务器,用于20多个站点,一个文件托管服务,一个用于1C的PostgreSQL数据库,一个IMAP邮件服务器。我使用带有“永久”许可证的ISPmanager作为控制面板,使用CentOS 7(甚至6)作为操作系统,我不太尊重,我更喜欢Debian / Ubuntu。将来,项目进入社交网络,不再需要站点,释放域名。

在2019年,我意识到我的站点和两个客户端站点确实在旋转,我只需要IMAP即可在主机上存储电子邮件,文件共享服务也用于云服务。



如果一个托管站点无法使用5.4以上的PHP怎么办

我决定尝试清理项目并将其部署在具有40GB硬盘,2个CPU,4个RAM的廉价VPS上,而不是8核i7、750个SSD,24个RAM。

PostgreSQL基地转移到一台i5 HP微型计算机上,该微型计算机在家里的衣柜中具有16GB的RAM,在docker的新VPS中启动了RouterOS,配置了L2TP,并通过另一个装有Windows 8.1的VPS通过Tunnel 1C数据库进行访问。出于这些目的,可以在衣柜的计算机上部署Windows OS,但是所有PostgreSQL服务脚本在Linux下都得到了改进,从主观上讲,它在Linux下运行得更快,我的计算机之外还有一些客户端在托管数据库。

因此介绍:

  1. 主机上的总大小为30 GB,以及操作系统,站点和邮件;
  2. 将数据备份到云;
  3. 一个自写网站,两个自写网站;
  4. MySQL中的数据库;
  5. 根据需要添加站点的能力;
  6. ssh控制台中的最低控制(需要站点控制面板);
  7. 在主机上部署项目的能力(可用空间和可用容量)。

在研究了免费控制面板的报价之后,我决定停在VestaCP,尽管令我有些惊讶的是CP不支持流行的RedHat / Debian发行版的最新版本。这是撰写本文时的屏幕快照,



按照最低系统要求,我的VPS一切都很好。

因此,hetzner.cloud,创建一个项目,并在其中创建一台CX21计算机。

VestaCP将nginx代理添加到apache2,为每个站点/用户创建一个配置。

我不会描述所有尝试,只有最后一个是Debian 9。

使用PuTTY获取SSH-2 RSA密钥
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, .


安装面板后,我立即去检查了防火墙,并惊讶于其中一条规则允许外部访问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

(如果尚未注册,则需要在Docker Hub中注册

首先,在VestaCP和站点数据库中填写站点脚本。默认情况下位于该脚本:/home/site1/wev/site1.ru/public_html

docker中,我们基于Docker 创建我们自己的CentOS版本默认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

所以,我在做什么:

从centos:7-我选择安装docker hub
VOLUME / home / site1-我将目录从OS转发到
EXPOSE 8082 guest 虚拟-我打开httpd端口-8082
RUN-我在没有
RUN 控制台的机器上运行命令yum clean all- 我清除了缓存,以便机器占用更少的空间。

我开始为CentOS 7创建自己的docker映像:

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

然后进入创建的docker实例的控制台(-it开关)。

为了将来使用实例控制台,我使用机器ID,可以通过以下命令获得
docker ps -a
一种“ e8b6d6ef6c1a”。

docker exec -it e8b6d6ef6c1a /bin/bash


我在里面

将来,我拒绝EXPOSE-我不需要在外部打开端口,这适合nginx在docker实例的端口8082上看到网络172.17.0.0/24内部的站点。



--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-test。

接下来,我们将处理docker autorun及其中的机器,此外,当尝试从实例中启动httpd服务时,systemctl给出了错误,我们从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,设置包含连接设置的相应站点文件,指示头VPS的内部地址172.17.0.1,当然,数据库应该已经部署并对其进行了配置。

结果,当访问site1.ru站点时,所有内容均应正常工作,否则,我们将重新检查配置错误的发生位置。

所有其他站点均可在PHP 7.0上正常工作,因此我将不介绍VestaCP本身的配置。

因此,我完成了为自己设定的任务。我将其排除在本文范围之外,以查找docker实例172.17.0.xxx的ip地址,ping和其他内容,它们不在DockerFile中,我通过yum安装了相应的软件包。

PS一路走来,我决定也将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.lst在iptables中添加对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所创建的实例,或者您可以通过iptables防火墙自己输入它们-这全都与口味有关。

接下来,我部署了RouterOS配置,将端口转发给docker RouterOS内部访问,一切正常。

我不会提供绩效评估,目前一切适合我和客户。如有必要,我将增加功率和RAM,以使用下一个VPS。

感谢您的关注,我希望有人能帮助本文快速处理docker,过一会儿我可以返回这篇文章并回顾整个安装过程。

All Articles