تثبيت VestaCP على VPS ، باستخدام عامل الإرساء لتقليل PHP

وقت جيد!

سأترك هنا حلاً لاستضافتي على VPS مقابل 5 يورو ، وذلك بشكل أساسي بهدف الحفاظ على تنفيذ حل مشكلتي.

قبل بضع سنوات ، استأجرت خادمًا مخصصًا لأكثر من 20 موقعًا ، ومشاركة الملفات ، وقاعدة بيانات PostgreSQL لخادم بريد 1C ، وخادم بريد IMAP. لقد استخدمت ISPmanager بترخيص "دائم" حيث تم استخدام لوحة التحكم ، CentOS 7 (أو حتى 6) كنظام تشغيل ، والذي لا أحترمه حقًا ، أنا أحب Debian / Ubuntu أكثر. في المستقبل ، ذهبت المشاريع إلى الشبكات الاجتماعية ، ولم تعد المواقع ضرورية ، وتم تحرير أسماء النطاقات.

في عام 2019 ، أدركت أن موقعي وموقعين للعملاء كانا يدوران حقًا ، وكنت بحاجة فقط إلى IMAP مع تخزين رسائل البريد الإلكتروني على الاستضافة ، كما ذهبت خدمات مشاركة الملفات إلى الخدمات السحابية.



ماذا تفعل إذا كان أحد مواقع الاستضافة لا يعمل مع PHP أعلى من 5.4

قررت أن أحاول تنظيف المشروع ونشره على VPS أرخص مع HDD 40GB ، وحدتي CPU ، 4 RAM مقابل 8 نوى i7 ، 750 SSD ، 24 RAM.

انتقلت قاعدة postgresql إلى كمبيوتر صغير i5 HP مع 16 غيغابايت من ذاكرة الوصول العشوائي على خزانة ملابس في المنزل ، وأحضرت RouterOS في VPS الجديد في Docker ، وقمت بتكوين L2TP وحصلت على الوصول عبر النفق إلى قواعد بيانات 1C من 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 ، قم بإنشاء مشروع ، قم بإنشاء آلة CX21 فيه.

يضع VestaCP وكيل nginx على apache2 ، ويتم إنشاء تهيئة لكل موقع / مستخدم.

لن أصف كل المحاولات ، لكن آخرها هو دبيان 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 على دبيان 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 ، نقوم بإنشاء إصدار 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

لذا ، ما أفعله:

من السنتوس: 7 - أختار تثبيت لوحة الوصل
VOLUME / home / site1 - أقوم بإعادة توجيه الدليل من نظام التشغيل إلى جهاز الضيف
EXPOSE 8082 - أفتح منفذ httpd - 8082
RUN - أقوم بتشغيل الأمر في الجهاز بدون وحدة تحكم
RUN yum نظيفة - امسح ذاكرة التخزين المؤقت بحيث تشغل الجهاز مساحة أقل.

لقد بدأت في إنشاء صورة عامل إرساء خاص بي لـ 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 ps -a
نوع من "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


وأنا بالداخل.

في المستقبل ، تخليت عن EXPOSE - لست بحاجة إلى فتح المنفذ في الخارج ، فهو يناسب أن يرى nginx الموقع داخل الشبكة 172.17.0.0/24 ، على المنفذ 8082 لمثيل عامل الميناء.

مفتاح

--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 - اختبار ، على سبيل المثال.

بعد ذلك ، سنتعامل مع التشغيل التلقائي لجهاز الإرساء والأجهزة الموجودة فيه ، بالإضافة إلى ذلك ، يعطي 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 لمثيل docker 172.17.0.xxx والأصوات وأشياء أخرى ، فهي ليست في 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

سنضيف الوصول إلى winbox إلى iptables عبر iptables.lst (سنضيف منفذ الوصول عن طريق القياس مع المنافذ المعاد توجيهها عند إنشاء 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

إعادة توجيه المنافذ إلى مثيلات عامل الميناء عند تهيئة الجهاز ، أثناء تحديث عامل الميناء ، أو يمكنك إدخالها بنفسك من خلال جدار حماية iptables - الأمر كله يتعلق بالطعم.

بعد ذلك ، قمت بنشر تكوين RouterOS ، وأعادت توجيه المنافذ للوصول داخل Docker RouterOS ، كل شيء يعمل.

لن أعطي قياسات الأداء ، في الوقت الحالي كل شيء يناسبني والعملاء. إذا لزم الأمر ، سأخذ VPS التالي مع زيادة في الطاقة وذاكرة الوصول العشوائي.

شكرا لكم على اهتمامكم ، آمل أن يساعد شخص ما المقال على التعامل بسرعة مع عامل الميناء ، ويمكنني العودة إليه بعد فترة وأذكر عملية التثبيت بأكملها.

All Articles