Веб-сервер Caddy - Альтернатива NGINX и Apache

Веб-сервер Caddy - Альтернатива NGINX и Apache

Иван Ашихмин

Пост на сайте

Поддержать проект на Boosty

Поддержать проект в Telegram

Что первое приходит на ум при словах "веб-сервер"? Уверен, что большая часть из вас ответит: "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:

  1. www.pressanybutton.ru { ... }:
    • Этот блок указывает, что все запросы к поддомену www. должны быть перенаправлены на основной домен pressanybutton.ru. Директива redir выполняет это перенаправление с сохранением URI (строка символов, которая используется для идентификации ресурса в интернете).
  2. pressanybutton.ru { ... }:
    • Этот блок содержит конфигурацию для основного домена.
  3. encode { gzip }:
    • Включает сжатие контента с использованием алгоритма gzip, что позволяет уменьшить объем передаваемых данных и ускорить загрузку страниц.
  4. tls info@pressanybutton.ru:
    • Указывает Caddy использовать TLS и автоматически управлять сертификатами Let's Encrypt, используя указанный email для регистрации сертификатов.
  5. log { ... }:
    • Конфигурирует логирование. Здесь указано выводить логи на stdout (в консоль) и установить уровень логирования на WARN, чтобы показывать только предупреждения и ошибки.
  6. header { ... }:
    • Добавляет заголовок X-Content-Type-Options с параметром nosniff, что защищает от некоторых видов атак, связанных с MIME-типами.
  7. reverse_proxy web2:8000:
    • Настраивает проксирование запросов через Caddy к backend-сервису на web2:8000.
  8. handle_path /static/* { ... }:
    • Этот блок отвечает за обслуживание статических файлов.
    • root * /code/pressanybutton/static указывает корневую директорию, где находятся статические файлы.
    • file_server включает режим файлового сервера для раздачи этих файлов.
    • header Cache-Control "max-age=604800" устанавливает заголовок кэширования на стороне клиента сроком на одну неделю без повторной загрузки в течении этого срока.
  9. 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 станет отличным выбором.

Пост на сайте

Поддержать проект на Boosty

Поддержать проект в Telegram

Report Page