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

Установка Varnish Cache перед Nginx на CentOS 8

• 5 min read • DevOps • Обновлено 27 Nov 2025
Varnish с Nginx на CentOS 8 — установка и настройка
Varnish с Nginx на CentOS 8 — установка и настройка

Схема: Varnish между клиентом и Nginx, кэширование ответов

Требования

  • Сервер с CentOS 8.
  • Доступ root или sudo для выполнения команд.

Коротко о том, что такое Varnish

Varnish Cache — это свободный и открытый HTTP-ускоритель (reverse-proxy). Он располагается между браузером и веб-сервером, хранит в памяти страницы, заголовки и другие данные и обслуживает повторные запросы из кэша, что сильно снижает нагрузку на бэкенд.

Краткое определение: Varnish — память для HTTP-ответов с настраиваемой логикой обработки запросов в VCL.

Установка и настройка Nginx

Мы настроим Nginx как бэкенд на порту 8080.

  1. Установите Nginx:
dnf install nginx -y
  1. Запустите и включите автозапуск:
systemctl start nginx
systemctl enable nginx
  1. По умолчанию Nginx слушает 80-й порт. Откройте конфигурационный файл и измените порт на 8080:
nano /etc/nginx/nginx.conf

Найдите строки:

        listen       80 default_server;
        listen       [::]:80 default_server;

и замените на:

        listen       8080 default_server;
        listen       [::]:8080 default_server;

Сохраните файл и перезапустите Nginx:

systemctl restart nginx
  1. Проверьте, что Nginx слушает порт 8080 (на некоторых системах может понадобиться установить пакет net-tools для netstat):
netstat -tpln | grep 8080

Альтернатива, если netstat отсутствует:

ss -tpln | grep 8080

Ожидаемый пример вывода:

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      30367/nginx: master 
tcp6       0      0 :::8080                 :::*                    LISTEN      30367/nginx: master 

Установка Varnish Cache

На CentOS 8 пакет Varnish доступен в репозитории модулей.

dnf module install varnish

Запустите сервис:

systemctl start varnish

Проверить версию varnish:

varnishd -V

Пример вывода (вариант из примера):

varnishd (varnish-6.0.2 revision 0458b54db26cfbea79af45ca5c4767c7c2925a91)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2018 Varnish Software AS

Настройка Varnish для работы с Nginx

Мы настроим Varnish так, чтобы он слушал порт 80 и проксировал запросы на Nginx на 127.0.0.1:8080.

  1. Измените конфигурацию systemd для varnish, чтобы запускать демона на порту 80:
systemctl edit --full varnish

Найдите строку:

ExecStart=/usr/sbin/varnishd -a :6081 -f /etc/varnish/default.vcl -s malloc,256m

и замените её на:

ExecStart=/usr/sbin/varnishd -a :80 -f /etc/varnish/default.vcl -s malloc,256m

Сохраните и выйдите.

  1. Определите бэкенд в файле /etc/varnish/default.vcl:
nano /etc/varnish/default.vcl

Измените или добавьте блок:

backend myserver {
    .host = "127.0.0.1";
    .port = "8080";
}
  1. Перезагрузите конфигурацию systemd и перезапустите Varnish:
systemctl daemon-reload
systemctl restart varnish
systemctl enable varnish

(Обратите внимание: в исходном тексте опечатка была в команде; правильная команда — systemctl enable varnish.)

  1. Убедитесь, что сервис активен:
systemctl status varnish

Ожидаемый фрагмент вывода показан в исходном примере, где сервис active (running) и процесс varnishd слушает 80 порт.

  1. Проверьте прослушиваемые порты:
netstat -tpln | grep 80

Или с ss:

ss -tpln | grep 80

Ожидаемый пример вывода:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      30424/varnishd      
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      30367/nginx: master 

Настройка SELinux и firewall

По умолчанию SELinux включён. Разрешите веб-процессам устанавливать сетевые подключения:

setsebool -P httpd_can_network_connect 1

Разрешите трафик на порт 80 через firewalld:

firewall-cmd --permanent --zone public --add-port 80/tcp
firewall-cmd --reload

Важно: если вы используете нестандартные зоны или iptables напрямую — настройте их соответствующим образом.

Тестирование Varnish

Выполните запрос с помощью curl:

curl -I http://localhost

Ожидаемый фрагмент заголовков (пример):

HTTP/1.1 200 OK
Server: nginx/1.14.1
Date: Sat, 29 Aug 2020 13:53:44 GMT
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/7.2.24
X-Varnish: 32800
Age: 0
Via: 1.1 varnish (Varnish/6.0)
Accept-Ranges: bytes
Connection: keep-alive

Значимые заголовки:

  • X-Varnish — идентификатор запроса в Varnish.
  • Age — время жизни ответа в кэше (0 означает, что это первый запрос).
  • Via — указывает, что ответ прошёл через Varnish.

Практические советы и альтернативы

  • Альтернатива бэкенду: вместо Nginx можно использовать Apache. Принцип тот же — перенести веб-сервер на другой порт и направить Varnish на него.
  • Хранилище Varnish: примеры используют malloc,256m. Для больших сайтов рассмотрите file или persistent хранилища.
  • Версии: используйте стабильную версию Varnish 6+ и следите за изменениями синтаксиса VCL.
  • SSL/TLS: Varnish не работает с TLS напрямую. Для HTTPS ставьте перед Varnish терминатор TLS (например, Nginx или Hitch) и проксируйте HTTP внутрь Varnish.

Ментальные модели и чек-листы

Модель: Клиент -> (TLS терминатор) -> Varnish(port 80) -> Nginx(port 8080)

Чек-лист для администратора:

  • Nginx установлен и слушает 127.0.0.1:8080
  • Varnish установлен и слушает :80
  • /etc/varnish/default.vcl настроен на бэкенд 127.0.0.1:8080
  • systemctl daemon-reload и systemctl restart varnish выполнены
  • SELinux boolean httpd_can_network_connect = on
  • Порт 80 открыт в firewall
  • Проверка curl показывает заголовки X-Varnish и Via

Чек-лист для разработчика приложений:

  • Приложение отдаёт корректные заголовки Cache-Control, Expires или ETag
  • Динамические страницы помечены так, чтобы Varnish не кэшировал их или кэшировал коротко
  • Добавлены заголовки для очистки кэша (purge/bans), если это требуется

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

  1. curl -I http://localhost возвращает HTTP/1.1 200 OK и заголовок Via или X-Varnish.
  2. ss/netstat показывает varnishd на порту 80 и nginx на 8080.
  3. systemctl status varnish — active (running).
  4. При изменении контента и повторном запросе вы видите Age > 0 после второго запроса (если контент кэшируется).

Отладка и распространённые ошибки

Симптом: Varnish не стартует после смены ExecStart

  • Проверьте синтаксис systemd unit: journalctl -u varnish -b
  • Убедитесь, что порт 80 не занят другим процессом

Симптом: клиент получает «502 Bad Gateway»

  • Проверьте, что Nginx слушает 127.0.0.1:8080
  • Проверьте дефолт.vcl на опечатки

Симптом: в заголовках нет X-Varnish или Via

  • Возможно, запрос обходит Varnish (проверьте DNS/сетевой маршрут и firewall)

Полезные команды для отладки:

journalctl -u varnish -f
varnishlog
varnishstat
ss -tpln | egrep ':80|:8080'

Факт-бокс

  • Порты: Varnish — 80, Nginx бэкенд — 8080
  • Пример хранилища: malloc,256m (в unit ExecStart)
  • Пример версии: varnish-6.0.2 (в примерах вывода)

Заключение

Вы установили и настроили Varnish Cache перед Nginx на CentOS 8. Теперь Varnish обслуживает входящие HTTP-запросы на порту 80 и проксирует их на Nginx на порту 8080. Проверьте поведение кэша через curl и varnishlog, настройте VCL под ваши правила кэширования и добавьте SSL-терминацию, если нужен HTTPS.

Важно: настройка кэширования зависит от логики приложения. Тщательно тестируйте правила VCL и заголовки Cache-Control для корректного поведения.

Если нужны шаблоныVCL, пример настроек для purge или более сложная логика — напишите, и я подготовлю их под ваш сценарий.

Поделиться: 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 быстро