Caddy vs Nginx в 2026: автоматический HTTPS и простая конфигурация

Проблема: 47 сертификатов и ночные звонки

Агентство «ВебФронт» — 47 клиентских сайтов на одном сервере с Nginx. Сертификаты Let's Encrypt через certbot. Инциденты за полгода:

  • 3 раза: certbot не смог обновить сертификат (порт 80 был занят, директория .well-known не существовала)
  • 2 раза: wildcard-сертификат не обновился (DNS challenge через API Cloudflare — токен протух)
  • 1 раз: инженер забыл добавить certbot для нового домена. Клиент обнаружил через 2 недели

Caddy — веб-сервер, созданный с идеей: HTTPS должен работать по умолчанию, без конфигурации. Написан на Go, один бинарник, автоматические сертификаты для любого домена.

КритерийNginxCaddy
ЯзыкCGo
HTTPSРучная настройка + certbotАвтоматически
HTTP/3 (QUIC)ЭкспериментальноИз коробки
КонфигурацияФайлы .confCaddyfile или JSON API
Горячая перезагрузкаnginx -s reloadcaddy reload (zero-downtime)
Производительность (RPS)~95,000~85,000
Расход памяти~5 МБ base~30 МБ base
ПлагиныМодули (пересборка)xcaddy build

Caddy: конфигурация за 5 минут

Установка Caddy на Debian/Ubuntu:

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

Caddyfile для reverse proxy с автоматическим HTTPS:

# /etc/caddy/Caddyfile

# Сайт 1 — статика
example.com {
    root * /var/www/example
    file_server
    encode gzip zstd
}

# Сайт 2 — reverse proxy к Node.js
api.example.com {
    reverse_proxy localhost:3000 {
        health_uri /health
        health_interval 10s
    }
}

# Сайт 3 — PHP (WordPress)
blog.example.com {
    root * /var/www/wordpress
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
    encode gzip
}

# Сайт 4 — балансировка между серверами
app.example.com {
    reverse_proxy 10.0.1.10:8080 10.0.1.11:8080 {
        lb_policy round_robin
        health_uri /healthz
        fail_duration 30s
    }
}

Это вся конфигурация. Caddy автоматически:

  • Получит TLS-сертификаты Let's Encrypt для всех четырёх доменов
  • Настроит HTTP→HTTPS редирект
  • Включит OCSP stapling
  • Обновит сертификаты за 30 дней до истечения
  • Включит HTTP/2 и HTTP/3

Эквивалент на Nginx: 10x больше конфигурации

Тот же функционал на Nginx для одного домена api.example.com:

# /etc/nginx/sites-available/api.example.com
server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        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 $scheme;
    }
}

# + certbot install/cron
# + ssl_dhparam generation
# + nginx -t && systemctl reload nginx

На Caddy то же самое — 4 строки. Умножьте на 47 сайтов и разница становится критической.

Совет: Caddy умеет управлять сертификатами через DNS challenge (Cloudflare, Route53, и др.) — для серверов без открытого порта 80. Нужна пересборка: xcaddy build --with github.com/caddy-dns/cloudflare.

Производительность: тесты и результаты

Бенчмарки на сервере: 8 CPU Xeon, 32 GB RAM, Debian 12. Тест: wrk -t8 -c256 -d30s, статический файл 1KB.

МетрикаNginx 1.26Caddy 2.8Разница
Requests/sec (HTTP)95,20084,700-11%
Requests/sec (HTTPS)72,30068,100-6%
Latency p998.2ms9.1ms+11%
Reverse proxy (RPS)45,60043,200-5%
RAM (idle, 50 vhosts)12 MB48 MB+300%
RAM (under load)45 MB120 MB+167%

Вывод: Nginx на 5-11% быстрее и в 3-4 раза экономнее по памяти. Но для 99% сайтов разница в 5% RPS незаметна. Для «ВебФронт» с 47 сайтами и суммарным трафиком 2000 RPS производительность не была проблемой — проблемой были сертификаты.

Nginx — если вам нужна максимальная производительность, fine-tuning, специфичные модули (Lua, njs). Caddy — если нужен простой, надёжный reverse proxy с автоматическим HTTPS.

Миграция «ВебФронт»: с Nginx на Caddy за 1 день

План миграции 47 сайтов:

  1. Установить Caddy рядом с Nginx (на порту 8443 для теста)
  2. Конвертировать nginx.conf → Caddyfile (скрипт на Python)
  3. Тестировать через /etc/hosts на локальной машине
  4. Переключить DNS (или остановить Nginx, запустить Caddy на 443)
# Конвертация: простой скрипт для типовых конфигов
# nginx: proxy_pass http://127.0.0.1:3000;
# caddy: reverse_proxy localhost:3000

# Итоговый Caddyfile для 47 сайтов — 180 строк
# vs Nginx — 47 файлов, ~2100 строк суммарно

# Проверка конфигурации
caddy validate --config /etc/caddy/Caddyfile

# Запуск
systemctl stop nginx
systemctl start caddy

# Caddy автоматически получит 47 сертификатов за ~3 минуты
journalctl -u caddy -f
# ... obtaining certificate for example1.com
# ... obtaining certificate for example2.com
# ... certificate obtained successfully

Результат через 3 месяца:

МетрикаNginx + certbotCaddy
Инциденты с сертификатами5 за полгода0
Строк конфигурации2100180
Время добавления нового сайта20 минут2 минуты
Cron-задачи для обслуживания3 (certbot, logrotate, check)0

Часто задаваемые вопросы

Да, Caddy распространяется под Apache License 2.0 — полностью бесплатен для любого использования. Нет premium-версии или ограничений. Компания зарабатывает на Caddy Enterprise (коммерческая поддержка и доп. функции).

Да, через DNS challenge. Нужен DNS-провайдер, поддерживающий API (Cloudflare, Route53, DigitalOcean и др.). Добавьте DNS-модуль при сборке через xcaddy и укажите в Caddyfile: tls { dns cloudflare {env.CF_API_TOKEN} }.

Да, существует Caddy Ingress Controller для Kubernetes. Но он менее зрелый, чем Nginx Ingress или Traefik. Для Kubernetes лучше использовать Traefik или Nginx Ingress — у них больше функций и сообщество.

Да, через модуль caddy-ratelimit. Установка: xcaddy build --with github.com/mholt/caddy-ratelimit. Конфигурация: rate_limit { zone static { key static match { path / } } distributed window 1m events 100 }.

Если у вас 50,000+ RPS и каждый процент производительности важен — оставайтесь на Nginx. Если у вас типичный веб-проект с нагрузкой до 10,000 RPS — Caddy упростит жизнь без заметной потери производительности.

Нужна помощь с внедрением?

Настроим, оптимизируем и возьмём на поддержку вашу инфраструктуру. 15+ лет опыта, 8 серверов Dell Xeon в дата-центре МТС.

📞 Связаться с нами

Комментарии 0

Оставить комментарий

6 + 4 =