Оба запускаются практически на любом VPS начального уровня, оба терминируют TLS, оба легко встают перед вашим Next.js-приложением или статическим сайтом. Вопрос никогда не стоит как «какой веб-сервер лучше». Вопрос - какой из них стоит вам меньше времени и боли именно в вашем конкретном сетапе self-hosting. Вот этот трейд-офф, честно разложенный для человека, который поднимает свой первый сервер, а не для платформенной команды.
Где Caddy выигрывает безоговорочно: автоматический HTTPS
Флагманская фича Caddy - не маркетинг, и именно она экономит больше всего времени соло-оператору. Когда Caddy знает домен, который обслуживает, он выпускает TLS-сертификат у публичного ACME CA - например Let’s Encrypt или ZeroSSL, - сам продлевает его и автоматически делает редирект HTTP на HTTPS: без дополнительной конфигурации и отдельных инструментов.[1] Документация Caddy называет его первым веб-сервером, где HTTPS автоматический и включён по умолчанию.[1]
Рабочий HTTPS-сайт в Caddy выглядит так:
example.com {
reverse_proxy 127.0.0.1:3000
}
Укажите A/AAAA-запись example.com на сервер, откройте порты 80 и 443 - и Caddy сам сделает выпуск сертификата, продление и редирект HTTP на HTTPS.[1]
Nginx не хуже в TLS - он просто не автоматический. Жизненный цикл сертификата вы управляете сами, через Certbot. Путь certbot --nginx - это рукопожатие из двух шагов: Certbot получает сертификат, а затем изменяет ваш конфиг сервера Nginx, чтобы установить его и настроить автоматическое продление по расписанию.[2] Плагин nginx работает в большинстве конфигураций, автоматизирует и получение, и установку, и поддерживает откат с помощью certbot --nginx rollback, но он правит ваш конфиг, и документация рекомендует сделать бэкап перед запуском.[2]
Практическая разница: с Nginx + Certbot HTTPS - это повторяемый процесс, за которым иногда нужно приглядывать; с Caddy - это поведение по умолчанию. Для одного VPS, где вам просто нужна иконка замка и чтобы больше никогда об этом не думать, Caddy экономит и время первой настройки, и каждое будущее «почему у меня протух сертификат» в полночь. Nginx + cron для certbot renew делает то же самое, но рутина остаётся на вас.
Конфиг: Caddyfile против nginx.conf
Здесь видно различие в философии. Caddy использует Caddyfile - компактный декларативный формат, где адрес сайта идёт первым, за ним - директивы, а встроенные фичи делают счастливый путь коротким.[3] Nginx использует блоки директив в nginx.conf и конфигах сайтов, где почти всё - включая разумные заголовки и настройки TLS - вы включаете сами.
Один и тот же reverse proxy на каждом из них:
# Caddyfile
api.example.com {
reverse_proxy /api/* 127.0.0.1:8000
file_server
}
# nginx.conf (site block)
server {
listen 80;
server_name api.example.com;
location /api/ {
proxy_pass http://127.0.0.1:8000;
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;
}
}
Caddyfile даёт вам HTTPS бесплатно, поэтому вы пишете прокси и идёте дальше. В Nginx-блоке проброс заголовков нужно добавлять руками - привычка, которая имеет значение, потому что без X-Forwarded-Proto приложение за TLS с радостью строит http://-редиректы. Если вам уже комфортно писать server-блоки Nginx (а полный укреплённый конфиг мы отдельно разобрали в гайде Nginx reverse proxy config), ничего из этого не сложно - просто больше набора текста на каждый сайт.
У краткости Caddy есть и реальная цена: Caddyfile - это отдельная, со своей философией абстракция. Если нужно поведение, которое в неё не ложится чисто, вы опускаетесь ниже уровня Caddyfile и работаете с JSON-конфигом - переключение контекста, которого в Nginx почти не бывает, потому что конфиг и есть «тот самый конфиг».
Производительность: будем честны
Коротко: на нагруженной машине Nginx, как правило, быстрее на чистой раздаче статики и на простом reverse-proxy, и обычно использует меньше памяти при этом. Это консенсус сообщества и инженерная практика, и не просто так: Nginx - C-программа, заточенная под высокую конкурентность, за два десятилетия закалки, тогда как Caddy - Go-бинарник с другими трейд-оффами в пользу расширяемости и безопасности.
Мы сознательно не приводим тут цифры бенчмарков. Мы не замеряли Caddy против Nginx на своих арендованных аккаунтах, и по нашему стандарту источников не публикуем цифры, которые не можем подкрепить реальным замером. Относитесь с подозрением к любому конкретному числу вроде «X запросов/с у Caddy против Y у Nginx» из блог-поста, если автор не показывает методику теста. По опыту и на практике на нагруженном VPS Nginx выигрывает гонку пропускной способности; для side project, справляющегося с парой сотен запросов в секунду, это не имеет значения.
Зато Caddy даёт конкретные операционные плюсы, которые не про скорость: он поставляется как статически скомпилированный бинарник без зависимостей от runtime-библиотек - документация Caddy отмечает, что ему в целом не нужен даже libc, - а написанный на Go, он не подвержен классу C-ошибок безопасности памяти, которые исторически били Nginx и другие C-серверы.[4] Это реальный аргумент, а не маркетинг: меньше движущихся частей и безопасные по умолчанию дефолты чего-то стоят на сервере, которым вы управляете в одиночку.
Фичи, которые реально всплывают в self-hosting
Rate limiting. В Nginx он встроен через ngx_http_limit_req_module - ограничитель по схеме «leaky bucket», ключуемый по чему угодно, обычно по IP клиента, с shared-memory зонами и контролем burst/nodelay.[5]
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
}
}
У Caddy, что важно, нет rate limiting в базовом бинарнике. Есть зарегистрированный модуль rate_limit (http.handlers.rate_limit, из комьюнити-проекта), но он явно не входит в Caddy из коробки - его нужно собрать через xcaddy или выбрать на странице загрузки.[6] Так что боль, которая в Nginx решается одной директивой, в Caddy требует пересборки. Если вам реально нужно защищаться от злоупотреблений - это веский аргумент в пользу Nginx.
Балансировка нагрузки и health checks. Оба умеют несколько апстримов. Nginx группирует серверы в блоке upstream со взвешенным round-robin по умолчанию, per-server max_fails / fail_timeout для пометки мёртвого пира и backup-серверами для фейловера.[7]
upstream backend {
server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
}
server {
location / {
proxy_pass http://backend;
}
}
reverse_proxy в Caddy делает то же самое с несколькими апстримами, плюс явные health checks через health_uri и health-заголовки.[8]
example.com {
reverse_proxy node1:80 node2:80 {
health_uri /health
fail_duration 30s
max_fails 3
}
}
Одно честное уточнение про Nginx здесь: настоящие активные периодические health checks (директива health_check) - это часть коммерческой подписки, а не open-source сборки.[9] Open-source Nginx даёт пассивный фейловер - пометить пир мёртвым только когда запросы к нему начали падать. Для single-VPS self-hosting редко нужно больше.
WebSockets и SSE. Оба их нормально проксируют. Nginx требует явных HTTP/1.1 + Upgrade-заголовков и настройки proxy_read_timeout, чтобы простывшие сокеты не умирали; Caddy делает апгрейд нативно и почти без церемоний. В Caddy это ощущается бесплатным; в Nginx вы один раз пишете upgrade-блок и больше к нему не возвращаетесь.
Экосистема и расширяемость
Суперсила Nginx - его плагинный мир, особенно OpenResty / Lua-скриптинг, который позволяет делать сложные манипуляции с запросами, не выходя из сервера. Если ваше хобби перерастёт во что-то с нетривиальной логикой на запрос (auth, кэширование, shaping трафика), экосистема Nginx на десятилетия вглубь и проверена боем. Цена - теперь вы держите C-сервер, возможно, с кастомной сборкой.
Расширяемость Caddy на бумаге чище - это Go, и плагины это Go-модули, которые вы компилируете на этапе сборки, поэтому всё это один статический бинарник.[4] Для большинства селф-хостеров это значит меньше зависимостей, чем полный стек Nginx + Lua, легче апгрейд («заменил бинарник») и меньше поверхность атаки. Caddy в Docker работает так же, как Nginx, оба полноценно представлены в репозиториях дистрибутивов - тут ничья.
Так когда что выбирать?
Выбирайте Caddy, когда: это side project или несколько личных сервисов на одном VPS; вам нужно, чтобы TLS просто работал; вы отдаёте что-то с одним апстримом и не нужна хитрая логика по location-ам; вы цените один бинарник и безопасные по умолчанию дефолты; или вам проще провести вечер за написанием приложения, чем за конфигом сервера.
Выбирайте Nginx, когда: вы уже встроены в Nginx-стек или знаете его наизусть; вы гонитесь за максимальной пропускной способностью статики/RPS на нагруженной машине; вам нужен встроенный rate limiting; вы планируете нетривиальную логику запросов (OpenResty / Lua); или вы тянете несколько сервисов и у вас уже есть подход с шаблонами сайтов.
Есть и прагматичный ответ посередине, к которому приходит много селф-хостеров: Nginx фронтует всё (потому что он быстрый и вы его знаете), а сертификат на автоматическом продлении через Certbot рулит - либо Caddy, если вы правда не хотите больше думать о сертификатах. Оба варианта абсолютно разумны. Неразумно делать вид, что один из них универсально лучше.
Источники
- Caddy - Automatic HTTPS (HTTPS по умолчанию, ACME-выпуск, автопродление, редирект HTTP на HTTPS). https://caddyserver.com/docs/automatic-https - checked 2026-10-17
- Certbot - User Guide, использование плагинов (плагин nginx получает и устанавливает, правит конфиг сервера, rollback). https://eff-certbot.readthedocs.io/en/stable/using.html - checked 2026-10-17
- Caddy - Caddyfile quick-start (декларативный формат, адрес сайта первым). https://caddyserver.com/docs/quick-starts/caddyfile - checked 2026-10-17
- Caddy - Features (статический бинарник, без libc, написан на Go, безопасность памяти). https://caddyserver.com/features - checked 2026-10-17
- nginx - Module ngx_http_limit_req_module (rate limiting через схему leaky bucket). https://nginx.org/en/docs/http/ngx_http_limit_req_module.html - checked 2026-10-17
- Caddy - Module http.handlers.rate_limit (не входит в Caddy по умолчанию, ставится через xcaddy). https://caddyserver.com/docs/modules/http.handlers.rate_limit - checked 2026-10-17
- nginx - Module ngx_http_upstream_module (взвешенный round-robin, max_fails, fail_timeout, backup). https://nginx.org/en/docs/http/ngx_http_upstream_module.html - checked 2026-10-17
- Caddy - директива reverse_proxy (несколько апстримов, health check через health_uri). https://caddyserver.com/docs/caddyfile/directives/reverse_proxy - checked 2026-10-17
- nginx - Module ngx_http_upstream_hc_module (активный
health_check- часть коммерческой подписки). https://nginx.org/en/docs/http/ngx_http_upstream_hc_module.html - checked 2026-10-17