Caddy как обратный прокси: автоматический HTTPS и минимальная конфигурация | AdminWiki

Caddy как обратный прокси: автоматический HTTPS и минимальная конфигурация

02 августа 2026 8 мин. чтения
Содержание статьи

Почему Caddy? Автоматический HTTPS без усилий

Caddy автоматически получает и обновляет сертификаты Let's Encrypt для всех обслуживаемых доменов. Вам не нужны cron-задачи, скрипты обновления и ручная правка конфигураций при продлении. Механизм ACME встроен в ядро веб-сервера и активируется по умолчанию, как только вы указываете доменное имя в Caddyfile.

При запуске Caddy проверяет доступность домена из интернета, выполняет HTTP-01 или TLS-ALPN-01 челлендж, получает сертификат и сохраняет его в /var/lib/caddy/. За 30 дней до истечения сертификата процесс повторяется автоматически. Риск простоя из-за просроченного TLS исключён.

Сравните с типичным сценарием для Nginx: установка certbot, настройка location для верификации, запуск certbot с флагами, добавление cron-задания, мониторинг логов на случай сбоя. Каждый шаг - потенциальная точка отказа. Caddy убирает эту цепочку целиком. Вы описываете логику проксирования, сервер берёт на себя всё остальное. Это прямое снижение операционной нагрузки и human error.

Установка Caddy и первый запуск

Официальный репозиторий Caddy поддерживает Ubuntu, Debian, CentOS, Fedora и другие дистрибутивы. Для Ubuntu/Debian последовательность команд выглядит так:

Установка из официального репозитория

sudo apt update && sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

Эти команды добавляют ключ подписи, регистрируют репозиторий и устанавливают Caddy как systemd-сервис. После установки сервер сразу запускается и начинает слушать порты 80 и 443.

Проверка работы и базовая команда caddy run

Проверьте версию и статус сервиса:

caddy version
sudo systemctl status caddy

Для отладки конфигурации запускайте Caddy вручную в foreground-режиме. Это удобно при тестировании нового Caddyfile - все ошибки и процесс получения сертификата видны в реальном времени:

sudo caddy run --config /etc/caddy/Caddyfile

Альтернативные способы установки - Docker-образ caddy:latest и скачивание бинарника со страницы релизов на GitHub - дают ту же функциональность, но требуют ручной настройки systemd-юнита.

Минимальная конфигурация обратного прокси: ваш первый Caddyfile

Caddyfile - это текстовый файл с описанием обслуживаемых сайтов и правил обработки запросов. Расположение по умолчанию: /etc/caddy/Caddyfile. Минимальная конфигурация обратного прокси умещается в три строки.

Синтаксис Caddyfile: домен и директива reverse_proxy

example.com {
    reverse_proxy localhost:8080
}

Фигурные скобки определяют блок сайта. Домен example.com - это адрес, на который Caddy принимает запросы. Директива reverse_proxy указывает, куда перенаправлять трафик. Всё. Caddy слушает порты 80 и 443, автоматически получает сертификат для example.com и проксирует HTTPS-запросы на localhost:8080.

Для сравнения, аналогичная конфигурация Nginx требует минимум 20 строк: отдельные блоки server для HTTP и HTTPS, директивы ssl_certificate, ssl_certificate_key, listen 443 ssl, location / с proxy_pass и proxy_set_header. Каждая строка - потенциальная опечатка или несоответствие версии. Caddy сокращает поверхность для ошибок на порядок.

Можно указать несколько бэкендов в одной строке - Caddy будет распределять нагрузку:

example.com {
    reverse_proxy backend1:8080 backend2:8080
}

Автоматический HTTPS: что происходит под капотом

При первом запуске с новым доменом Caddy выполняет цепочку действий без участия администратора:

  1. Проверяет, что домен резолвится в IP-адрес сервера.
  2. Открывает временный listener на порту 80 для HTTP-01 челленджа Let's Encrypt.
  3. Генерирует приватный ключ и CSR (Certificate Signing Request).
  4. Отправляет запрос в ACME API Let's Encrypt, подтверждает владение доменом.
  5. Получает сертификат, сохраняет его в /var/lib/caddy/.local/share/caddy/.
  6. Настраивает автоматическое обновление за 30 дней до истечения.

Все шаги логируются в systemd journal. При сбое Caddy повторяет попытку с экспоненциальной задержкой. Вам не нужно писать обработчики ошибок и мониторить почту от Let's Encrypt.

Проксирование нескольких сервисов: домены и пути

Один сервер Caddy обслуживает десятки бэкенд-сервисов. Два основных подхода - маршрутизация по поддоменам и маршрутизация по путям URL.

Маршрутизация по доменам

app.example.com {
    reverse_proxy localhost:3000
}

api.example.com {
    reverse_proxy localhost:4000
}

Каждый блок получает отдельный сертификат автоматически. Caddy поддерживает до 100 доменов на одном IP без дополнительной настройки - ограничение задаётся только лимитами Let's Encrypt на количество сертификатов в неделю.

Маршрутизация по путям с handle_path

Когда поддомены недоступны, используйте префиксы путей. Директива handle_path обрезает префикс перед отправкой запроса на бэкенд:

example.com {
    handle_path /app/* {
        reverse_proxy localhost:3000
    }
    handle_path /api/* {
        reverse_proxy localhost:4000
    }
}

Запрос к example.com/app/users придёт на бэкенд как /users. Без handle_path бэкенд получил бы полный путь /app/users, что часто ломает маршрутизацию фронтенд-фреймворков. Проверьте, что ваше приложение поддерживает работу из подкаталога - некоторые SPA требуют указания base в конфигурации сборки.

Сравнение Caddy и Nginx: простота против гибкости

Оба сервера решают задачу обратного прокси. Разница - в подходе к управлению и объёме ручной работы. Выбор зависит от приоритетов: скорость развёртывания или максимальная кастомизация.

Управление сертификатами: Caddy vs Nginx + Certbot

Типичный путь настройки HTTPS в Nginx включает установку certbot, правку конфигурации для верификации, запуск certbot с указанием плагина, добавление cron-задачи на обновление и мониторинг логов. Caddy заменяет это нулевым набором действий - сертификаты появляются при первом запуске и обновляются прозрачно.

Операционная разница ощутима при масштабировании. Кластер из 10 серверов на Nginx требует централизованного управления cron-задачами или внешнего оркестратора. Caddy на каждом узле решает задачу самостоятельно, без внешних зависимостей.

Производительность и потребление ресурсов

Caddy написан на Go и использует высокопроизводительный HTTP-стек, оптимизированный для конкурентных соединений. На типичных нагрузках обратного прокси - до 10 000 одновременных соединений - разница в задержке с Nginx не превышает 5-10%. Caddy потребляет на 20-30% больше оперативной памяти из-за рантайма Go, но для современных серверов с 2-4 ГБ ОЗУ это некритично.

Ключевые различия сведены в таблицу:

Критерий Caddy Nginx
Настройка TLS Автоматически, из коробки Ручная установка certbot, cron
Размер конфигурации 3 строки на сайт 20+ строк на сайт
Читаемость конфига Высокая, декларативный синтаксис Средняя, много директив
Риск ошибок Низкий, минимум ручных действий Высокий, много точек отказа
Потребление памяти Выше на 20-30% Ниже, написан на C
Экосистема Растёт, модули на Go Зрелая, тысячи готовых рецептов

Nginx выигрывает в сценариях, где нужны специфичные модули или интеграция с legacy-инфраструктурой. Caddy - когда важна скорость развёртывания и снижение операционных рисков. Подробнее о production-конфигурациях Nginx читайте в нашем сборнике готовых решений для стандартных задач.

Продвинутые возможности: балансировка, health checks и логирование

Минимальная конфигурация покрывает 80% сценариев. Оставшиеся 20% - балансировка с проверкой здоровья бэкендов и структурированное логирование - настраиваются парой дополнительных строк.

Балансировка нагрузки и отказоустойчивость

app.example.com {
    reverse_proxy backend1:8080 backend2:8080 backend3:8080 {
        lb_policy least_conn
        health_uri /health
        health_interval 10s
        health_timeout 2s
    }
}

Директива lb_policy задаёт алгоритм: round_robin, least_conn, first или random. Health check с параметрами health_uri, health_interval и health_timeout автоматически исключает бэкенд из ротации при трёх последовательных failures. Трафик перераспределяется на оставшиеся узлы без потери запросов.

Логирование и мониторинг

app.example.com {
    reverse_proxy localhost:8080
    log {
        output file /var/log/caddy/access.log {
            roll_size 100mb
            roll_keep 5
        }
        format json
    }
}

JSON-формат логов совместим с ELK, Loki и другими системами агрегации. Ротация по размеру файла встроена - не нужен logrotate. Для отладки временно переключайте output stdout и поднимайте уровень детализации через глобальную директиву debug.

Обновление Caddy и управление сервисом

Установка через официальный репозиторий интегрирует Caddy в стандартный жизненный цикл пакетов:

sudo apt update && sudo apt upgrade caddy
sudo systemctl restart caddy

Для автоматического обновления подключите unattended-upgrades с фильтром по origin cloudsmith. Конфигурационный файл /etc/caddy/Caddyfile при обновлении пакета не перезаписывается - изменения сохраняются.

Основные команды управления:

  • sudo systemctl reload caddy - применить новый Caddyfile без разрыва соединений.
  • sudo systemctl restart caddy - полный перезапуск, требуется при смене глобальных опций.
  • caddy validate --config /etc/caddy/Caddyfile - проверить синтаксис перед применением.

Сертификаты хранятся в /var/lib/caddy/.local/share/caddy/. При миграции на другой сервер достаточно скопировать эту директорию вместе с Caddyfile - повторный выпуск сертификатов не потребуется.

Типичные проблемы и их решение

Две самые частые проблемы при запуске - ошибки получения сертификата и некорректная передача заголовков на бэкенд. Обе решаются за несколько минут.

Ошибки получения сертификата Let's Encrypt

Сбой выдачи сертификата почти всегда связан с одной из трёх причин:

  • Домен не резолвится в IP сервера. Проверьте A-запись: dig +short example.com. CNAME без соответствующей A-записи на целевом хосте - частая ошибка при использовании CDN.
  • Порт 80 недоступен из интернета. Let's Encrypt выполняет HTTP-01 челлендж именно на 80 порту. Фаервол или облачный провайдер могут блокировать входящие соединения.
  • Порт 80 занят другим процессом. Остановите Nginx или Apache перед запуском Caddy: sudo systemctl stop nginx.

Перед применением конфигурации всегда запускайте валидацию: caddy validate --config /etc/caddy/Caddyfile. Синтаксическая ошибка в Caddyfile прерывает запуск с понятным сообщением.

Проблемы с заголовками запросов

Caddy по умолчанию передаёт заголовки X-Forwarded-For, X-Forwarded-Proto и Host. Если приложение не видит реальный IP клиента или определяет протокол как HTTP, добавьте явное указание доверенных прокси:

app.example.com {
    reverse_proxy localhost:8080 {
        header_up X-Real-IP {remote_host}
    }
}

Для приложений за несколькими прокси настройте trusted_proxies в глобальных опциях Caddyfile, чтобы корректно извлекать IP из цепочки X-Forwarded-For. Более детально тема безопасности веб-серверов раскрыта в руководстве по полной защите Nginx и Apache.

Если вы работаете с Nginx и хотите углубиться в тему обратного прокси, обратите внимание на полное руководство по настройке Nginx Reverse Proxy с готовыми конфигурациями и таблицей диагностики ошибок.

Поделиться:
Сохранить гайд? В закладки браузера