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

Что мы сделаем
- Установим Apache Web Server
- Перенастроим порт Apache на 8080
- Установим Varnish
- Настроим Varnish как обратный прокси перед Apache
- Протестируем и проверим логи
Требования
- 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 установлен и запущен.
Важно: Ubuntu по умолчанию использует UFW как простой файрвол. Разрешите SSH, HTTP и HTTPS:
ufw allow ssh
ufw allow http
ufw allow httpsЗатем включите UFW:
ufw enableПри появлении запроса введите y и нажмите Enter.

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

Шаг 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 -plntu
Если вы используете современные системы, где 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 слушает 6081 (внешний) и 6082 (админ-интерфейс localhost). Проверьте:
netstat -plntu
Шаг 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";
}
Сохраните файл.
Перенастройка 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"
Далее измените 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
Теперь трафик на порт 80 обрабатывает Varnish, который обращается к Apache на 127.0.0.1:8080.
Шаг 5 — Тестирование и проверка логов
Проверьте заголовки ответа:
curl -I hakase-labs.coВ ответе вы увидите те же заголовки, что и у Apache, но дополнительно могут появляться заголовки, связанные с Varnish (например, X-Varnish, Via).

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

Для просмотра логов Varnish используйте varnishncsa:
varnishncsaВы увидите аналогичные записи, схожие с access-логом Apache.

Поздравляем — установка и базовая настройка завершены.
Критерии приёмки
- 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) — по возможности ограничить доступ
Мини-методология (пошагово для продакшна)
- Подготовьте тестовый сервер, воспроизведите конфигурацию
- Настройте Varnish и Apache на тесте, прогоните нагрузочные тесты
- Настройте мониторинг и логирование
- Выполните перекатывание (rolling deployment) на продакшен: по одному хосту
- Наблюдайте за ошибками 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
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента