Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Caddy — простой и легкий reverse proxy

14161
8 минут чтения
Средний рейтинг статьи: 3.7

Caddy представляет собой обратный прокси-сервер (обратный прокси-сервер). Написанный на языке Go, это полностью бесплатный проект с открытым исходным кодом с лицензией Apache 2.0. 

Caddy поддерживает HTTP/2, HTTP и HTTPS, позволяет автоматически получать и обновлять сертификаты Let's Encrypt. Обладает кроссплатформенностью: можно установить на любую ОС, а также поддерживает разные архитектуры процессоров. Также Caddy можно использовать просто в Docker-контейнере.

Альтернативы Кэдди:

  1. Nginx (ТОП-1 в мире, большое сообщество, множество инструкций, выдерживает большую нагрузку, огромное количество функций и тонких настроек).
  2. Traefik (интересный проект, много интересных фишек для удобства и автоматизаций).

Основные особенности Caddy, на мой взгляд:

  • Самая простая и понятная настройка, легко читается и пишется конфигурационный файл, минималистичность.
  • Автоматическое получение и обновление SSL-сертификатов.
  • Использует HTTPS по умолчанию.
  • Настройка по API. Принимаем меры по настройке Caddy с помощью REST API запросов в JSON-формате. Хорошо подходит для настроек автоматизации и дает дополнительные возможности в конфигурации.
  • Плагины. Из коробки Caddy работает со звуковым набором, адаптером для работы прокси-сервера, но с помощью плагинов можно легко внедрить дополнительные функции. Например, авторизация страниц, интеграция с DNS-провайдерами (Cloudflare) и т.п.

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

Ознакомительный запуск

Для экспериментов я взял самый простой сервер на Timeweb Cloud c Ubuntu 22.04.

Image8

Установка по документации с официального сайта: 

    
    
    
    
    

Проверяю активность сервиса:

    

Изображение3

Проверка версии:

    

> v2.7.4

Для проверки откройте в браузере страницу по IP-адресу хоста:

Изображение2

Далее пошагово выполним предложенные рекомендации Caddy по настройке.

Шаг 1. Создать доменное имя и направить на адрес сервера

Создаю в DNS доменное имя 2 уровня: caddy.akmalov.com.

Указываю ему «белый» IP-адрес созданного сервера.

Шаг 2. Изменить путь и использовать свои статические файлы для отображения

Для создания своего index.html по указанному пути /var/www/html/.

Добавляю картинку volk.jpg:

    

Шаг 3. В конфигурации измените порт :80 на свое доменное имя

Открываю для редактирования структуру файла:

    
    

Удаляю все лишнее, чтобы конфиг выглядел следующим образом:

    

Шаг 4. Перезапустить Caddy

Перезапускаю с помощью команды:

    

Открываю браузер по доменному имени caddy.akmalov.com.

Страница сразу открывается по HTTPS с доверенным сертификатом — и все это в четырех строках схемы, в которых все минимально, красиво и понятно. 

Запуск Caddy в docker-compose

Допустим, нам нужно выделить сервис и перенаправить трафик.

Мне очень нравится использовать все в контейнерах, без установки дополнительных пакетов, зависимостей и запускать одной кнопкой. Поэтому удаляю сервис Caddy и устанавливаю Docker:

    

Для начала повторяю то же самое, что было выше, но уже использовалось в контейнере.

Создаю директорию по пути /srv/caddy и копирую туда статические файлы и конфигурацию файлов.

    

Создаю docker-compose.yml с такой конфигурацией:

    

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

После этого запускаю и проверяю:

    

Также хочу показать, как еще можно защитить страницу, используя BasicAuth и пару строк конфигурации.

Для этого отредактируем Caddyfile следующим образом, добавив Basicauth * {логин-пароль}:

    

Логин и пароль пользователя можно сгенерировать в консоли или воспользоваться онлайн-генераторами .htpasswd (алгоритм по умолчанию: bcrypt).

    

Теперь при открытии страницы появляются окна аутентификации.

Изображение7

Теперь в docker-compose подниму какой-нибудь сервис с веб-интерфейсом, например, Grafana.

    

Порты закомментированы, т.к. Grafana и Caddy присоединяются к одной группе и могут общаться по имени сервисов, внешний проброс портов не нужен. Если необходимо обращаться не только по доменному имени, но и по локальному IP-хостеру и порту, то нужно раскомментировать эти строки. 

Для сервиса Grafana создаю в DNS еще одно доменное имя второго уровня, например test.akmalov.com, и добавляю в конфигурацию Caddyfile:

    

Чтобы не запутаться, еще раз покажу структуру того, что получилось:

Изображение5

В директории сайта два файла:

  • index.html (главная страница сайта).
  • volk.jpg (картинка).

В docker-compose.yml поднимается два сервиса:

  • Кэдди для проксирования и получения сертификатов.
  • Grafana как отдельное веб-приложение.

Caddyfile (файл с конфигурацией) — через тома продаем внутренний контейнер по пути /etc/caddy/Caddyfile.

В формулировке таких правил:

  • caddy.akmalov.com  выдаем статические файлы из директории сайта.
  • test.akmalov.com — перенаправляем в Grafana.

Для проверки того, что новое доменное имя ведет на данном хосте, проверяем DNS-записи:

    

Если всё получится, можно проверить в браузере.

Проверка в браузере по доменному имени test.akmalov.com   — открывается страница входа в панель Grafana).

Изображение6

Используйте Caddy на серверах Timeweb Cloud

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

В этой статье я привел простейшие схемы для ознакомления, но в документации также можно почитать, например, про балансировку нагрузки для распределения трафика по разным хостам, а также добавление проверки работоспособности для проверки работоспособности хостов, как обрезать, добавить или изменить заголовки (заголовок) . ) в запросах и т.д.

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

Например , если на этой же облачной машине сервису мне потребовалось бы поднять только Grafana , сертификат получить и закрыть за прокси-сервером, тогда файл конфигурации Caddyfile выглядел бы так:

    

За две строки в источнике мы получаем полноценный прокси-сервер, с перенаправлением HTTP на HTTPS и автоматической генерацией SSL-сертификатов. Вот за это мне и нравится Кэдди. 

И напоследок — интересные и полезные материалы:

14161
8 минут чтения
Средний рейтинг статьи: 3.7
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server