美好时光!我将在这里留下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下运行得更快,我的计算机之外还有一些客户端在托管数据库。因此介绍:- 主机上的总大小为30 GB,以及操作系统,站点和邮件;
- 将数据备份到云;
- 一个自写网站,两个自写网站;
- MySQL中的数据库;
- 根据需要添加站点的能力;
- ssh控制台中的最低控制(需要站点控制面板);
- 在主机上部署项目的能力(可用空间和可用容量)。
在研究了免费控制面板的报价之后,我决定停在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 hubVOLUME / home / site1-我将目录从OS转发到EXPOSE 8082 guest 虚拟机-我打开httpd端口-8082RUN-我在没有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]
[root@e8b6d6ef6c1a centos.docker]
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
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 / {
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 {
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,过一会儿我可以返回这篇文章并回顾整个安装过程。