
Веб-сервер Caddy - Альтернатива NGINX и Apache
В этом посте познакомимся с веб-сервером Caddy, современной альтернативой NGINX и Apache с автоматическим получением сертификатов для сайта.
Все статьи

- 28 Ноябрь 2024 Бесплатный аналог ChatGPT на своём ПК Комментарии к посту
- 21 Ноябрь 2024 Python-проект в EXE-файл и обфускация кода Комментарии к посту
- 10 Октябрь 2024 Obsidian LiveSync - совместная работа над проектной документацией Комментарии к посту
- 15 Август 2024 Веб-сервер Caddy - Альтернатива NGINX и Apache Комментарии к посту
- 27 Март 2024 Создание резервных копий VPS на Яндекс Диск Комментарии к посту
- 06 Март 2024 Разворачивание Django-проекта на Replit Комментарии к посту
- 08 Февраль 2024 Разворачивание Django-проекта на PythonAnyWhere Комментарии к посту
- 29 Сентябрь 2023 Cpp FreeGPT WebUI - Бесплатный GPT на вашем сервере Комментарии к посту
- 22 Сентябрь 2023 Certbot - бесплатный SSL-сертификат для сайта Комментарии к посту
- 06 Сентябрь 2023 Полезные инструменты. Переключатель цветовой темы в Bootstrap5 Комментарии к посту
- 06 Сентябрь 2023 Полезные инструменты. Jazzmin - шаблон панели администратора Django Комментарии к посту
- 02 Август 2023 НЕ АКТУАЛЬНО! Бесплатный Chat-GPT4 на вашем ПК или сервере Комментарии к посту
Реклама

Что первое приходит на ум при словах "веб-сервер"? Уверен, что большая часть из вас ответит: "NGINX?" и будут правы. NGINX
— популярный и быстрый веб-сервер, но не NGINX'ом единым. Сегодня хочу познакомить вас с веб-сервером Caddy
.
Caddy
— это современный веб-сервер с простым и удобным конфигурационным синтаксисом, который автоматически управляет TLS-сертификатами, поддерживает проксирование, маршрутизацию, сжатие и другие функции "из коробки". Он также обладает встроенной поддержкой HTTP/2 и HTTP/3.
Преимущества Caddy
Caddy выделяется среди других веб-серверов по нескольким причинам:
- Простота в настройке: В отличие от NGINX или Apache, Caddy требует минимальной конфигурации для выполнения базовых задач. Многие функции, которые в других серверах требуют дополнительных модулей, в Caddy уже встроены.
- Автоматизация TLS: В посте "Certbot - бесплатный SSL-сертификат для сайта" мы получали сертификат самостоятельно и продлять его тоже приходилось вручную. Ключевое отличие Caddy от NGINX в том, что он автоматически создает сертификаты
Let's Encrypt
, продлевает их и управляет ими без необходимости ручного вмешательства. - Поддержка современных технологий: Caddy изначально поддерживает HTTP/2 и HTTP/3, что делает его отличным выбором для современных приложений с высокими требованиями к производительности.
Docker Compose сервис
Чтобы использовать Caddy с вашим проектом в Docker, его нужно добавить в docker-compose.yaml
файл:
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
- .:/code
Здесь мы указываем образ Caddy, открываем необходимые порты и монтируем директории для конфигурации и данных. Все просто и в целом ничего нового.
Caddyfile — Сердце Конфигурации
Затем в проекте создаем Caddyfile
— это файл с основной конфигурацией, аналог nginx.conf
из поста "Docker 8. Разворачивание Django-проекта в Docker compose". Давайте рассмотрим пример настройки:
www.pressanybutton.ru {
redir https://pressanybutton.ru{uri} permanent
}
pressanybutton.ru {
encode { gzip }
tls info@pressanybutton.ru
log {
output stdout
level WARN
}
header {
X-Content-Type-Options "nosniff"
}
reverse_proxy web2:8000
handle_path /static/* {
root * /code/pressanybutton/static
file_server
header Cache-Control "max-age=604800"
}
handle_path /media/* {
@invalid_referer {
not header Referer https://pressanybutton.ru/*
not header Referer ""
}
root * /code/pressanybutton/media
file_server
header Cache-Control "max-age=604800"
respond @invalid_referer "Traffic blocked" 403 {
close
}
}
}
Разберём каждую строчку Caddyfile:
www.pressanybutton.ru { ... }
:- Этот блок указывает, что все запросы к поддомену
www.
должны быть перенаправлены на основной доменpressanybutton.ru
. Директиваredir
выполняет это перенаправление с сохранением URI (строка символов, которая используется для идентификации ресурса в интернете).
- Этот блок указывает, что все запросы к поддомену
pressanybutton.ru { ... }
:- Этот блок содержит конфигурацию для основного домена.
encode { gzip }
:- Включает сжатие контента с использованием алгоритма
gzip
, что позволяет уменьшить объем передаваемых данных и ускорить загрузку страниц.
- Включает сжатие контента с использованием алгоритма
tls info@pressanybutton.ru
:- Указывает Caddy использовать TLS и автоматически управлять сертификатами
Let's Encrypt
, используя указанный email для регистрации сертификатов.
- Указывает Caddy использовать TLS и автоматически управлять сертификатами
log { ... }
:- Конфигурирует логирование. Здесь указано выводить логи на
stdout
(в консоль) и установить уровень логирования наWARN
, чтобы показывать только предупреждения и ошибки.
- Конфигурирует логирование. Здесь указано выводить логи на
header { ... }
:- Добавляет заголовок
X-Content-Type-Options
с параметромnosniff
, что защищает от некоторых видов атак, связанных с MIME-типами.
- Добавляет заголовок
reverse_proxy web2:8000
:- Настраивает проксирование запросов через Caddy к backend-сервису на
web2:8000
.
- Настраивает проксирование запросов через Caddy к backend-сервису на
handle_path /static/* { ... }
:- Этот блок отвечает за обслуживание статических файлов.
root * /code/pressanybutton/static
указывает корневую директорию, где находятся статические файлы.file_server
включает режим файлового сервера для раздачи этих файлов.header Cache-Control "max-age=604800"
устанавливает заголовок кэширования на стороне клиента сроком на одну неделю без повторной загрузки в течении этого срока.
handle_path /media/* { ... }
:- Этот блок отвечает за обработку запросов к медиа-файлам.
@invalid_referer { ... }
определяет условие, при котором запросы будут заблокированы, если они приходят с недопустимого источника (например, отсутствует заголовокReferer
). Данный параметр позволяет избежать так называемого "хотлинкинга", случая, когда изображения и медиа-файлы с сайта размещаются на сторонних сайтах, зачастую это "дорвеи" для генерации трафика с поисковых систем.root * /code/pressanybutton/media
указывает корневую директорию для медиа-файлов.respond @invalid_referer "Traffic blocked" 403 { close }
возвращает ответ с кодом403 Forbidden
и текстом "Traffic blocked" для запросов, которые не соответствуют условиям.
Примеры конфигураций:
Балансировка нагрузки.
Балансировка нагрузки — это критически важная задача для распределения трафика между несколькими серверами. Caddy позволяет легко настроить балансировку, используя встроенную поддержку различных алгоритмов распределения нагрузки.
Пример: Балансировка нагрузки с Caddy:
example.com {
tls email@example.com
reverse_proxy /api* {
to web1:8000 web2:8000 web3:8000
lb_policy round_robin
health_timeout 5s
health_interval 10s
}
}
Этот пример демонстрирует, как Caddy может распределять нагрузку между несколькими backend-серверами.
В примере используется политика балансировки round_robin
, означающая, что каждый запрос будет уходить на следующий сервер, проходя таким образом по кругу. Помимо round_robin
, есть и другие политики балансировки:
- round_robin — зацикленное равномерное распределение запросов по всем серверам.
- random — случайное распределение запросов между серверами.
- least_conn — отправка запроса серверу с наименьшим количеством активных соединений.
- first — всегда направляет запросы на первый доступный сервер в списке.
- ip_hash — привязка запросов к серверам на основе IP-адреса клиента.
- uri_hash — привязка запросов к серверам на основе URI запроса.
- header — распределение запросов на основе значения заголовка.
- cookie — привязка запросов к серверам на основе значения cookie.
Вместе с указанием политики балансировки, мы определяем проверку здоровья серверов. Директивы health_timeout
и health_interval
позволяют настроить, как часто и с каким таймаутом Caddy будет проверять состояние серверов. Это важно для того, чтобы автоматически исключать из списка серверы, которые временно недоступны.
Файловый сервер.
Caddy отлично подходит не только для проксирования и обслуживания динамического контента, но и для использования в качестве файлового сервера. Это может быть полезно, например, если вам нужно быстро организовать доступ к статическим файлам, таким как изображения, видео, архивы или документы.
Пример: Caddy как файловый сервер:
files.example.com {
root * /var/www/files
file_server browse
}
Сперва указываем корневую директорию на сервере, где хранятся файлы. В данном случае это /var/www/files
.
Затем ключевым словом file_server
включаем режим файлового сервера, который позволяет Caddy обслуживать файлы из указанной директории. Следующее ключевое слово browse
включает режим просмотра содержимого директории, что позволяет пользователям видеть список файлов и папок в директории, если они открывают корневой URL.
Этот режим полезен, если вы хотите предоставить доступ к файлам без необходимости создавать специальные страницы или интерфейсы. Пользователи смогут легко просматривать и загружать файлы напрямую через веб-интерфейс.
Заключение
В итоге, Caddy — это мощный, но при этом простой в использовании веб-сервер, который отлично подходит для быстрого развертывания сайтов и микросервисов. Если вам нужно быстро поднять защищенный TLS сайт или гибко маршрутизировать запросы, Caddy станет отличным выбором.
Arduinum628
18 января 2025 г. 19:23
Автоматизация TLS - боже мой это звучит как сказка)
Войдите чтобы добавить комментарий.