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

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

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

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

  1. Установим Apache
  2. Изменим порт Apache по умолчанию на 8080
  3. Установим Varnish
  4. Настроим Varnish как обратный прокси на порту 80
  5. Проверим конфигурацию и отладим возможные проблемы

Требования

  • Сервер с 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 на Ubuntu

Apache установлен и работает по умолчанию на порту 80.

Откройте порты SSH, HTTP и HTTPS в UFW (если используется):

ufw allow ssh
ufw allow http
ufw allow https

Включите файрвол и подтвердите действие:

ufw enable

Открытие портов в UFW

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

netstat -plntu

Или выполнить быстрый HTTP‑запрос:

curl -I hakase-labs.co

Вы должны получить заголовки ответа от Apache.

Проверка Apache ответом curl

Шаг 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

По умолчанию Varnish слушает публичный порт 6081 и административный порт 6082. Проверьте:

netstat -plntu

Проверка портов Varnish

Шаг 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

Перевести 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 доступа через curl

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

Тестовая страница 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

Частые ошибки и отладка

  1. Varnish не стартует после смены порта
    • Проверьте, не занят ли порт 80 другим процессом (например, Apache). Команда:
sudo lsof -i :80
  • Если Apache по-прежнему слушает 80 — убедитесь, что изменения в /etc/apache2 были сохранены и Apache перезапущен.
  1. Пустая страница или 502 от Varnish
    • Проверьте backend в default.vcl: корректность .host и .port.
    • Проверьте, отвечает ли Apache на 127.0.0.1:8080 через curl:
curl -I http://127.0.0.1:8080
  1. Изменения в default.vcl не применяются

    • Перезагрузите Varnish: systemctl restart varnish
    • Проверьте синтаксис VCL через varnishd -C -f /etc/varnish/default.vcl
  2. Права на секретный файл

    • Файл /etc/varnish/secret должен быть читаем для запускаемого пользователя; если нет, Varnish может падать.
  3. Ошибки 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 — быстрые команды для восстановления

  1. Проверить процессы и порты
systemctl status varnish apache2
netstat -plntu | egrep ":80|:8080|:6082"
  1. Перезапустить Varnish и Apache
systemctl restart varnish
systemctl restart apache2
  1. Проверить VCL на ошибки
varnishd -C -f /etc/varnish/default.vcl
  1. Просмотр логов в реальном времени
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
Поделиться: 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 быстро