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

Настройка SSL-терминации для Varnish через Nginx

• 6 min read • DevOps • Обновлено 17 Nov 2025
SSL-терминация Varnish через Nginx
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, этот шаг можно пропустить.

  1. На Debian/Ubuntu:
sudo apt install nginx -y
  1. На CentOS/RockyLinux/AlmaLinux:
sudo dnf install nginx -y
  1. Включите и запустите Nginx:
sudo systemctl enable --now nginx

Если служба упала из-за конфигурации, не переживайте — её перенастроим ниже.


Получение сертификата с помощью Certbot

Мы настроим certbot для выдачи бесплатных сертификатов Let’s Encrypt. Перед выдачей нужно освободить порт 80 (Varnish может мешать) и открыть 80/443 в брандмауэре.

  1. Откройте порты в фаерволе.

На 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
  1. Установите certbot.

Debian/Ubuntu:

sudo apt install certbot -y

CentOS/Rocky/Alma:

sudo dnf install certbot -y
  1. Остановите сервисы, которые занимают порт 80 (обычно Varnish и Nginx) перед запуском certbot в режиме standalone:
sudo systemctl stop varnish
sudo systemctl stop nginx
  1. Запустите 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.

  1. Отредактируйте основной конфиг Nginx:
sudo nano /etc/nginx/nginx.conf

В секции server замените listen на 8081:

    server {
        listen       8081 default_server;
        listen       [::]:8081 default_server;
        ...
    }
  1. Перезапустите Nginx:
sudo systemctl restart nginx

Теперь Nginx слушает 8081, а Varnish может занять 80.


Настройка SSL-терминации в Nginx

Мы создадим серверный блок, который слушает 443 и проксирует запросы на Varnish (на 127.0.0.1:80). В конфигурации пропишите путь к сертификатам, полученным certbot.

  1. Создайте файл конфигурации.

Debian/Ubuntu:

sudo nano /etc/nginx/sites-available/example.io

CentOS/Rocky/Alma:

sudo nano /etc/nginx/conf.d/example.conf
  1. Вставьте пример конфигурации и измените пути к сертификатам и имя домена. Обратите внимание на прокси-заголовки, они помогают бэкенду видеть оригинальный протокол и порт:
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 при необходимости.

  1. Активируйте конфигурацию на Debian/Ubuntu:
sudo ln -s /etc/nginx/sites-available/example.io /etc/nginx/sites-enabled/
  1. Проверка конфигурации и перезапуск:
sudo nginx -t
sudo systemctl restart nginx
  1. Убедитесь, что Nginx слушает 443:
ss -antpl | grep 443

Пример ожидаемого состояния: порт 443 в состоянии LISTEN и процессы nginx обслуживают соединения.

Наглядная схема: Nginx как SSL-терминатор перед Varnish

Alt текста: Схема, показывающая Nginx в качестве SSL-терминатора перед Varnish и бэкендом.


Перенаправление HTTP на HTTPS в Varnish

Мы добавим правило в default.vcl, которое отвечает на HTTP-запросы и возвращает синтетический ответ с кодом 301, указывающий Location на HTTPS.

  1. Откройте Varnish конфигурацию:
sudo nano /etc/varnish/default.vcl
  1. Внутри 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, ""));
    }
    ...
}
  1. Добавьте обработчик synth, который вернёт 301:
sub vcl_synth {
    if (resp.status == 850) {
       set resp.http.Location = req.http.x-redir;
       set resp.status = 301;
       return (deliver);
    }
}
  1. Перезапустите Varnish:
sudo systemctl restart varnish

Теперь все запросы по http://example.io будут получать ответ 301 с Location https://example.io… и браузер перенаправит пользователя.


Проверка работы

  1. В браузере откройте http://example.io — вы должны автоматически попасть на https://example.io. В инструментах разработчика вкладка Network покажет код 301 и перенаправление.

  2. Через curl:

curl -I http://example.io

Ожидаемый заголовок содержит строку Location: https://example.io и статус 301.

Скриншот: проверка перенаправления в браузере

Alt текста: Скриншот вкладки Network в браузере с примером запроса и перенаправлением 301 на HTTPS.


Отладка и типичные ошибки

Important: выполняйте проверки шаг за шагом — сертификаты, порты, сервисы.

  1. Нельзя присвоить один и тот же порт двум сервисам. Если Varnish слушает 80, а Nginx тоже пытается, измените слушающий порт у одного сервиса.
  2. Certbot не сможет выпустить сертификат, если порт 80 занят. Остановите Varnish/Nginx перед запуском certbot в режиме standalone.
  3. Неправильные пути к сертификатам в nginx.conf приведут к ошибке при старте Nginx (nginx -t покажет, где именно).
  4. Для автоматического обновления 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 и следите за безопасностью приватных ключей.

Проверка ответа curl с редиректом 301 на HTTPS

Alt текста: Вывод curl -I показывающий заголовки ответа с кодом 301 и заголовком Location с ссылкой на HTTPS.

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