Настройка SSL-терминации для Varnish через Nginx
Зачем это нужно
Varnish сам по себе не поддерживает SSL/TLS. Чтобы обслуживать HTTPS, нужно завершать TLS на внешнем компоненте (терминаторе) — Nginx, Hitch или Apache — а затем проксировать уже расшифрованный трафик к Varnish и далее к бэкенду.
Важно: терминатор принимает входящие HTTPS-соединения на порту 443 и пересылает HTTP-запросы в Varnish (обычно на 80 или на нестандартный порт, если Nginx используется как бэкенд).
Основные понятия
- SSL/TLS: протоколы шифрования для HTTPS. Общее название — TLS.
- SSL-терминация: расшифровка HTTPS на промежуточном сервере, далее трафик идет по HTTP.
- Termination proxy: компонент, принимающий HTTPS и пересылающий HTTP.
Предусловия
- Linux-сервер с установленным Varnish.
- Права root или sudo.
- Домен, направленный на IP сервера (в примерах — example.io).
Пример ориентирован на Rocky Linux / CentOS, но везде показаны команды для Debian/Ubuntu параллельно.
Установка Nginx
Если вы используете Nginx как бэкенд для Varnish, этот шаг можно пропустить.
- На Debian/Ubuntu:
sudo apt install nginx -y- На CentOS/RockyLinux/AlmaLinux:
sudo dnf install nginx -y- Включите и запустите Nginx:
sudo systemctl enable --now nginxЕсли служба упала из-за конфигурации, не переживайте — её перенастроим ниже.
Получение сертификата с помощью Certbot
Мы настроим certbot для выдачи бесплатных сертификатов Let’s Encrypt. Перед выдачей нужно освободить порт 80 (Varnish может мешать) и открыть 80/443 в брандмауэре.
- Откройте порты в фаерволе.
На Debian/Ubuntu с ufw:
sudo ufw allow http
sudo ufw allow https
sudo ufw reloadНа CentOS/Rocky/Alma с firewalld:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload- Установите certbot.
Debian/Ubuntu:
sudo apt install certbot -yCentOS/Rocky/Alma:
sudo dnf install certbot -y- Остановите сервисы, которые занимают порт 80 (обычно Varnish и Nginx) перед запуском certbot в режиме standalone:
sudo systemctl stop varnish
sudo systemctl stop nginx- Запустите certbot для получения сертификата. Замените email и домен на свои:
sudo certbot certonly --agree-tos --email your-email@example.com --standalone --preferred-challenges http -d example.ioПосле успешного выполнения сертификаты будут в:
- /etc/letsencrypt/live/example.io/fullchain.pem — публичная цепочка сертификатов
- /etc/letsencrypt/live/example.io/privkey.pem — приватный ключ
Важно: сертификаты Let’s Encrypt действуют 90 дней. Позаботьтесь о автоматическом продлении (cron или systemd timer). Certbot обычно добавляет systemd таймер или cron-правило при установке из пакета.
Если Nginx не является бэкендом: меняем порт по умолчанию
Если у вас есть отдельный бэкенд (например, Apache или приложение на 8080), то стандартный конфиг Nginx нужно сдвинуть с порта 80, чтобы Varnish занимал 80. Например, переведём Nginx на 8081.
- Отредактируйте основной конфиг Nginx:
sudo nano /etc/nginx/nginx.confВ секции server замените listen на 8081:
server {
listen 8081 default_server;
listen [::]:8081 default_server;
...
}- Перезапустите Nginx:
sudo systemctl restart nginxТеперь Nginx слушает 8081, а Varnish может занять 80.
Настройка SSL-терминации в Nginx
Мы создадим серверный блок, который слушает 443 и проксирует запросы на Varnish (на 127.0.0.1:80). В конфигурации пропишите путь к сертификатам, полученным certbot.
- Создайте файл конфигурации.
Debian/Ubuntu:
sudo nano /etc/nginx/sites-available/example.ioCentOS/Rocky/Alma:
sudo nano /etc/nginx/conf.d/example.conf- Вставьте пример конфигурации и измените пути к сертификатам и имя домена. Обратите внимание на прокси-заголовки, они помогают бэкенду видеть оригинальный протокол и порт:
server {
listen 443 ssl http2;
server_name example.io;
ssl_certificate /etc/letsencrypt/live/example.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.io/privkey.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/example.io_access.log;
error_log /var/log/nginx/example.io_error.log;
location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $host;
}
}Примечание: в production рекомендуется добавить HTTP->HTTPS редирект на уровне Nginx для домена и HSTS при необходимости.
- Активируйте конфигурацию на Debian/Ubuntu:
sudo ln -s /etc/nginx/sites-available/example.io /etc/nginx/sites-enabled/- Проверка конфигурации и перезапуск:
sudo nginx -t
sudo systemctl restart nginx- Убедитесь, что Nginx слушает 443:
ss -antpl | grep 443Пример ожидаемого состояния: порт 443 в состоянии LISTEN и процессы nginx обслуживают соединения.

Alt текста: Схема, показывающая Nginx в качестве SSL-терминатора перед Varnish и бэкендом.
Перенаправление HTTP на HTTPS в Varnish
Мы добавим правило в default.vcl, которое отвечает на HTTP-запросы и возвращает синтетический ответ с кодом 301, указывающий Location на HTTPS.
- Откройте Varnish конфигурацию:
sudo nano /etc/varnish/default.vcl- Внутри sub vcl_recv добавьте блок для перенаправления (замените example.io на ваш домен):
sub vcl_recv {
...
if (client.ip != "127.0.0.1" && req.http.host ~ "example.io") {
set req.http.x-redir = "https://example.io" + req.url;
return (synth(850, ""));
}
...
}- Добавьте обработчик synth, который вернёт 301:
sub vcl_synth {
if (resp.status == 850) {
set resp.http.Location = req.http.x-redir;
set resp.status = 301;
return (deliver);
}
}- Перезапустите Varnish:
sudo systemctl restart varnishТеперь все запросы по http://example.io будут получать ответ 301 с Location https://example.io… и браузер перенаправит пользователя.
Проверка работы
В браузере откройте http://example.io — вы должны автоматически попасть на https://example.io. В инструментах разработчика вкладка Network покажет код 301 и перенаправление.
Через curl:
curl -I http://example.ioОжидаемый заголовок содержит строку Location: https://example.io и статус 301.

Alt текста: Скриншот вкладки Network в браузере с примером запроса и перенаправлением 301 на HTTPS.
Отладка и типичные ошибки
Important: выполняйте проверки шаг за шагом — сертификаты, порты, сервисы.
- Нельзя присвоить один и тот же порт двум сервисам. Если Varnish слушает 80, а Nginx тоже пытается, измените слушающий порт у одного сервиса.
- Certbot не сможет выпустить сертификат, если порт 80 занят. Остановите Varnish/Nginx перед запуском certbot в режиме standalone.
- Неправильные пути к сертификатам в nginx.conf приведут к ошибке при старте Nginx (nginx -t покажет, где именно).
- Для автоматического обновления certbot используйте systemd timer или cron: проверьте systemctl list-timers | grep certbot.
Полезные команды для диагностики:
sudo nginx -t
sudo systemctl status nginx
sudo systemctl status varnish
ss -antpl | grep -E "80|443"
journalctl -u nginx -b --no-pager
journalctl -u varnish -b --no-pagerАльтернативные подходы
- Hitch: лёгкий SSL-прокси, часто используется вместе с Varnish. Хорош для низкой задержки и экономии памяти.
- Apache: может выполнять SSL-терминацию вместо Nginx, если у вас уже есть Apache в стеке.
- Прямое TLS в бэкенде: если у вас есть требования к сквозному шифрованию, можно настроить TLS между терминатором и бэкендом, но это усложняет архитектуру.
Когда не использовать Nginx-терминацию:
- Если вам нужен минимальный стек и вы предпочитаете специализированные TLS-прокси вроде Hitch.
- Если вы хотите, чтобы Varnish принимал трафик напрямую (нужно патчить/модифицировать Varnish или использовать сторонние решения).
Безопасность и рекомендации
- Включите TLSv1.3 и TLSv1.2, отключите устаревшие протоколы.
- Обновляйте OpenSSL и Nginx.
- В production включите HSTS аккуратно (прежде чем включать preload убедитесь в полном покрытии поддоменов).
- Минимизируйте права доступа к приватным ключам (600, владелец root).
- Логи ошибок и доступа храните и ротацируйте (logrotate).
Роль-ориентированные чек-листы
Для системного администратора:
- Убедиться, что DNS указывает на сервер.
- Открыть порты 80/443 в фаерволе.
- Получить сертификат certbot и проверить расположение файлов.
Для DevOps-инженера:
- Настроить Nginx на 443 и проксирование на Varnish.
- Обновить Varnish VCL для перенаправления.
- Настроить автоматическое продление сертификатов и проверку рестарта сервисов.
Для разработчика приложения:
- Убедиться, что приложение корректно обрабатывает заголовки X-Forwarded-For и X-Forwarded-Proto.
- Не полагаться на IP клиента в логах, если используется прокси — используйте X-Real-IP/X-Forwarded-For.
Быстрый чеклист перед вводом в эксплуатацию
- DNS указывает на сервер.
- Сертификат получен и файлы доступны.
- Nginx успешно стартует и слушает 443.
- Varnish запущен и слушает 80.
- HTTP перенаправляется на HTTPS с 301.
- Автопродление certbot настроено и проверено.
Факт-бокс
- Порты: 80 (HTTP), 443 (HTTPS).
- Сертификаты Let’s Encrypt: срок 90 дней.
- Типичный стек: Клиент -> Nginx (TLS) -> Varnish (HTTP) -> Бэкенд (Nginx/Apache/приложение).
Миграция и совместимость
- При переносе с другой машины убедитесь, что приватные ключи и конфиги переданы безопасно (scp/rsync через SSH).
- При использовании контейнеров (Docker) убедитесь, что проброшены порты и volume для сертификатов доступны контейнеру Nginx.
Краткое резюме
Вы настроили Nginx как SSL-терминатор перед Varnish, получили сертификат Let’s Encrypt, настроили проксирование и добавили правило в Varnish для перенаправления HTTP на HTTPS. Это распространённый и надёжный способ добавить TLS в стек с Varnish без изменения самого Varnish.
Ключевые шаги: получить сертификат, настроить Nginx на 443 с proxy_pass на Varnish, добавить правило в default.vcl для перенаправления, настроить автопродление сертификатов.
Notes: держите конфигурации под версионным контролем, проверяйте работу продления certbot и следите за безопасностью приватных ключей.

Alt текста: Вывод curl -I показывающий заголовки ответа с кодом 301 и заголовком Location с ссылкой на HTTPS.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента