Блог
Docker для WordPress: Чому ізольовані контейнери змінюють усе
Один клієнт не може зламати іншого. Один сайт не може заразити іншого. Це архітектура хостинг-платформи PAGEnza.
Традиційний хостинг WordPress розміщує кілька сайтів на одному сервері. Вони спільно використовують PHP, доступ до файлової системи, а часто й сервер баз даних. Це нормально, доки не виникає проблема — а коли вона виникає, це серйозна проблема.
PAGEnza надає кожен сайт WordPress у власному Docker-контейнері. Ця стаття пояснює, що це означає на практиці та чому це важливо для агентств, які керують кількома клієнтськими сайтами.
Проблема спільного хостингу
На типовому спільному хостингу або навіть на базовому VPS з кількома інсталяціями WordPress:
Конкуренція за ресурси: один сайт, що отримує сплеск трафіку, сповільнює роботу всіх інших сайтів на сервері. Погано оптимізований плагін на сайті А погіршує продуктивність сайту Б.
Перетікання безпеки: якщо одна інсталяція WordPress буде скомпрометована — через вразливий плагін, слабкий пароль або застарілу версію ядра — зловмисник, який отримає доступ до файлової системи, часто зможе читати файли інших сайтів на тому ж сервері.
Конфлікти версій PHP: сайту А потрібна PHP 7.4 для старого плагіна. Сайту Б потрібна PHP 8.2 для новішого. На спільному хостингу ви обираєте одну.
Доступ до бази даних: спільні сервери баз даних означають, що одне неправильно налаштоване дозвіл користувача може призвести до витоку даних інших сайтів.
Docker-контейнери вирішують усі ці проблеми на рівні інфраструктури.
Що таке контейнер насправді
Docker-контейнер — це легкий, ізольований процес, який має власну:
- Файлову систему (контейнер не бачить файлів поза своїми межами)
- Мережевий стек (власну IP-адресу, власні порти)
- Просторовий простір (не бачить процесів інших контейнерів)
- Обмеження ресурсів (ліміти ЦП та пам'яті)
Він спільно використовує ядро хоста з іншими контейнерами, але все вище ядра ізольовано. Це не повноцінна віртуальна машина — вона запускається за секунди, а не хвилини, і використовує частку ресурсів.
Для WordPress один контейнер запускає: Nginx, PHP-FPM та файли WordPress. База даних працює в окремому контейнері, підключеному лише до цього конкретного контейнера WordPress.
Як PAGEnza надає сайт
Коли ви створюєте новий клієнтський сайт у PAGEnza, ось що відбувається менш ніж за 45 секунд:
- Створюється новий Docker-контейнер з базового образу WordPress
- WordPress налаштовується зі свіжою базою даних на спільному екземплярі MariaDB (ізольованою за обліковими даними цього контейнера)
- Плагін PAGEnza автоматично встановлюється та активується
- Віртуальний хост Nginx налаштовується з піддоменом клієнта
- SSL видається через Let's Encrypt
- Контейнер реєструється у зворотному проксі з правилами маршрутизації
Клієнт отримує URL на кшталт clientname.pagenza.com, який стає доступним протягом 45 секунд після натискання «Створити сайт». Жодного ручного налаштування сервера, жодного SSH, жодного очікування DNS (для піддомену — поширення DNS для власного домену окремо).
Ізоляція контейнерів на практиці
Обмеження пам'яті: кожен контейнер має конфігурований ліміт пам'яті. Якщо неконтрольований плагін спричиняє сплеск використання пам'яті на сайті одного клієнта, він не може спожити пам'ять, виділену іншим контейнерам. Сайт може сповільнитися або повернути 503 — але це не вплине на інших клієнтів.
Ізоляція файлової системи: файли WordPress клієнта А повністю невидимі для контейнера клієнта Б. Скомпрометований плагін на сайті клієнта А не має шляху до файлів клієнта Б.
Мережева ізоляція: контейнери спілкуються лише через визначені мережеві мости. Контейнер бази даних для клієнта А приймає з'єднання лише від WordPress-контейнера клієнта А — а не від будь-якого іншого контейнера в системі.
PHP на контейнер: оскільки кожен контейнер запускає власний екземпляр PHP-FPM, ви можете запускати різні версії PHP для різних клієнтів. Застарілий плагін клієнта А, який потребує PHP 7.4, працює разом із сучасним стеком клієнта Б на PHP 8.2.
Власні домени
Стандартна конфігурація надає кожному клієнту піддомен *.pagenza.com. Для клієнтів, які бажають використовувати власний домен, процес такий:
- Клієнт вказує запис А свого домену на IP-адресу сервера PAGEnza
- У панелі керування PAGEnza ви вводите власний домен
- Конфігурація зворотного проксі оновлюється автоматично
- SSL видається для власного домену через Let's Encrypt
Параметри WordPress siteurl та home оновлюються відповідно. З точки зору клієнта, його сайт просто працює на його домені — без перенаправлення, без піддомену, видимого відвідувачам.
Що це означає для агентств
Практична перевага для агентств, які керують кількома клієнтськими сайтами:
Швидкість онбордингу: надання нового клієнтського сайту займає менше хвилини. Жодного налаштування сервера, жодного cPanel, жодного ручного встановлення WordPress.
Розділення клієнтів: кожен сайт клієнта справді ізольований. Клієнт, який встановлює проблемний плагін, впливає лише на власний сайт.
Масштабованість: додавання нового клієнта не вимагає надання нового сервера. Контейнерна інфраструктура масштабується до потужності хоста, а додавання потужності — це питання додавання нових вузлів хоста.
Відновлення після збоїв: оскільки кожен сайт контейнеризований, резервне копіювання та відновлення працює на рівні контейнера. Відновлення сайту одного клієнта не впливає на жодного іншого клієнта.
Компроміс полягає в тому, що контейнерний хостинг коштує дорожче за сайт, ніж спільний хостинг. Але для агентств, де надійність сайту та розділення клієнтів є невід'ємними, економіка вигідна — особливо коли враховуються заощадження часу на надання послуг.