Обратно към блога
Август 19, 2026Ръководства

Как да инсталирате уеб сървър Caddy с автоматичен HTTPS

Инсталирайте Caddy на Ubuntu от официалното хранилище, напишете Caddyfile за статични сайтове и обратни проксита, разберете автоматичните сертификати, systemd, логовете и обичайните грешки при миграция от Nginx.

Как да инсталирате уеб сървър Caddy с автоматичен HTTPS

Caddy е уеб сървър, който по подразбиране получава и подновява сертификати TLS. За малък VPS с един-два домейна това маха цял клас таймери Certbot и фрагменти Nginx. Езикът за конфигурация (Caddyfile) е кратък. Обратен прокси, gzip и HTTP/2 са обикновени функции, не уикенд с допълнителни модули.

Nginx все още е правилният избор в някои екипи: вече имате изпитани в бой конфигове или ви трябва много специфичен модул. Това ръководство е за другия чест случай — искате HTTPS, който работи на свеж VPS на Hiddence, без да наизустявате include. Ще инсталираме Caddy от официалното apt хранилище, ще обясним как говори с Let's Encrypt, ще сервираме статичен сайт, ще проксираме локално приложение, ще хостваме няколко домейна, ще погледнем логовете и обичайните битки за порт 80 с Apache или стар Nginx.

Кога Caddy пасва добре

Автоматичният HTTPS е заглавието, но ежедневната печалба е по-малко движещи се части. Caddy слуша на 80 и 443, пренасочва HTTP към HTTPS и пази сертификатите в своя каталог с данни. Все пак ви трябва домейн към VPS. Все пак не бива да чупите ACME (защитна стена 80/tcp, никой друг процес да не краде :80). Wildcard сертификатите искат модул на DNS доставчик — това е по-дълъг път от сертификат за един хост.

  • Автоматично HTTP→HTTPS и подновяване на сертификат
  • Четим Caddyfile вместо дълги блокове server
  • Способен обратен прокси за Node, Python, PHP-FPM (с допълнителен конфиг) или бекендове Docker
  • HTTP/2 и съвременни подразбиращи се TLS без таблица с шифри
  • Unit systemd от официалния пакет

Изисквания

Домейнът трябва да се резолва към този VPS, преди Caddy да докаже ACME HTTP-01. Ако DNS още се разпространява, Caddy ще се провали при издаване и ще опитва отново; изглежда като „Caddy е счупен“, а е само DNS. Спрете Apache или Nginx първо, ако държат 80/443.

  • Ubuntu 22.04 или 24.04
  • A запис на домейна към IP на VPS (и AAAA, ако ползвате IPv6)
  • Портове 80 и 443 свободни и разрешени в защитната стена
  • Root или sudo

Стъпка 1. Инсталирайте Caddy от официалното хранилище

Не инсталирайте случаен стар Caddy от подразбиращия се universe на Ubuntu, ако искате актуални TLS и ACME. Проектът Caddy документира apt източник. След инсталацията съществува потребител caddy и услугата е включена.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install debian-keyring debian-archive-keyring apt-transport-https curl gpg

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 -y install caddy

caddy version
systemctl status caddy --no-pager

Стъпка 2. Първи Caddyfile — статичен сайт

Подразбиращият се Caddyfile е /etc/caddy/Caddyfile. Сменете го със своя домейн. Caddy ще опита да вземе сертификат веднага щом се зареди конфигът, ако името на хоста не е localhost. Файловете на сайта сложете в каталог, четим от потребителя caddy (често права в стил www-data, но пакетът ползва потребител caddy).

bash
mkdir -p /var/www/example
echo '<h1>It works</h1>' > /var/www/example/index.html
chown -R caddy:caddy /var/www/example

cat >/etc/caddy/Caddyfile <<'EOF'
example.com {
    root * /var/www/example
    file_server
    encode gzip
}
EOF

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

# Watch issuance:
journalctl -u caddy -f

Стъпка 3. Обратен прокси към локално приложение

Ако Gunicorn, Node или Docker слуша на 127.0.0.1:8000, Caddy трябва да е единственият публичен процес. Директивата reverse_proxy предава Host и X-Forwarded-* разумно за повечето приложения. Ако приложението генерира абсолютни HTTP URL, задайте доверения прокси / флагове HTTPS в самото приложение (Django SECURE_PROXY_SSL_HEADER, Express trust proxy и т.н.).

bash
app.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8000
}

# Several hosts in one file are normal:
# blog.example.com {
#     root * /var/www/blog
#     file_server
# }

Стъпка 4. Защитна стена и systemd

Разрешете 80 и 443. Unit на Caddy е caddy.service; reload стига след редакции на Caddyfile, ако процесът е здрав. Ако сменяте променливи на средата за DNS приставка, пълният рестарт е по-ясен. Сертификатите по подразбиране лежат под /var/lib/caddy/.local/share/caddy/ — включете този път в копията, ако ви пука за лимити при преинсталация.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

systemctl enable --now caddy
systemctl reload caddy

# Backup cert storage (path may vary slightly by version):
ls -la /var/lib/caddy/

Стъпка 5. Логове, компресия и заглавки

Логовете за достъп помагат, когато бот удря път или дебъгвате 404. Можете да логвате по сайт. Добавяйте заглавки за сигурност, ако хоствате браузърно приложение; не копирайте огромен пакет заглавки без да разбирате HSTS (веднъж зададете дълъг max-age, браузърите го помнят).

bash
example.com {
    root * /var/www/example
    file_server
    encode gzip
    log {
        output file /var/log/caddy/example.log
    }
    header {
        X-Content-Type-Options nosniff
        Referrer-Policy no-referrer-when-downgrade
        -Server
    }
}

mkdir -p /var/log/caddy
chown caddy:caddy /var/log/caddy
systemctl reload caddy

Стъпка 6. PHP и други допълнения

Caddy умее да говори с PHP-FPM чрез директивата php_fastcgi. Това стига на много WordPress или Laravel хостове, но все пак трябва инсталиран php-fpm и път до сокет, който съвпада. Ако вече имате идеален PHP конфиг в Nginx, миграцията за една вечер е по желание — Caddy блести повече на обратен прокси + статика + автоматичен TLS.

bash
example.com {
    root * /var/www/example
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}

# Confirm FPM is running:
systemctl status php8.3-fpm

Миграция от Nginx без изненади за престой

Спрете Nginx преди да стартирате Caddy, иначе ще се бият за 80/443. Намалете TTL на DNS ден по-рано, ако местите и IP. Тествайте с curl --resolve, за да удряте новия VPS преди да смените A записа. Дръжте конфиговете на Nginx в git седмица при нужда от връщане.

  • systemctl stop nginx && systemctl disable nginx
  • Инсталирайте Caddy, валидирайте Caddyfile, стартирайте Caddy
  • curl -I --resolve example.com:443:NEW_IP https://example.com
  • Едва тогава сменете DNS, ако IP е ново
  • Издаването е автоматично; не пускайте и Certbot срещу същото име на хост

Отстраняване на проблеми

Провалите на ACME почти винаги са DNS, защитна стена или друга услуга на порт 80. Редовете в лога на Caddy споменават tls.obtain. Ако сайтът работи по HTTP, но не по HTTPS, издаването никога не е завършило. Ако виждате твърде много сертификати, ударихте лимитите на Let's Encrypt — при тестове ползвайте staging CA, не продукция.

  • validate се проваля: синтаксис на Caddyfile, липсваща скоба
  • permission denied на root: chown caddy за каталога на сайта
  • bind: address already in use — ss -tulpn | grep -E ':80|:443'
  • таймаут на сертификат: dig +short на домейна от VPS, ufw allow 80
  • 502 reverse_proxy: бекендът е паднал или проксирахте към localhost от мрежа на контейнери неправилно

Бележки по сигурността

Подразбиращите се TLS на Caddy са консервативни. Вашата работа е сигурността на приложението и SSH. Не включвайте администраторското API на Caddy на публичен интерфейс. Подразбиращата се администраторска крайна точка е локална; оставете я така. Ако вземате Caddyfile от интернет, четете всеки matcher — фрагмент, който reverse_proxies /* към вътрешен IP, може да стане отворен прокси.

  • Не излагайте администраторското API
  • Дръжте пакета обновен
  • HSTS едва когато сте сигурни, че HTTPS работи за всички имена на хостове
  • Разделете тестови и продуктови имена, за да пазите лимитите ACME

Съвети

  • caddy fmt --overwrite /etc/caddy/Caddyfile държи файла четим
  • Ползвайте import фрагменти, когато имате много сходни сайтове
  • В Docker е често образът caddy:alpine с монтиран Caddyfile
  • Wildcard сертификатите искат DNS модул и API токен — пазете токена
  • Четете journalctl -u caddy, преди да препишете целия файл

Caddy на VPS е: официален пакет, кратък Caddyfile, отворени 80/443, DNS вече сочи към сървъра и reload на systemd след редакции. Ползвайте го като сървър за статични файлове или като обратен прокси пред Gunicorn, Node или Docker. Автоматичният HTTPS работи, когато ACME може да отговори на порт 80; ако издаването се провали, поправете DNS и конфликтите на портове, преди да обвините Caddy. Копирайте /var/lib/caddy, ако често преинсталирате.