← Назад към Блог

Блог

Docker за WordPress: Защо изолираните контейнери променят всичко

Един клиент не може да срине друг. Един сайт не може да зарази друг. Това е архитектурата зад хостинг платформата на PAGEnza.

Традиционният WordPress хостинг поставя множество сайтове на един сървър. Те споделят PHP, споделят достъп до файловата система и често споделят сървър за бази данни. Това е добре, докато не стане проблем – а когато стане, е сериозен проблем.

PAGEnza осигурява всеки WordPress сайт в собствен Docker контейнер. Тази публикация обяснява какво означава това на практика и защо е важно за агенциите, управляващи множество клиентски сайтове.

Проблемът със споделения хостинг

При типичен план за споделен хостинг или дори основен VPS с множество WordPress инсталации:

Конкуренция за ресурси: един сайт, който получава пик в трафика, забавя всеки друг сайт на сървъра. Лошо оптимизиран плъгин на сайт А влошава производителността на сайт Б.

Разпространение на сигурността: ако една WordPress инсталация бъде компрометирана – чрез уязвим плъгин, слаба парола или остаряла основна версия – нападател, който получи достъп до файловата система, често може да чете файлове от други сайтове на същия сървър.

Конфликти на PHP версии: сайт А се нуждае от PHP 7.4 за стар плъгин. Сайт Б се нуждае от PHP 8.2 за по-нов. При споделен хостинг избирате един.

Излагане на базата данни: споделените сървъри за бази данни означават, че едно неправилно конфигурирано потребителско разрешение може да изложи данни на други сайтове.

Docker контейнерите решават всички тези проблеми на ниво инфраструктура.

Какво всъщност е контейнер

Docker контейнерът е лек, изолиран процес, който има своя собствена:

  • Файлова система (контейнерът не може да вижда файлове извън границите си)
  • Мрежов стек (собствен IP адрес, собствени портове)
  • Пространство за процеси (не може да вижда процесите на други контейнери)
  • Ограничения на ресурсите (лимити за CPU и памет)

Той споделя хост ядрото с други контейнери, но всичко над ядрото е изолирано. Това не е пълна виртуална машина – стартира за секунди, не за минути, и използва част от ресурсите.

За WordPress, един контейнер изпълнява: Nginx, PHP-FPM и WordPress файлове. Базата данни работи в отделен контейнер, свързан само към конкретния WordPress контейнер.

Как PAGEnza осигурява сайт

Когато създавате нов клиентски сайт в PAGEnza, ето какво се случва за по-малко от 45 секунди:

  1. Стартира се нов Docker контейнер от базов WordPress образ
  2. WordPress се конфигурира със свежа база данни в споделената MariaDB инсталация (изолирана до идентификационните данни на този контейнер)
  3. PAGEnza плъгинът се инсталира и активира автоматично
  4. Конфигурира се Nginx виртуален хост с поддомейна на клиента
  5. Издава се SSL чрез Let's Encrypt
  6. Контейнерът се регистрира в обратния прокси с правилните правила за маршрутизиране

Клиентът получава URL като clientname.pagenza.com, който е активен в рамките на 45 секунди след натискане на "Създай сайт". Без ръчна конфигурация на сървъра, без SSH, без изчакване на DNS (за поддомейна – разпространението на DNS за персонализиран домейн е отделно).

Изолация на контейнера на практика

Ограничения на паметта: всеки контейнер има конфигурируем лимит на паметта. Ако избягал плъгин причини пик в паметта на сайта на един клиент, той не може да консумира памет, заделена за други контейнери. Сайтът може да се забави или да върне 503 – но това няма да засегне други клиенти.

Изолация на файловата система: WordPress файловете на клиент А са напълно невидими за контейнера на клиент Б. Компрометиран плъгин на сайта на клиент А няма път към файловете на клиент Б.

Мрежова изолация: контейнерите комуникират само чрез дефинирани мрежови мостове. Контейнерът за база данни на клиент А приема връзки само от WordPress контейнера на клиент А – не от никой друг контейнер в системата.

PHP на контейнер: тъй като всеки контейнер изпълнява собствена PHP-FPM инсталация, можете да изпълнявате различни PHP версии за различни клиенти. Наследственият плъгин на клиент А, който се нуждае от PHP 7.4, работи добре заедно с модерния стек на клиент Б на PHP 8.2.

Персонализирани домейни

Стандартната настройка дава на всеки клиент поддомейн *.pagenza.com. За клиенти, които искат собствен домейн, процесът е:

  1. Клиентът насочва A записа на домейна си към IP адреса на сървъра на PAGEnza
  2. В таблото за управление на PAGEnza въвеждате персонализирания домейн
  3. Конфигурацията на обратния прокси се актуализира автоматично
  4. Издава се SSL за персонализирания домейн чрез Let's Encrypt

WordPress опциите siteurl и home се актуализират, за да съответстват. От гледна точка на клиента, техният сайт просто работи на техния домейн – без пренасочване, без поддомейн, видим за посетителите.

Какво означава това за агенциите

Практическата полза за агенциите, управляващи множество клиентски сайтове:

Скорост на въвеждане: осигуряването на нов клиентски сайт отнема под минута. Без настройка на сървър, без cPanel, без ръчна WordPress инсталация.

Разделение на клиентите: сайтът на всеки клиент е наистина изолиран. Клиент, който инсталира проблемен плъгин, засяга само собствения си сайт.

Мащабируемост: добавянето на нов клиент не изисква осигуряване на нов сървър. Контейнерната инфраструктура се мащабира до капацитета на хоста, а добавянето на повече капацитет е въпрос на добавяне на повече хост възли.

Възстановяване при бедствия: тъй като всеки сайт е контейнеризиран, архивирането и възстановяването работи на ниво контейнер. Възстановяването на сайта на един клиент не засяга никой друг клиент.

Компромисът е, че контейнерният хостинг струва повече на сайт от споделения хостинг. Но за агенции, където надеждността на сайта и разделението на клиентите са задължителни, икономиката се получава – особено когато се вземат предвид спестените времена за осигуряване.