Cat

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

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

Реклама

Icon Link
Полезные инструменты proDream 15 Август 2024 Просмотров: 286

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

Автор

    Нет комментариев

    Реклама