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

Varnish как обратный прокси для Apache

• 6 min read • DevOps • Обновлено 20 Nov 2025
Varnish как обратный прокси для Apache
Varnish как обратный прокси для Apache

Обложка: серверный стэк с Varnish и Apache

Что мы сделаем

  1. Установим Apache Web Server
  2. Перенастроим порт Apache на 8080
  3. Установим Varnish
  4. Настроим Varnish как обратный прокси перед Apache
  5. Протестируем и проверим логи

Требования

  • Ubuntu 18.04 LTS (сервер)
  • Права root или sudo
  • Доступ в интернет для apt

Шаг 1 — Установка Apache Web server

Обновите списки пакетов и установите Apache из репозитория Ubuntu:

apt update
apt install -y apache2

После установки запустите сервис и включите автозапуск:

systemctl start apache2
systemctl enable apache2

Установка Apache — подтверждение процесса установки

Apache установлен и запущен.

Важно: Ubuntu по умолчанию использует UFW как простой файрвол. Разрешите SSH, HTTP и HTTPS:

ufw allow ssh
ufw allow http
ufw allow https

Затем включите UFW:

ufw enable

При появлении запроса введите y и нажмите Enter.

UFW — подтверждение открытия портов SSH/HTTP/HTTPS

Проверка работы Apache:

  • через netstat (показывает список прослушиваемых портов):
netstat -plntu
  • или быстро через curl (замените пример домена на ваш):
curl -I hakase-labs.co

Ожидаемый заголовок ответа будет похож на пример ниже.

Ответ сервера Apache — пример заголовков HTTP

Шаг 2 — Изменение порта по умолчанию для Apache

Мы будем использовать Apache как бэкенд и переместим его с порта 80 на 8080. Это освободит порт 80 для Varnish.

Перейдите в конфигурационный каталог Apache:

cd /etc/apache2

Замените все вхождения порта 80 на 8080 в файлах ports.conf и в виртуальных хостах sites-available. Быстро сделать это можно с помощью sed:

sed -i -e 's/80/8080/g' ports.conf
sed -i -e 's/80/8080/g' sites-available/*

Протестируйте конфигурацию Apache и перезапустите сервис:

apachectl configtest
systemctl restart apache2

Apache теперь слушает порт 8080 — вывод netstat

Проверьте, что Apache слушает на 8080:

netstat -plntu

Подтверждение: Apache на порту 8080

Если вы используете современные системы, где netstat может отсутствовать, используйте ss:

ss -plntu

Важно: изменение порта в конфигурации virtualhost может иметь побочные эффекты на перезапись правил или на используемые SSL-конфигурации. Проверьте все включенные vhost-файлы.

Шаг 3 — Установка Varnish HTTP Accelerator

Установим Varnish (в этом руководстве — Varnish 5.2 из репо Ubuntu 18.04):

apt install -y varnish

Запустите и включите автозапуск:

systemctl start varnish
systemctl enable varnish

Установка Varnish — подтверждение установки

По умолчанию Varnish слушает 6081 (внешний) и 6082 (админ-интерфейс localhost). Проверьте:

netstat -plntu

Порты Varnish по умолчанию: 6081 и 6082

Шаг 4 — Настройка Varnish как обратного прокси для Apache

Цель: Varnish принимает все клиентские HTTP-запросы на порт 80 и при необходимости пробрасывает их на Apache на 127.0.0.1:8080.

Настройка бэкенда в VCL

Перейдите в каталог /etc/varnish и сделайте резервную копию default.vcl:

cd /etc/varnish/
cp default.vcl default.vcl.aseli

Откройте default.vcl в редакторе (vim или ваш любимый). Найдите секцию backend и укажите хост и порт Apache:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Редактирование default.vcl — конфигурация backend

Сохраните файл.

Перенастройка Varnish на порт 80

По умолчанию Varnish слушает :6081. Изменим параметры запуска в /etc/default/varnish.

cd /etc/default/
vim varnish

Найдите строку DAEMON_OPTS и замените порт 6081 на 80:

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Изменение DAEMON_OPTS на порт 80

Далее измените systemd-юнит для varnish, чтобы параметры совпадали. Откройте /lib/systemd/system/varnish.service:

cd /lib/systemd/system/
vim varnish.service

Отредактируйте строку ExecStart, чтобы она соответствовала запуску на :80:

ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

Сохраните и перезагрузите systemd-юниты, затем рестартуйте varnish:

systemctl daemon-reload
systemctl restart varnish

Проверьте, что varnish слушает порт 80:

netstat -plntu

Varnish слушает порт 80

Теперь трафик на порт 80 обрабатывает Varnish, который обращается к Apache на 127.0.0.1:8080.

Шаг 5 — Тестирование и проверка логов

Проверьте заголовки ответа:

curl -I hakase-labs.co

В ответе вы увидите те же заголовки, что и у Apache, но дополнительно могут появляться заголовки, связанные с Varnish (например, X-Varnish, Via).

Пример заголовков после включения Varnish

Откройте сайт в браузере по адресу http://hakase-labs.co/ (замените на ваш домен). Содержимое должно оставаться тем же, что и раньше (Apache отдаёт контент через Varnish).

Проверка содержимого сайта через браузер

Для просмотра логов Varnish используйте varnishncsa:

varnishncsa

Вы увидите аналогичные записи, схожие с access-логом Apache.

Вывод varnishncsa — логи запросов

Поздравляем — установка и базовая настройка завершены.

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

  • Apache слушает на 127.0.0.1:8080
  • Varnish слушает на 0.0.0.0:80
  • Запросы на порт 80 обрабатываются Varnish, а бэкенд отвечает содержимым Apache
  • varnishncsa показывает записи о приходящих запросах
  • Веб-страницы отображаются корректно в браузере

Полезные проверки и отладка

  • Проверка портов: netstat / ss
  • Проверка конфигурации Apache: apachectl configtest
  • Проверка статуса systemd: systemctl status varnish, systemctl status apache2
  • Просмотр логов Varnish в реальном времени: varnishlog или varnishncsa
  • Файлы конфигурации: /etc/varnish/default.vcl, /etc/default/varnish, /lib/systemd/system/varnish.service

Важно: если изменения systemd-юнита не применяются, выполните systemctl daemon-reload.

Когда такое решение не подойдёт (примеры)

  • Если вам требуется нативная TLS-терминация в Varnish — Varnish не поддерживает TLS напрямую. Решения: использовать Hitch или Nginx/HAProxy перед Varnish.
  • Если приложение использует WebSocket — Varnish не поддерживает WebSocket-прокси.
  • Если backend полагается на заголовок TLS (например, X-Forwarded-Proto) — нужно явно настроить передачу заголовков.
  • Если контент строго персонализирован и содержит Set-Cookie на большинстве ответов — кэширование будет неэффективно, возможны утечки персонализированных ответов в кэше.

Альтернативные подходы

  • Nginx как обратный прокси + кэширование: проще для TLS и для статичных сайтов.
  • HAProxy + Varnish: HAProxy может управлять балансировкой и TLS, Varnish — кэшировать.
  • Использовать Varnish за HTTPS-терминатором (Hitch или Nginx) — TLS снимается перед Varnish.

Роли и чек-листы

Sysadmin:

  • Убедиться, что UFW разрешает 80/443
  • Изменить конфиги Apache и перезапустить сервис
  • Настроить и проверить Varnish, перезапустить systemd

Разработчик фронтенда:

  • Проверить, что заголовки, важные для кэширования (Cache-Control, Vary), выставлены корректно
  • Убедиться, что Set-Cookie не мешает общему кэшированию

Инженер по безопасности:

  • Убедиться в наличии TLS-терминации перед Varnish, если требуется HTTPS
  • Проверить доступ к админ-интерфейсу Varnish (6082) — по возможности ограничить доступ

Мини-методология (пошагово для продакшна)

  1. Подготовьте тестовый сервер, воспроизведите конфигурацию
  2. Настройте Varnish и Apache на тесте, прогоните нагрузочные тесты
  3. Настройте мониторинг и логирование
  4. Выполните перекатывание (rolling deployment) на продакшен: по одному хосту
  5. Наблюдайте за ошибками 5xx и показателями латентности

Краткий риск-матрикс и смягчения

  • Риск: кэширование персональных данных -> Смягчение: настройка правильных Cache-Control и Vary заголовков, исключение путей с Set-Cookie
  • Риск: неправильная TLS-конфигурация -> Смягчение: TLS-терминация перед Varnish, проверка HSTS
  • Риск: падение Varnish -> Смягчение: настройка health checks и запасных backend-путей

Примеры типичных проблем и решения

  • Проблема: сайт отдаёт старый контент. Решение: проверить заголовки Cache-Control и очистить кэш varnish (varnishadm ban/ban.url).
  • Проблема: не виден X-Forwarded-For. Решение: в VCL добавить передачу заголовка X-Forwarded-For и в Apache доверять этому заголовку.
  • Проблема: Varnish не стартует на порту 80. Решение: проверьте, что Apache не занимает порт 80; проверьте права запуска systemd и наличие cap_net_bind_service.

Команды для очистки и управления кэшем

  • Очистка по URL (ban):
varnishadm ban "req.url == /path/to/resource"
  • Просмотр логов в реальном времени:
varnishlog
varnishncsa

Краткий глоссарий

  • Varnish: HTTP-ускоритель и кэширующий прокси
  • VCL: Varnish Configuration Language — конфигурационные правила для Varnish
  • Backend: сервер приложений, от которого Varnish получает контент (здесь — Apache)
  • TTL: время жизни кэша

Финальное резюме

Varnish эффективно ускоряет отдачу HTTP-контента и уменьшает нагрузку на бэкенд. Вариант с Varnish перед Apache на Ubuntu 18.04 подходит для сайтов с большим количеством повторяющихся запросов к статичному или частично-динамичному контенту. Обязательно продумайте TLS-терминацию, обработку заголовков и исключения для персонализированного контента.

Короткое объявление для команды (100–200 слов)

Установлен и настроен Varnish 5.2 как фронтенд для Apache на Ubuntu 18.04. Apache перенесён на порт 8080, Varnish слушает порт 80 и кэширует ответы. Это снижает нагрузку на Apache для повторных запросов и ускоряет отдачу статического контента. Обратите внимание на обработку заголовков Cache-Control и Set-Cookie: при необходимости исключайте из кэша динамические пути. Для HTTPS добавьте TLS-терминатор перед Varnish (например, Nginx или Hitch). Перед релизом на продакшен рекомендовано прогнать нагрузочные тесты и настроить мониторинг.

Ссылки и литература

  • Varnish Cache
  • Apache HTTPD
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро