Caddy

Материал из llmdocs — справочник разработчика
Caddy
Типвеб-сервер и обратный прокси
АвторМэтт Холт
Первый выпуск2015
Caddy 2май 2020
ЯзыкGo
ЛицензияApache 2.0
Ключевая особенностьавтоматический HTTPS (ACME) по умолчанию
КонфигурацияCaddyfile, JSON, REST API администрирования

Caddy — веб-сервер и обратный прокси, написанный на Go. Его главная особенность — автоматический HTTPS: достаточно указать в конфигурации доменное имя, и Caddy сам получит сертификат по протоколу ACME (по умолчанию у Let's Encrypt и ZeroSSL), настроит TLS с безопасными параметрами, включит перенаправление с HTTP на HTTPS и будет продлевать сертификат без участия человека.[2]

Caddy ценят за простую конфигурацию и разумные значения по умолчанию: HTTP/2 и HTTP/3, современные шифры, сжатие — всё работает «из коробки». Он распространяется как один бинарный файл без зависимостей.

История

Мэтт Холт выпустил Caddy в 2015 году; это был первый веб-сервер, включавший HTTPS автоматически и по умолчанию. В мае 2020 года вышла полностью переписанная версия Caddy 2 с модульной архитектурой, внутренней конфигурацией в формате JSON и API для изменения настроек на лету.[6] Проект распространяется под лицензией Apache 2.0.

Caddyfile

Основной способ настройки — файл Caddyfile с лаконичным синтаксисом:[3]

# статический сайт с автоматическим HTTPS
example.com {
    root * /var/www/example
    file_server
    encode zstd gzip
}

# обратный прокси к приложению с балансировкой
api.example.com {
    reverse_proxy 127.0.0.1:8001 127.0.0.1:8002 {
        lb_policy least_conn
        health_uri /health
    }
}

# несколько путей на одном домене
app.example.com {
    handle /api/* {
        reverse_proxy localhost:8000
    }
    handle {
        root * /srv/frontend
        try_files {path} /index.html      # одностраничное приложение
        file_server
    }
}

Сравните с аналогичной конфигурацией nginx: не нужно указывать пути к сертификатам, слушать порт 80 для перенаправления и вручную передавать заголовки X-Forwarded-* — reverse_proxy делает это сам.[4]

caddy run --config Caddyfile       # запуск в терминале
caddy reload --config Caddyfile    # применить изменения без простоя
caddy fmt --overwrite Caddyfile    # отформатировать файл
caddy reverse-proxy --from example.com --to localhost:8000   # прокси одной командой

Автоматический HTTPS

Для каждого публичного доменного имени в конфигурации Caddy:

  1. получает сертификат по ACME — через проверку HTTP-01 или TLS-ALPN-01, а при подключённом модуле DNS-провайдера — DNS-01 (нужно для wildcard);
  2. хранит сертификаты и ключи в своём каталоге данных;
  3. продлевает их заранее и повторяет попытки при сбоях;
  4. включает перенаправление HTTP → HTTPS и HSTS-подобные настройки.

Для localhost и внутренних имён Caddy создаёт собственный локальный центр сертификации и выпускает доверенные сертификаты для разработки, предложив установить корневой сертификат в систему. Режим On-Demand TLS выпускает сертификаты в момент первого обращения — удобно для платформ, где клиенты подключают свои домены.

Условие для публичного сертификата — домен должен указывать на сервер (запись A или AAAA), а порты 80 и 443 должны быть доступны из интернета.

JSON и API

Внутри Caddy вся конфигурация — документ JSON; Caddyfile лишь преобразуется в него адаптером. Через административный API на localhost:2019 конфигурацию можно читать и менять на лету, без перезапуска, что удобно для автоматизации и платформ.[5]

curl localhost:2019/config/                 # текущая конфигурация
caddy adapt --config Caddyfile --pretty     # посмотреть JSON, полученный из Caddyfile

Модули

Возможности расширяются модулями на Go, которые вкомпилировываются в бинарный файл с помощью утилиты xcaddy или выбираются на странице загрузки: DNS-провайдеры для ACME, ограничение частоты запросов, аутентификация, кэш, интеграция с Docker через метки контейнеров.

xcaddy build --with github.com/caddy-dns/cloudflare

Caddy и nginx

Caddy nginx
HTTPS автоматически вручную или через Certbot
Конфигурация короткий Caddyfile, JSON API развитый, но многословный синтаксис
HTTP/3 по умолчанию требует настройки
Изменение на лету API reload с перечитыванием файлов
Экосистема и примеры меньше огромная
Производительность высокая, обычно достаточная максимальная, особенно для статики

Caddy — удачный выбор для небольших и средних проектов, личных серверов, сред разработки и платформ с множеством доменов; nginx — когда нужна максимальная производительность, тонкая настройка или совместимость с существующей инфраструктурой. Полное описание — в документации Caddy.[1]

См. также

Источники

  1. Caddy — документация
  2. Caddy — Automatic HTTPS
  3. Caddy — The Caddyfile
  4. Caddy — reverse_proxy directive
  5. Caddy — API
  6. caddyserver/caddy — GitHub