Menginstal VestaCP pada VPS, menggunakan buruh pelabuhan untuk menurunkan PHP

Waktu yang baik!

Saya akan meninggalkan di sini solusi untuk hosting saya di VPS selama 5 euro, terutama dengan tujuan menjaga implementasi solusi untuk masalah saya.

Beberapa tahun yang lalu saya menyewa server khusus untuk 20+ situs, layanan hosting file, database PostgreSQL untuk 1C, server email IMAP. Saya menggunakan ISPmanager dengan lisensi "abadi" sebagai panel kontrol, CentOS 7 (atau bahkan 6) digunakan sebagai OS, yang saya tidak begitu menghargai, saya lebih suka Debian / Ubuntu. Di masa depan, proyek pergi ke jejaring sosial, situs tidak lagi diperlukan, nama domain dibebaskan.

Pada tahun 2019, saya menyadari bahwa situs saya dan dua situs klien benar-benar berputar, saya hanya perlu IMAP dengan menyimpan email di hosting, layanan berbagi file juga masuk ke layanan cloud.



Apa yang harus dilakukan jika satu situs hosting tidak bekerja dengan PHP di atas 5.4

Saya memutuskan untuk mencoba membersihkan proyek dan menggunakannya pada VPS yang lebih murah dengan hdd 40GB, 2 CPU, 4 RAM versus 8 core i7, 750 SSD, 24 RAM.

Basis postgresql pindah ke komputer mini HP i5 dengan 16GB RAM pada lemari pakaian di rumah, membawa RouterOS di VPS baru di docker, mengkonfigurasi L2TP dan diakses melalui terowongan 1C database dari VPS lain dengan VPS lain dengan Windows 8.1 di papan. Mungkin saja untuk menggunakan OS Windows pada mesin di lemari pakaian untuk keperluan ini, tetapi semua skrip layanan PostgreSQL diasah di Linux, secara subyektif, ini bekerja lebih cepat di Linux, ada klien di luar mesin saya yang menjadi tuan rumah database.

Jadi pengantar:

  1. Ukuran total pada hosting 30 GB bersama dengan OS, situs, dan surat;
  2. Cadangkan data ke cloud;
  3. Satu situs yang ditulis sendiri, dua di WP;
  4. Database dalam MySQL;
  5. Kemampuan untuk menambahkan situs sesuai kebutuhan;
  6. Kontrol minimum di konsol ssh (perlu panel kontrol situs);
  7. Kemampuan untuk menyebarkan proyek di hosting (ruang kosong dan kapasitas gratis).

Setelah mempelajari penawaran untuk panel kontrol gratis, saya memutuskan untuk berhenti di VestaCP, walaupun saya agak terkejut bahwa CP tidak mendukung versi terbaru dari distribusi RedHat / Debian yang populer. Berikut ini adalah screenshot pada saat penulisan.



Dengan persyaratan sistem minimum, semuanya bagus dengan VPS saya.

Jadi, hetzner.cloud, buat proyek, buat mesin CX21 di dalamnya.

VestaCP menempatkan proxy nginx ke apache2, sebuah konfigurasi dibuat untuk setiap situs / pengguna.

Saya tidak akan menjelaskan semua upaya, hanya yang terakhir adalah Debian 9.

Mendapatkan Kunci RSH SSH-2 Menggunakan Putty
PuTTY puttygen SSH-2 RSA , Dropbox.

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

Memperbarui sistem:

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

Kami menempatkan VestaCP di Debian 9
.
Debian , exim - , «y» exim. - , :

/bin/bash vst-install-debian.sh

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


Setelah menginstal panel, saya segera pergi untuk memeriksa Firewall dan terkejut bahwa salah satu aturan memungkinkan akses eksternal ke MySQL (MariaDB diinstal).



Saya sarankan segera menonaktifkan akses ke layanan tersebut, kata sandi bruteforce saya berjalan sekitar 5 menit setelah instalasi.

Kami memeriksa versi PHP: 7.0.33 di luar kotak. Saya beralih ke memecahkan masalah penurunan versi PHP ke 5.4.16 (diputuskan untuk menerapkannya seperti pada hosting CentOS 7 lama, 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

(Jika Anda belum mendaftar, Anda harus mendaftar di Docker Hub.

Pertama, isi skrip situs di VestaCP dan database untuk situs tersebut. Skrip ini terletak secara default: /home/site1/wev/site1.ru/public_html

Di docker, kami membuat rilis CentOS kami sendiri berdasarkan pada default centos: 7. Saya akan membawa DockerFile saya:

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

Jadi apa yang saya lakukan:

DARI centos: 7 - Saya memilih instalasi hub docker
VOLUME / home / site1 - Saya meneruskan direktori dari OS ke mesin tamu
EXPOSE 8082 - Saya membuka port httpd - 8082
RUN - Saya menjalankan perintah di mesin tanpa konsol
RUN yum bersih semua - saya jelas cache sehingga mesin membutuhkan lebih sedikit ruang.

Saya mulai membuat gambar buruh pelabuhan saya sendiri untuk 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

dan kita sampai ke console (-it switch) dari instance buruh pelabuhan yang dibuat.

Untuk sampai ke konsol instance di masa depan, saya menggunakan ID mesin, yang dapat diperoleh dengan perintah
docker ps -a
jenis "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


dan aku di dalam.

Di masa depan, saya meninggalkan EXPOSE - Saya tidak perlu membuka port di luar, itu cocok bahwa nginx melihat situs di dalam jaringan 172.17.0.0/24, pada port 8082 dari instance docker.

Kunci

--restart always

memberi tahu mesin untuk memulai kembali selalu ketika layanan Docker dihidupkan ulang, jika Anda lupa maka Anda dapat melakukan ini:

docker update --restart always e8b6d6ef6c1a

Periksa apakah penerusan direktori host terhubung:

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

Berikut adalah pengaturan utama untuk contoh httpd saat kami berada di konsol:
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>


Setiap situs VestaCP akan memiliki direktori home sendiri, site1.ru - test, misalnya.

Selanjutnya, kita akan berurusan dengan buruh pelabuhan autorun dan mesin-mesin di dalamnya, di samping itu, systemctl memberikan kesalahan ketika mencoba memulai layanan httpd di dalam instance, kita mulai dari 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

Pra- buat layanan untuk memulai boot rc.local .

Saya harus mengatakan bahwa semua manipulasi dengan pengaturan situs dibuat dari VestaCP atau VPS, dengan satu peringatan: mengedit nginx.conf untuk mengakses 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*;
}

Lebih lanjut, ini adalah masalah teknis - kami terhubung ke MySQL, menyiapkan file situs terkait yang berisi pengaturan koneksi, yang menunjukkan alamat internal 172.17.0.1 dari VPS kepala, tentu saja, database harus sudah digunakan dan akses ke sana dikonfigurasi.

Akibatnya, ketika mengakses situs site1.ru, semuanya harus bekerja secara normal, jika tidak, maka di suatu tempat kesalahan konfigurasi merayap masuk, kami periksa kembali.

Semua situs lain berfungsi dengan benar dengan PHP 7.0, jadi saya tidak akan menjelaskan konfigurasi VestaCP itu sendiri.

Jadi, saya mencapai tugas yang saya tetapkan untuk diri saya sendiri. Saya akan meninggalkannya di luar ruang lingkup artikel ini untuk mencari tahu alamat ip dari pekerja pelabuhan 172.17.0.xxx, ping dan hal-hal lain, mereka tidak ada di DockerFile, saya menginstal paket yang sesuai melalui yum.

PS Sepanjang jalan, saya memutuskan untuk menggunakan RouterOS juga di Docker, saya punya cadangan file konfigurasi server L2TP dari router rumah saya, jadi hanya proses:

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

Kami akan menambahkan akses ke winbox ke iptables melalui iptables.lst (kami akan menambahkan port akses yang mirip dengan yang diteruskan saat membuat 8728 dan 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

dan berlaku di VPS:

iptables-restore < iptables.lst

Meneruskan port ke instance yang dibuat buruh pelabuhan saat menginisialisasi mesin, selama pembaruan buruh pelabuhan, atau Anda dapat memasukkannya sendiri melalui firewall iptables - ini semua tentang rasanya.

Selanjutnya, saya menggunakan konfigurasi RouterOS, meneruskan port untuk akses di dalam docker RouterOS, semuanya berfungsi.

Saya tidak akan memberikan pengukuran kinerja, saat ini semuanya cocok untuk saya dan klien. Jika perlu, saya akan mengambil VPS berikutnya dengan peningkatan daya dan RAM.

Terima kasih atas perhatian Anda, saya harap seseorang dapat membantu artikel dengan cepat menangani buruh pelabuhan, dan saya dapat kembali ke sana setelah beberapa saat dan mengingat seluruh proses instalasi.

All Articles