Nginx перед Apache: настройка обратного прокси с кэшированием на Ubuntu 15.10
Введение
Nginx (произносится «энджин-икс») — высокопроизводительный веб‑сервер с низким потреблением памяти, созданный в 2002 году. Он часто используется не только как HTTP‑сервер, но и как обратный прокси, балансировщик нагрузки и HTTP‑кэш. Apache — популярный сервер с большим набором модулей и поддержкой множества языков через модули и CGI/FPM.
В этом руководстве показано, как установить Apache + PHP, затем развернуть Nginx в качестве фронтенда на Ubuntu 15.10 и настроить кэширование ответов.
Что вам потребуется
- Сервер с Ubuntu 15.10 и доступом по SSH
- Права root (или sudo)
- DNS-запись для домена, например www.reverse.com
Важно: в примерах Apache будет слушать порт 8080, а Nginx — порт 80.
Шаг 1 — Установка Apache и PHP
Подключитесь по SSH и станьте root:
sudo suУстановите Apache:
apt-get install apache2Установите PHP (как модуль Apache) для примера:
apt-get install php5 php5-mysql libapache2-mod-php5Шаг 2 — Конфигурация Apache и PHP
По умолчанию Apache слушает порт 80. Для схемы с фронтендом Nginx перенастроим Apache на порт 8080.
Отредактируйте файл “/etc/apache2/ports.conf”:
vim /etc/apache2/ports.confНа строке 5 замените Listen 80 на:
Listen 8080Сохраните и выйдите.
Далее отредактируйте виртуальный хост в каталоге /etc/apache2/sites-available/. Пример файла 000-default.conf:
ServerName www.reverse.com
ServerAlias reverse.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Проверьте конфигурацию и перезапустите Apache:
apachectl configtest
systemctl restart apache2Создайте тестовый PHP‑файл для проверки:
cd /var/www/html/
echo "" > info.phpОткройте в браузере http://www.reverse.com:8080/info.php чтобы убедиться, что Apache и PHP работают.

Результат должен быть похож на скриншот.

Шаг 3 — Установка Nginx
Установите Nginx:
apt-get install nginxШаг 4 — Конфигурация Nginx как обратного прокси с кэшем
Отредактируйте главный конфигурационный файл Nginx:
cd /etc/nginx/
vim nginx.confВключите Gzip‑сжатие, раскомментировав и приведя в рабочее состояние соответствующие строки. Пример блока для gzip:
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;Ключевые параметры:
- gzip on — включает gzip‑сжатие;
- gzip_types — список MIME‑типов для сжатия;
- gzip_proxied any — разрешает сжатие для проксированных запросов.
Под ним добавьте настройки proxy_cache:
# Proxy Cache Settings
proxy_cache_path /var/cache levels=1:2 keys_zone=reverse_cache:60m inactive=90m max_size=1000m;Пояснения:
- /var/cache — директория, где хранится кэш;
- levels — иерархия поддиректорий для кэша;
- keys_zone — имя зоны кэша (в примере “reverse_cache”);
- inactive — время неактивности, после которого ключ удаляется;
- max_size — максимальный размер кэша.

Сохраните изменения.
Теперь создайте виртуальный хост Nginx в /etc/nginx/sites-available/reverse.conf:
cd /etc/nginx/sites-available
vim reverse.confВставьте конфигурацию виртуального хоста:
server {
listen 80;
# Site Directory same in the apache virtualhost configuration
root /var/www/html;
index index.php index.html index.htm;
# Domain
server_name www.reverse.com reverse.com;
location / {
try_files $uri $uri/ /index.php;
}
# Reverse Proxy and Proxy Cache Configuration
location ~ \\.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
# Cache configuration
proxy_cache reverse_cache;
proxy_cache_valid 3s;
proxy_no_cache $cookie_PHPSESSID;
proxy_cache_bypass $cookie_PHPSESSID;
proxy_cache_key "$scheme$host$request_uri";
add_header X-Cache $upstream_cache_status;
}
# Enable Cache the file 30 days
location ~* .(jpg|png|gif|jpeg|css|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
proxy_cache_valid 200 120m;
expires 30d;
proxy_cache reverse_cache;
access_log off;
}
# Disable Cache for the file type html, json
location ~* .(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
location ~ /\.ht {
deny all;
}
}Примечания по конфигурации кэша:
- proxy_cache_valid 3s — в примере кэш для PHP‑файлов недолгий (3 секунды) — подстройте под свои требования;
- proxy_no_cache и proxy_cache_bypass ссылаются на сессию PHPSESSID — это предотвращает кэширование страниц с активной сессией;
- для статических файлов задано долгоживущее кэширование и заголовок expires 30d.
Активируйте сайт и перезапустите Nginx:
ln -s /etc/nginx/sites-available/reverse.conf /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginxПроверьте работу через curl:
curl -I www.reverse.com
Заголовок Cache‑Control: no-cache указывает, что HTML‑страницы не кэшируются по текущим правилам. Для PHP‑страниц можно проверить заголовок X-Cache:
curl -I www.reverse.com/info.php
Если вы видите X-Cache: HIT — ответ пришёл из кэша Nginx.
Шаг 5 — Логирование реального IP в Apache
Чтобы Apache видел реальный IP клиента (а не 127.0.0.1), установите модуль rpaf (или аналогичный модуль для вашей версии Apache):
sudo apt-get install libapache2-mod-rpaf
cd /etc/apache2/mods-available/
vim rpaf.confДобавьте IP сервера в список доверенных прокси, например:
RPAFproxy_ips 127.0.0.1 192.168.1.108 ::1Сохраните и перезапустите Apache:
systemctl restart apache2Проверьте access.log:
tail -f /var/log/apache2/access.log
Apache теперь должен логировать реальные IP посетителей.
Когда такая схема не подходит
- Если у вас динамический контент, который строго зависит от сессий и нельзя кэшировать — кэш может вызывать неконсистентность.
- Если нужны тонкие правила для кеширования на уровне приложений (например, Vary по заголовкам) — стандартный proxy_cache может оказаться недостаточным без доработок.
- Если требуются SSL‑терминация с продвинутыми WAF/IDS — возможно, имеет смысл использовать специализированные решения.
Альтернативные подходы
- Varnish как отдельный HTTP‑кеш между Nginx и Apache — даёт больше гибкости кэширования для HTTP, но не поддерживает TLS из коробки.
- HAProxy для балансировки нагрузки с опцией терминации SSL; в связке с Varnish или Nginx даёт хорошие результаты.
- Nginx + php-fpm (без Apache) — простая и часто более производительная архитектура для PHP‑приложений.
Ментальные модели и правила принятия решений
- «Фронтенд цепочка»: TLS termination → статический контент → кэш → прокси к бэкенду.
- Правило 80/20 для кэша: кэшируйте 80% статического трафика и горячие динамические ответ(ы), оставляя 20% — динамике и логике приложения.
- Медленное продвижение: сначала кэшируйте только статические файлы, затем — коротким TTL динамику, изучая поведение приложения.
Чек‑лист по ролям
Системный администратор:
- Установить nginx и apache, создать резервные копии конфигураций.
- Настроить права и каталог /var/cache.
- Настроить мониторинг дискового пространства для кэша.
DevOps инженер:
- Настроить proxy_cache и ключи кэша.
- Организовать CI/CD для деплоя конфигураций.
- Настроить health‑checks и алертинг по доступности бэкенда.
Разработчик:
- Проверить поведение приложения при кэшировании (кэшируемые/некэшируемые страницы).
- Добавить заголовки Cache‑Control для тонкой настройки.
Инженер по безопасности:
- Разрешения на директорию кэша, ограничение доступа к /etc/nginx.
- Проверить обработку заголовков Host и X‑Forwarded‑For.
Мини‑методология развёртывания (шаги)
- Развернуть среду тестирования, зеркально копирующую прод.
- Настроить Nginx с минимальным набором правил (только статические файлы).
- Запустить нагрузочное тестирование и мониторинг (латентность, hit/miss кэша).
- Постепенно добавлять правила кэширования для динамических страниц с малым TTL.
- Перейти в прод в периоды низкой нагрузки, откаты возможны через systemctl restart и восстановление симлинков конфигурации.
Критерии приёмки
- Nginx отвечает на порт 80, Apache на 8080.
- При обращении к статическому файлу заголовок
X-Cache: HITпоявляется при повторном запросе. - Access.log Apache показывает реальные IP клиентов.
- Система выдерживает нагрузку без резкого роста задержек.
Краткое руководство по откату
Если после изменения конфигурации возникли ошибки:
- Выполните
nginx -tчтобы проверить синтаксис. - Восстановите предыдущую версию конфига из бэкапа.
systemctl restart nginxиsystemctl restart apache2.- Очистите кэш при необходимости:
rm -rf /var/cache/*(только после проверки и с бэкапом).
Итоги
Nginx как фронтенд‑обратный прокси перед Apache даёт быстрый отклик для статики, снижает нагрузку на PHP‑бэкенд и позволяет гибко управлять кэшированием. Эта схема особенно полезна при постепенной оптимизации существующих Apache‑сайтов без полной миграции на php‑fpm.
Важно применять постепенный подход: начинать с кэширования статики, тестировать поведение динамики и внимательно настраивать заголовки кеширования.
Заметки:
- Настройки в примерах (TTL, размеры кэша, пути) подбирайте под характер вашего трафика.
- Для SSL следует добавить секции серверов с listen 443 и сертификаты; при этом TLS можно терминировать на Nginx.
Похожие материалы
Шифрование USB‑накопителя с VeraCrypt
PowerShell: история команд — просмотр и сохранение
Nandroid — полная резервная копия Android
Ошибка 0x800f0806 в Windows 11 22H2
Извлечь ссылки с веб‑страницы PowerShell