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:
- получает сертификат по ACME — через проверку HTTP-01 или TLS-ALPN-01, а при подключённом модуле DNS-провайдера — DNS-01 (нужно для wildcard);
- хранит сертификаты и ключи в своём каталоге данных;
- продлевает их заранее и повторяет попытки при сбоях;
- включает перенаправление 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]