Appearance
Использование 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 caddyCentOS/RHEL/Fedora
bash
# Установка через dnf/yum
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
sudo dnf install caddymacOS
bash
# Установка через Homebrew
brew install caddy
# Или через MacPorts
sudo port install caddyWindows
powershell
# Установка через Chocolatey
choco install caddy
# Или через Scoop
scoop install caddyDocker
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
fiSystemd сервис
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/CaddyfileQ: Как настроить логирование в 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.