Varnish как обратный прокси для Apache на Ubuntu 16.04
Что мы сделаем
- Установим Apache
- Изменим порт Apache по умолчанию на 8080
- Установим Varnish
- Настроим Varnish как обратный прокси на порту 80
- Проверим конфигурацию и отладим возможные проблемы
Требования
- Сервер с Ubuntu 16.04
- Права root или sudo
- Доступ по SSH к серверу
Важно: инструкции ориентированы на Ubuntu 16.04. На более новых релизах пакетная структура и системные юниты могут отличаться.
Краткая методология
Подход простой: оставить реальный веб‑сервер (Apache) слушающим нестандартный порт 8080, а на публичный порт 80 поставить Varnish. Клиенты обращаются к Varnish, Varnish кэширует публичный контент и при необходимости проксирует запросы к Apache.
Шаг 1 — Установка Apache
Обновите индекс пакетов и установите Apache из репозитория Ubuntu:
sudo apt update
sudo apt install -y apache2После установки запустите и включите сервис при старте системы:
systemctl start apache2
systemctl enable apache2
Apache установлен и работает по умолчанию на порту 80.
Откройте порты SSH, HTTP и HTTPS в UFW (если используется):
ufw allow ssh
ufw allow http
ufw allow httpsВключите файрвол и подтвердите действие:
ufw enable
Проверить, что Apache слушает порт 80:
netstat -plntuИли выполнить быстрый HTTP‑запрос:
curl -I hakase-labs.coВы должны получить заголовки ответа от Apache.

Шаг 2 — Изменение порта Apache по умолчанию
Мы хотим, чтобы Apache слушал на порту 8080. Это освободит порт 80 для Varnish.
Перейдите в каталог конфигурации Apache:
cd /etc/apache2Замените все вхождения порта 80 на 8080 в основных конфигурациях:
sed -i -e 's/80/8080/g' ports.conf
sed -i -e 's/80/8080/g' sites-available/*Проверьте конфигурацию и перезапустите сервис:
apachectl configtest
systemctl restart apache2Проверка просмотра сетевых портов:
netstat -plntuВы должны увидеть Apache (обычно процесс apache2 или httpd) слушающим порт 8080.
Важно: sed прост и агрессивен — он заменит все «80» в файлах. Если в виртуальных хостах используются нестандартные значения или другие порты (например 443), убедитесь, что команда не изменила лишнее. При сомнениях редактируйте файлы вручную.
Шаг 3 — Установка Varnish
Установим Varnish из репозитория Ubuntu (в руководстве использован Varnish 4):
sudo apt install -y varnishЗапустите и включите сервис Varnish:
systemctl start varnish
systemctl enable varnish
По умолчанию Varnish слушает публичный порт 6081 и административный порт 6082. Проверьте:
netstat -plntu
Шаг 4 — Настройка Varnish как обратного прокси для Apache
Цель: сделать так, чтобы Varnish принимал подключения на 80 и проксировал к Apache на 127.0.0.1:8080.
Настройка backend в default.vcl
Перейдите в каталог конфигурации Varnish и сделайте резервную копию:
cd /etc/varnish/
cp default.vcl default.vcl.backupОткройте default.vcl в удобном редакторе и укажите backend:
backend default {
.host = "127.0.0.1";
.port = "8080";
}Сохраните файл.

Перевести Varnish на порт 80
Измените параметры демона в файле /etc/default/varnish (или соответствующем для вашей версии):
cd /etc/default/
vim varnishРедактируйте строку DAEMON_OPTS, чтобы публичный адрес был :80:
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"Сохраните.
Далее изменим системный юнит, чтобы опции ExecStart соответствовали новому порту. Откройте файл юнита:
cd /lib/systemd/system/
vim varnish.serviceИзмените ExecStart на:
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Проверьте прослушиваемые порты:
netstat -plntu
Теперь Varnish должен слушать порт 80, а Apache — 8080.
Шаг 5 — Тестирование и проверка
Проверьте HTTP‑заголовки через curl:
curl -I hakase-labs.coВы должны получить заголовки от Varnish/Apache. Часто в ответе видны кастомные заголовки Varnish (например, X-Varnish) или стандартные заголовки от Apache.

Проверьте страницу в браузере по адресу http://hakase-labs.co/ (замените на ваш URL). Вы должны видеть содержимое, сгенерированное Apache, но доставленное через Varnish.

Посмотрите доступы Varnish в режиме логов:
varnishncsaКоманда выведет логи запросов, похожие на access.log от Apache.
Критерии приёмки
- Apache слушает только на 127.0.0.1:8080 или 0.0.0.0:8080 (не на 80)
- Varnish слушает на порту 80 и успешно проксирует запросы к backend
- Страница корректно загружается в браузере по порту 80
- Логи varnishncsa отображают входящие запросы
Справочная таблица: ключевые порты и параметры
- Apache backend: 127.0.0.1:8080
- Varnish публичный порт: 80
- Varnish административный порт: 6082
- Память Varnish для кеша (пример в конфигурации): 256 MB
Частые ошибки и отладка
- Varnish не стартует после смены порта
- Проверьте, не занят ли порт 80 другим процессом (например, Apache). Команда:
sudo lsof -i :80- Если Apache по-прежнему слушает 80 — убедитесь, что изменения в /etc/apache2 были сохранены и Apache перезапущен.
- Пустая страница или 502 от Varnish
- Проверьте backend в default.vcl: корректность .host и .port.
- Проверьте, отвечает ли Apache на 127.0.0.1:8080 через curl:
curl -I http://127.0.0.1:8080Изменения в default.vcl не применяются
- Перезагрузите Varnish: systemctl restart varnish
- Проверьте синтаксис VCL через varnishd -C -f /etc/varnish/default.vcl
Права на секретный файл
- Файл /etc/varnish/secret должен быть читаем для запускаемого пользователя; если нет, Varnish может падать.
Ошибки systemd при старте
- Проверьте журнал: journalctl -u varnish -b
Альтернативные подходы
- Использовать Nginx как обратный прокси и кэшер. Nginx имеет встроенный кэш и проще в настройке на некоторых системах.
- Оставить Apache на 80 и запустить Varnish на другом публичном IP/порту за балансировщиком.
- Использовать контейнеры (Docker) для изоляции Varnish и Apache, связывая их сетями контейнеров.
Когда этот подход не подходит
- Динамически генерируемый контент с индивидуальными заголовками и сессиями (часто не пригоден для агрессивного кэширования без доработок)
- Необходимость работы с HTTPS на Varnish: Varnish не поддерживает TLS «из коробки» — нужен дополнительный TLS-терминатор (например, Nginx, Hitch, or HAProxy)
Рекомендации по безопасности и HTTPS
- Varnish не шифрует трафик. Для HTTPS используйте TLS-терминатор перед Varnish. Схема обычно выглядит так: client → TLS-терминатор (Nginx/Hitch) → Varnish → Apache.
- Отключите ненужные модули в Apache и минимизируйте права доступа к конфигурациям.
- Следите за размером кэша и используйте ограничение памяти под кеш (-s malloc,256m). Неправильная настройка может вызвать OOM.
Примечание: для HTTPS часто используют комбинацию: Nginx (TLS) → Varnish (HTTP) → Apache (HTTP).
Руководство эксплуатации — чеклист для ролей
Администратор (DevOps):
- Проверить, что systemctl status для apache2 и varnish в порядке
- Проверить, что netstat показывает 80 для varnish и 8080 для apache
- Проверить логи: journalctl -u varnish, /var/log/apache2/error.log
- Контролировать доступность административного порта Varnish 6082
Разработчик:
- Убедиться, что заголовки Cache-Control и Vary выставлены корректно в приложении
- Тестировать поведение при приватных и авторизованных страницах
- Использовать заголовок Cache-Control: no-cache/ no-store при необходимости
Операции (Support):
- Воспроизвести проблему локально: curl -I с параметром -H “Host:…”
- Снять профиль кеша: varnishlog или varnishncsa
Playbook — быстрые команды для восстановления
- Проверить процессы и порты
systemctl status varnish apache2
netstat -plntu | egrep ":80|:8080|:6082"- Перезапустить Varnish и Apache
systemctl restart varnish
systemctl restart apache2- Проверить VCL на ошибки
varnishd -C -f /etc/varnish/default.vcl- Просмотр логов в реальном времени
varnishlog
varnishncsa
journalctl -fu varnishМентальные модели и эвристики
- Varnish — «передняя линия»: он должен быстро отвечать на повторные запросы. Думайте об Apache как о генераторе исходного контента.
- Простое правило: если ресурс публичный и одинаков для всех пользователей — кешируйте. Если ресурс зависит от сессии, пользователя или заголовков — не кешируйте или используйте тонкую настройку VCL.
Decision flowchart
flowchart TD
A[Запрос от клиента] --> B{Есть ли в кеше актуальный объект?}
B -- Да --> C[Отправить из кеша]
B -- Нет --> D[Проксировать запрос к Apache]
D --> E{Ответ от Apache: кешируемый?}
E -- Да --> F[Сохранить в кеше и вернуть клиенту]
E -- Нет --> G[Вернуть клиенту без кеширования]Короткая терминология
- VCL — конфигурационный язык Varnish
- Backend — сервер, к которому Varnish проксирует (Apache)
- Hit — запрос обслужен из кэша
- Miss — запрос, который попал к backend
Совместимость и миграция
- На более новых версиях Ubuntu (18.04, 20.04+) путь к юнитам systemd и расположение конфигураций могут отличаться. Перед миграцией проверьте пакеты и документацию Varnish для вашей версии.
- Varnish 4 конфиг отличается от Varnish 6 в деталях VCL и параметрах запуска. Тестируйте VCL на тестовой среде.
Примеры тестов и критерии приёмки
- Функциональный: открыть URL — страница возвращается с кодом 200
- Нагрузочный: при повторных запросах наблюдаем рост процента hit в varnishstat
- Безопасность: TLS завершается перед Varnish, приватные данные не кэшируются
Подсказки и советы
- Используйте varnishstat для мониторинга метрик (hit, miss, backend connections).
- Для тонкой логики кеширования редактируйте default.vcl: vcl_recv, vcl_backend_response, vcl_deliver.
- Для очистки кеша используйте ban/ban_list или управляйте TTL.
Резюме
Varnish хорошо подходит для ускорения доставки статического и кэшируемого контента. Вариант архитектуры: Varnish на 80 → Apache на 8080 — прост и эффективен. Внимательно настройте VCL, проверьте логи и реализуйте TLS‑терминацию при необходимости.
Важно: тестируйте поведение кеширования на ваших страницах и настройте заголовки Cache-Control и Vary корректно.
Дополнительные ресурсы
- Официальная документация Varnish Cache
- Документация Apache HTTPD
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента