Skip to content

Использование Caddy

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

Основные возможности

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

  • Автоматическое получение и обновление SSL-сертификатов
  • Поддержка Let's Encrypt из коробки
  • HTTP/2 и HTTP/3 поддержка

2. Простая конфигурация

  • Caddyfile — человекочитаемый формат конфигурации
  • JSON API для динамической конфигурации
  • Горячая перезагрузка конфигурации

3. Модульная архитектура

  • Расширяемость через модули
  • Встроенные директивы для большинства задач
  • Поддержка кастомных модулей

4. Высокая производительность

  • Написан на Go для максимальной производительности
  • Минимальное потребление ресурсов
  • Поддержка современных протоколов

Установка Caddy

Ubuntu/Debian

bash
# Установка через официальный репозиторий
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

CentOS/RHEL/Fedora

bash
# Установка через dnf/yum
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
sudo dnf install caddy

macOS

bash
# Установка через Homebrew
brew install caddy

# Или через MacPorts
sudo port install caddy

Windows

powershell
# Установка через Chocolatey
choco install caddy

# Или через Scoop
scoop install caddy

Docker

bash
# Запуск Caddy в Docker
docker run -d -p 80:80 -p 443:443 -v $PWD/Caddyfile:/etc/caddy/Caddyfile caddy:2

Проверка установки

bash
# Проверка версии
caddy version

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

# Запуск с конфигурацией
caddy run --config /path/to/Caddyfile

Базовые возможности веб-сервера

Статический файловый сервер

caddyfile
# Простой статический сервер
:80 {
    root * /var/www/html
    file_server
}

Сервер с автоматическим HTTPS

caddyfile
# Автоматический HTTPS для домена
example.com {
    root * /var/www/html
    file_server
}

Обработка PHP

caddyfile
# PHP через FastCGI
example.com {
    root * /var/www/html
    php_fastcgi unix//var/run/php/php8.1-fpm.sock
    file_server
}

Обработка Python

caddyfile
# Python через WSGI
example.com {
    root * /var/www/html
    reverse_proxy localhost:8000
}

Примеры конфигурации

Простой файловый сервер

caddyfile
# Базовый статический сервер
:80 {
    root * /var/www/html
    file_server
    
    # Логирование
    log {
        output file /var/log/caddy/access.log
    }
    
    # Сжатие
    encode gzip
    
    # Кэширование статических файлов
    header Cache-Control "public, max-age=31536000" {
        path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg
    }
}

Сервер с обработкой PHP

caddyfile
# PHP сайт с автоматическим HTTPS
example.com {
    root * /var/www/html
    
    # PHP обработка
    php_fastcgi unix//var/run/php/php8.1-fpm.sock
    
    # Статические файлы
    file_server
    
    # Безопасность
    header {
        # Защита от XSS
        X-Content-Type-Options nosniff
        X-Frame-Options DENY
        X-XSS-Protection "1; mode=block"
        
        # HSTS
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }
    
    # Ограничение размера загружаемых файлов
    request_body {
        max_size 10MB
    }
}

Обработка Python приложений

caddyfile
# Python WSGI приложение
api.example.com {
    reverse_proxy localhost:8000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Proto {scheme}
    }
    
    # CORS для API
    header Access-Control-Allow-Origin "*"
    header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    header Access-Control-Allow-Headers "Content-Type, Authorization"
}

Ограничение доступа к сайту

Базовая HTTP аутентификация

caddyfile
# Защита паролем
example.com {
    root * /var/www/html
    file_server
    
    basicauth {
        admin $2a$14$hash_here
        user  $2a$14$another_hash
    }
}

Ограничение по IP

caddyfile
# Доступ только с определенных IP
example.com {
    root * /var/www/html
    file_server
    
    @allowed {
        remote_ip 192.168.1.0/24
        remote_ip 10.0.0.0/8
    }
    
    handle @allowed {
        file_server
    }
    
    handle {
        respond "Access denied" 403
    }
}

Ограничение по времени

caddyfile
# Доступ только в рабочее время
example.com {
    root * /var/www/html
    file_server
    
    @workhours {
        time 09:00-18:00
    }
    
    handle @workhours {
        file_server
    }
    
    handle {
        respond "Site available 9AM-6PM" 503
    }
}

Настройка реверс-прокси

Простой реверс-прокси

caddyfile
# Проксирование на бэкенд
api.example.com {
    reverse_proxy localhost:3000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
    }
}

Балансировка нагрузки

caddyfile
# Балансировка между несколькими серверами
api.example.com {
    reverse_proxy {
        to localhost:3000
        to localhost:3001
        to localhost:3002
        
        # Алгоритм балансировки
        lb_policy round_robin
        
        # Проверка здоровья
        health_uri /health
        health_interval 30s
        health_timeout 5s
    }
}

Прокси с SSL терминацией

caddyfile
# SSL терминация для бэкенда
backend.example.com {
    reverse_proxy https://internal-server:8443 {
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

Продвинутые настройки

Множественные сайты

caddyfile
# Несколько сайтов на одном сервере
example.com {
    root * /var/www/example
    file_server
}

api.example.com {
    reverse_proxy localhost:3000
}

admin.example.com {
    root * /var/www/admin
    file_server
    
    basicauth {
        admin $2a$14$hash_here
    }
}

Поддомены с автоматическим HTTPS

caddyfile
# Автоматические поддомены
*.example.com {
    root * /var/www/{labels.1}
    file_server
    
    # Логирование по поддоменам
    log {
        output file /var/log/caddy/{labels.1}.log
    }
}

Настройка кэширования

caddyfile
# Кэширование с Redis
example.com {
    root * /var/www/html
    file_server
    
    cache {
        ttl 1h
        backend redis {
            host localhost:6379
        }
    }
}

Мониторинг и метрики

caddyfile
# Включение метрик
:2019/metrics {
    prometheus
}

# Логирование в JSON
example.com {
    root * /var/www/html
    file_server
    
    log {
        output file /var/log/caddy/access.json
        format json
    }
}

Автоматизация и скрипты

Скрипт запуска Caddy

bash
#!/bin/bash
# start_caddy.sh

CADDYFILE="/etc/caddy/Caddyfile"
LOG_FILE="/var/log/caddy/caddy.log"
PID_FILE="/var/run/caddy.pid"

# Проверка конфигурации
caddy validate --config $CADDYFILE

if [ $? -eq 0 ]; then
    echo "Configuration is valid. Starting Caddy..."
    caddy run --config $CADDYFILE --pidfile $PID_FILE --logfile $LOG_FILE
else
    echo "Configuration error. Please check your Caddyfile."
    exit 1
fi

Скрипт перезагрузки конфигурации

bash
#!/bin/bash
# reload_caddy.sh

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

if [ $? -eq 0 ]; then
    # Перезагрузка конфигурации
    caddy reload --config /etc/caddy/Caddyfile
    echo "Caddy configuration reloaded successfully"
else
    echo "Configuration error. Reload aborted."
    exit 1
fi

Systemd сервис

ini
# /etc/systemd/system/caddy.service
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=www-data
Group=www-data
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=1048576
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

Мониторинг и логирование

Настройка логирования

caddyfile
# Детальное логирование
{
    log {
        level INFO
        output file /var/log/caddy/caddy.log {
            roll_size 100mb
            roll_keep 5
            roll_keep_for 720h
        }
    }
}

example.com {
    root * /var/www/html
    file_server
    
    log {
        output file /var/log/caddy/access.log
        format single_field common_log
    }
}

Мониторинг производительности

caddyfile
# Включение метрик Prometheus
:2019/metrics {
    prometheus
}

# Профилирование
:2019/debug/pprof {
    pprof
}

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

Q: Как автоматически получить SSL сертификат?

A: Caddy автоматически получает SSL сертификаты для всех доменов в конфигурации. Просто укажите домен в Caddyfile:

caddyfile
example.com {
    root * /var/www/html
    file_server
}

Q: Как настроить Caddy для работы с PHP?

A: Используйте директиву php_fastcgi:

caddyfile
example.com {
    root * /var/www/html
    php_fastcgi unix//var/run/php/php8.1-fpm.sock
    file_server
}

Q: Как настроить реверс-прокси для Node.js приложения?

A: Используйте директиву reverse_proxy:

caddyfile
api.example.com {
    reverse_proxy localhost:3000
}

Q: Как ограничить доступ к сайту по IP?

A: Используйте матчеры и обработчики:

caddyfile
example.com {
    @allowed {
        remote_ip 192.168.1.0/24
    }
    
    handle @allowed {
        root * /var/www/html
        file_server
    }
    
    handle {
        respond "Access denied" 403
    }
}

Q: Как настроить балансировку нагрузки?

A: Используйте несколько адресов в reverse_proxy:

caddyfile
api.example.com {
    reverse_proxy {
        to localhost:3000
        to localhost:3001
        to localhost:3002
    }
}

Q: Как включить сжатие gzip?

A: Используйте директиву encode:

caddyfile
example.com {
    root * /var/www/html
    file_server
    encode gzip
}

Q: Как настроить кэширование статических файлов?

A: Используйте заголовки кэширования:

caddyfile
example.com {
    root * /var/www/html
    file_server
    
    header Cache-Control "public, max-age=31536000" {
        path *.css *.js *.png *.jpg *.jpeg *.gif *.ico
    }
}

Q: Как перезагрузить конфигурацию без перезапуска?

A: Используйте команду caddy reload:

bash
caddy reload --config /etc/caddy/Caddyfile

Q: Как настроить логирование в JSON формате?

A: Используйте форматтер JSON:

caddyfile
{
    log {
        format json
        output file /var/log/caddy/access.json
    }
}

Q: Как настроить Caddy для работы с WebSocket?

A: WebSocket поддерживается автоматически в reverse_proxy:

caddyfile
ws.example.com {
    reverse_proxy localhost:8080
}

Q: Как настроить CORS для API?

A: Используйте заголовки CORS:

caddyfile
api.example.com {
    reverse_proxy localhost:3000
    
    header Access-Control-Allow-Origin "*"
    header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    header Access-Control-Allow-Headers "Content-Type, Authorization"
}

Q: Как настроить rate limiting?

A: Используйте директиву rate_limit:

caddyfile
api.example.com {
    rate_limit {
        zone static {
            key {remote_host}
            events 100
            window 1m
        }
    }
    
    reverse_proxy localhost:3000
}

Q: Как настроить редирект с HTTP на HTTPS?

A: Caddy автоматически перенаправляет HTTP на HTTPS, но можно настроить явно:

caddyfile
http://example.com {
    redir https://example.com{uri} permanent
}

https://example.com {
    root * /var/www/html
    file_server
}

Q: Как настроить Caddy для работы с Docker?

A: Используйте Docker Compose:

yaml
version: '3.8'
services:
  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./html:/var/www/html
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

Заключение

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

Ключевые преимущества:

  • Автоматический HTTPS из коробки
  • Простая конфигурация через Caddyfile
  • Высокая производительность и надежность
  • Модульная архитектура для расширения функциональности
  • Современные протоколы HTTP/2 и HTTP/3

Для получения дополнительной информации обратитесь к официальной документации Caddy.