Гид по технологиям

Nginx перед Apache: настройка обратного прокси с кэшированием на Ubuntu 15.10

5 min read Веб-серверы Обновлено 22 Nov 2025
Nginx перед Apache: обратный прокси и кэш
Nginx перед Apache: обратный прокси и кэш

Введение

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 работают.

Вывод phpinfo для проверки

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

Apache работает на порту 8080

Шаг 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 — максимальный размер кэша.

Включение gzip и proxy cache

Сохраните изменения.

Теперь создайте виртуальный хост 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

Проверка через curl

Заголовок 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

Модуль rpaf в логах Apache

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.

Мини‑методология развёртывания (шаги)

  1. Развернуть среду тестирования, зеркально копирующую прод.
  2. Настроить Nginx с минимальным набором правил (только статические файлы).
  3. Запустить нагрузочное тестирование и мониторинг (латентность, hit/miss кэша).
  4. Постепенно добавлять правила кэширования для динамических страниц с малым TTL.
  5. Перейти в прод в периоды низкой нагрузки, откаты возможны через systemctl restart и восстановление симлинков конфигурации.

Критерии приёмки

  • Nginx отвечает на порт 80, Apache на 8080.
  • При обращении к статическому файлу заголовок X-Cache: HIT появляется при повторном запросе.
  • Access.log Apache показывает реальные IP клиентов.
  • Система выдерживает нагрузку без резкого роста задержек.

Краткое руководство по откату

Если после изменения конфигурации возникли ошибки:

  1. Выполните nginx -t чтобы проверить синтаксис.
  2. Восстановите предыдущую версию конфига из бэкапа.
  3. systemctl restart nginx и systemctl restart apache2.
  4. Очистите кэш при необходимости: rm -rf /var/cache/* (только после проверки и с бэкапом).

Итоги

Nginx как фронтенд‑обратный прокси перед Apache даёт быстрый отклик для статики, снижает нагрузку на PHP‑бэкенд и позволяет гибко управлять кэшированием. Эта схема особенно полезна при постепенной оптимизации существующих Apache‑сайтов без полной миграции на php‑fpm.

Важно применять постепенный подход: начинать с кэширования статики, тестировать поведение динамики и внимательно настраивать заголовки кеширования.

Заметки:

  • Настройки в примерах (TTL, размеры кэша, пути) подбирайте под характер вашего трафика.
  • Для SSL следует добавить секции серверов с listen 443 и сертификаты; при этом TLS можно терминировать на Nginx.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Шифрование USB‑накопителя с VeraCrypt
Безопасность

Шифрование USB‑накопителя с VeraCrypt

PowerShell: история команд — просмотр и сохранение
PowerShell

PowerShell: история команд — просмотр и сохранение

Nandroid — полная резервная копия Android
Android.

Nandroid — полная резервная копия Android

Ошибка 0x800f0806 в Windows 11 22H2
Windows 11

Ошибка 0x800f0806 в Windows 11 22H2

Извлечь ссылки с веб‑страницы PowerShell
Automation

Извлечь ссылки с веб‑страницы PowerShell

Подписи в Gmail для нескольких адресов
Email

Подписи в Gmail для нескольких адресов