Разбор гибридной архитектуры Nginx+Apache, используемой на виртуальном хостинге. Правила работы с .htaccess, настройка HTTP-заголовков через proxy_set_header, решение проблем с правами доступа 403/500 и оптимизация связки PHP-FPM.
Такая связка позволяет быстро отдавать статические файлы (картинки, CSS, JS) напрямую через Nginx, не нагружая интерпретатор, в то время как сложные правила перенаправлений и авторизации ложатся на плечи Apache.
Понимание того, где заканчивается зона ответственности одного сервера и начинается работа другого — ключ к стабильному сайту.
1. Разделение зон влияния (.htaccess vs конфиги Nginx)
- Виртуальный хостинг: вы можете управлять логикой только через файл
.htaccessв корне вашего сайта (public_html). Здесь работают директивыmod_rewrite, установка собственных обработчиков ошибок, защита паролем и управление кешированием браузера. Важно: любые попытки прописать здесь инструкции Nginx (location / { ... }) приведут к ошибке 500 Internal Server Error. - VPS/Облако: если у вас чистый Nginx-стек (без Apache), файл
.htaccessполностью игнорируется. Все настройки переносятся в конфигурационные файлы/etc/nginx/sites-available/your_site. После любого изменения синтаксиса необходимо проверять его командойnginx -tи перезагружать сервис.
2. Режим обратного прокси (Reverse Proxy) На тарифах виртуального хостинга Nginx принимает запрос от пользователя и передает его дальше на Apache или PHP-FPM.
- Типичная проблема: ваш сайт (на Laravel/Django) должен знать реальный IP-адрес посетителя для защиты от спама или аналитики, но видит вместо него локальный адрес
127.0.0.1. - Решение: использование заголовка
X-Real-IP. На VPS это настраивается вручную параметромproxy_set_header X-Real-IP $remote_addr;. На обычном хостинге эта переменная доступна в коде приложения автоматически из глобальной переменной$_SERVER['HTTP_X_REAL_IP'].
3. Статика, Gzip и Brotli Сжатие данных происходит на уровне Nginx еще до того, как файл попадает в скрипт.
- Если вы включаете сжатие одновременно в настройках CMS (например, JCH Optimize в Joomla) и используете встроенный серверный gzip, может возникнуть ошибка двойного сжатия («garbage at the end of file»).
- Правильный подход: отключить компрессию в админке сайта, доверив ее Nginx, который эффективнее работает с потоками данных.
4. Работа с SSL/TLS терминированием Когда пользователь заходит на https://site.ru, шифрование обрывается на нашем Nginx. Внутренний сервер получает уже расшифрованный трафик по протоколу HTTP.
- Если ваше приложение принудительно делает редирект с HTTP на HTTPS (потому что видит незашифрованный входящий запрос), возникает циклическая переадресация (ERR_TOO_MANY_REDIRECTS).
- Решение: проверка протокола должна осуществляться по заголовку
X-Forwarded-Proto, который Beget добавляет автоматически.
5. Ограничения безопасности (Symlinks и CGI) Для изоляции сайтов друг от друга на виртуальном хостинге накладываются жесткие ограничения:
- FollowSymLinks: разрешено, но SymLinksIfOwnerMatch может работать некорректно из-за прав пользователей. Создание символических ссылок вне папки
public_htmlзапрещено. - Action handlers: подключение нестандартных интерпретаторов через
.htaccess(CGI-обертки) заблокировано в целях безопасности общего сервера. Используйте Passenger WSGI для Python/Node.js.