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

Требования
- Сервер с CentOS 8.
- Доступ root или sudo для выполнения команд.
Коротко о том, что такое Varnish
Varnish Cache — это свободный и открытый HTTP-ускоритель (reverse-proxy). Он располагается между браузером и веб-сервером, хранит в памяти страницы, заголовки и другие данные и обслуживает повторные запросы из кэша, что сильно снижает нагрузку на бэкенд.
Краткое определение: Varnish — память для HTTP-ответов с настраиваемой логикой обработки запросов в VCL.
Установка и настройка Nginx
Мы настроим Nginx как бэкенд на порту 8080.
- Установите Nginx:
dnf install nginx -y- Запустите и включите автозапуск:
systemctl start nginx
systemctl enable nginx- По умолчанию 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- Проверьте, что 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.
- Измените конфигурацию 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Сохраните и выйдите.
- Определите бэкенд в файле /etc/varnish/default.vcl:
nano /etc/varnish/default.vclИзмените или добавьте блок:
backend myserver {
.host = "127.0.0.1";
.port = "8080";
}- Перезагрузите конфигурацию systemd и перезапустите Varnish:
systemctl daemon-reload
systemctl restart varnish
systemctl enable varnish(Обратите внимание: в исходном тексте опечатка была в команде; правильная команда — systemctl enable varnish.)
- Убедитесь, что сервис активен:
systemctl status varnishОжидаемый фрагмент вывода показан в исходном примере, где сервис active (running) и процесс varnishd слушает 80 порт.
- Проверьте прослушиваемые порты:
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), если это требуется
Критерии приёмки
- curl -I http://localhost возвращает HTTP/1.1 200 OK и заголовок Via или X-Varnish.
- ss/netstat показывает varnishd на порту 80 и nginx на 8080.
- systemctl status varnish — active (running).
- При изменении контента и повторном запросе вы видите 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 или более сложная логика — напишите, и я подготовлю их под ваш сценарий.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента