~ / blog / series / server-dlya-wordpress

Сервер для WordPress

Цикл о том, как устроен сервер под WordPress в Docker и почему он падает: пул PHP-FPM, образ PHP, Redis, сеть, почта, сертификаты, диск, крон и сборка. На опыте наших серверов, с замерами и разбором аварий.

#Серверы 3 мин

Сайт на WordPress в Docker: пять контейнеров и 310 МБ памяти

Из чего состоит этот сайт: nginx, PHP-FPM, MariaDB, Redis и общий traefik. Сокеты вместо сети, база на 23 МБ вместо настроек «для выделенного сервера», пул по требованию на 6 процессов с предохранителем, Redis во внутренней сети.

· · ·
#Серверы 3 мин

PHP-FPM без request_terminate_timeout: 5 часов 40 минут 502 от одного запроса

Внешний сервис принял соединение и замолчал — все 100 процессов PHP повисли навсегда, файловые сессии добили остальных. Предохранитель в пуле — одна строка, по умолчанию её нет. Куда вписать в Docker и как распознать такую аварию за пять минут.

· · ·
#Серверы 3 мин

«pool seems busy»: PHP-FPM разгоняет себя сам при двух запросах

За 15 секунд всплеска — два запроса через nginx, а процессов стало 46 вместо 14. FPM удваивает запуск каждую секунду, а подъём min_spare делает только хуже. Тёплый запас через start_servers и max_spare: 0 предупреждений вместо 22.

· · ·
#Серверы 2 мин

Телеметрия PHP-FPM: slowlog, статус пула и проверка не того конфига

Журнал медленных запросов со стеком, страница статуса с адресом на .php, время ответа и статус кэша в журнале nginx. И грабля: php-fpm -tt без -y читает конфиг из пакета, а не тот, с которым работает мастер.

· · ·
#Серверы 3 мин

Два Redis с противоположными настройками: объектный кэш и кэш фрагментов

Объектному кэшу WordPress — вытеснение и без записи на диск: любой ключ восстановим запросом к базе. Кэшу фрагментов — noeviction и журнал на диске: потерянная ячейка стоит посетителю секунд. Подвох с transients и как поднять потолок без потери кэша.

· · ·
#Серверы 3 мин

Сеть Docker: имя базы перехватывает домен, а сайт не видит сам себя

Сетевой псевдоним базы с именем домена в общей сети уводит запросы соседей к сайту в MariaDB. Запрос из контейнера к своему же домену не проходит — ходить в nginx по имени контейнера с Host и X-Forwarded-Proto. Как проверить свою сеть.

· · ·
#Серверы 3 мин

Почта с сайта: не поднимать свой сервер, а отправлять через ящик на домене

Свой почтовый сервер на домашнем или облачном адресе — дорога в спам. Как сделано здесь: msmtp из переменных окружения, SMTP провайдера домена, отправитель только свой ящик, Reply-To на клиента и пароль со спецсимволами в кавычках.

· · ·
#Серверы 3 мин

SSL: сертификат истёк, а сайт «работал» четыре дня

Покупные сертификаты продлеваются только руками, корень и www отдают разные сертификаты, неполная цепочка в браузере не видна. Еженедельный обход по сети, три проверки при установке и замена без перезапуска traefik.

· · ·
#Серверы 3 мин

Открыть один сайт для индексации на сервере, где закрыто всё

noindex висит на всей точке входа traefik, и роутер сайта не может его отменить. Решение — внутренняя точка без запрета, проброс по SNI без расшифровки, PROXY protocol для настоящих адресов и обязательная метка у роутера сайта.

· · ·
#Серверы 3 мин

Половина медиапапки — миниатюры, которые сайт не показывает

WordPress режет каждую картинку на все зарегистрированные размеры: на одном каталоге это 6,39 ГБ из 12, три размера темы на 2,54 ГБ не читались нигде. Как посчитать у себя, почему сначала перестать плодить, что проверить до удаления — и +13 ГБ на другом сайте.

· · ·
#Серверы 3 мин

Крон и консоль на виртуальном хостинге: «Минуты: 1» — это раз в час

Цифра в поле планировщика — момент, а не интервал; адрес в поле команды — не команда; php в консоли 5.6; защита от ботов перехватывает POST; mysqldump ругается, но делает дамп; сервер живёт по Москве. Три захода на одну задачу крона.

· · ·
#Серверы 3 мин

Сборка фронта на сервере: Node 20, зависший линтер и CI, который видит больше

Node 22 удалил синтаксис assert для JSON — сборка падает, помогает только Node 20 в контейнере. Прерванный eslint продолжает молотить в своём контейнере. А CI ловит ошибки, которых сборка на тесте не видит из-за lintDirtyModulesOnly.

· · ·

$ tail -f /blog

Не пропустите новые статьи

Пишу разборы по скорости сайтов, кэшу и разработке — на живых проектах и с цифрами. Подпишитесь, и ссылка на новую статью придёт сразу после выхода. Без рекламы и спама, отписаться — в один клик.

В Telegramодна кнопка «Старт» в боте

или на почту

связаться

Расскажите о задаче