Связка Nginx (фронтенд) + Apache (бэкенд) остаётся «золотым стандартом» для многих серверов, она сочетает скорость выдачи статики Nginx-ом, гибкостью Apache и возможностью использовать .htaccess. Однако при настройке этого тандема для WordPress сисадмины часто сталкиваются с неочевидными проблемами, которые приводят к циклическим редиректам, ошибкам 502 или нерабочим ЧПУ.
Ниже разобраны самые частые ошибки конфигурации и методы их решения.
Бесконечный редирект (ERR_TOO_MANY_REDIRECTS)
Это классическая проблема при работе Nginx как прокси перед Apache, особенно при настройке SSL.
Причина: Nginx принимает HTTPS-запрос, расшифровывает его и передаёт на Apache как обычный HTTP (обычно на порт 8080). WordPress, видя незащищённое соединение, снова перенаправляет пользователя на HTTPS. Этот цикл повторяется бесконечно.
Решение:
Необходимо передать Apache заголовок, сообщающий, что исходный запрос был защищённым.
Необходимо добавить в конфигурацию Nginx в location:
proxy_set_header X-Forwarded-Proto $scheme;
и далее в настройках виртуального хоста в Apache устанавливаем:
SetEnvIf X-Forwarded-Proto https HTTPS=on
RequestHeader set X-Forwarded-Proto "https"
В логах все посетители имеют одинаковые IP адреса (адреса самого сервера)
Это частая ошибка «Real IP»
Причина: Apache видит только один входящий IP (обычно это 127.0.0.1 адрес Nginx), так как запросы приходят от него. Это ломает работу плагинов безопасности (Wordfence, Limit Login Attempts и т.д.) и всю аналитику запросов.
Решение:
Нужно установить модуль mod_remoteip для Apache (обычно он уже есть в современных сборках) и настройть его.
В конфигурации Apache ( /etc/apache2/mods-enabled/remoteip.conf ) добавляем:
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
И в Nginx соответственно, проверяем что передаём реальный IP:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Проблемы с загрузкой больших файлов (Ошибка 413 Request Entity Too Large)
Причина: По умолчанию Nginx ограничивает размер загружаемого тела запроса (часто 1Мб). При попытке загрузить тему или плагин через админку WordPress получаем ошибку, даже если в PHP с лимитами все норм.
Решение:
Надо увеличить лимит в секции http, server или location файла nginx.conf :
client_max_body_size 64M;
Ну и проверить параметры upload_max_filesize и post_max_size в php.ini для Apache. Значение в них должно совпадать или превышать этот лимит.
Ошибка 502 Bad Gateway / 504 Gateway Time-out
Причина: Apache не успевает обработать «тяжелый» скрипт (например, импорт товаров или создание резервной копии) и Nginx разрывает соединение по таймауту раньше времени.
Решение:
Нужно увеличить время ожидания ответа от бэкенда в конфигурации Nginx:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
Это даст Apache больше времени на выполнение ресурсоёмких задач, прежде чем Nginx вернет ошибку
Некорректная обработка статики (jpeg/CSS/JS ответ 404)
Причина: в Nginx неправильно определен root (путь до корня сайта), из-за чего он отдает 404 на существующие файлы.
Решение:
При настройке статики ( location ~* .(jpg|jpeg|gif|png|css|js)$ ) в Nginx надо прописать путь root так, чтобы он совпадал с реальным расположением файлов сайта (DocumentRoot в Apache).
location ~* ^.+.(jpg|jpeg|gif|png|webp|svg|js|css|mp3|ogg|mpeg|avi|zip|gz|bz2|rar)$ {
root /var/www/html; # Путь до корня сайта
access_log off;
expires 365d;
}
Ну и указывайте параметр expires в 1 год. Вот полезная инфа об этом.