Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

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

Артур Акмалов
Артур Акмалов
Инженер по разработке
29 сентября 2023 г.
2462
8 минут чтения
Средний рейтинг статьи: 2.5

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) и т.п.

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

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

Image8

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

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 caddy

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

systemctl status caddy

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

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

caddy version

> v2.7.4

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

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

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

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

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

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

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

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

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

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Шапка</title>
</head>
<body>
    <header>
        <h1>Самый простой index файл для демо</h1>
    </header>
    <main>
        <h2>План чек-лист по Caddy</h2>
        <p>Сам ничего не придумал, поэтому пойдем по документации:</p>
        <ul>
            <li>DNS сделать</li>
            <li>Конфиг поменять</li>
            <li>сервер перезапустить</li>
            <li>пресс качат</li>
            <li>анжумания вечером</li>
        </ul>
        <img src="volk.jpg" alt="volchara">
    </main>
</body>
</html>

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

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

nano /etc/caddy/Caddyfile
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
    # Set this path to your site's directory.
    root * /usr/share/caddy


    # Enable the static file server.
 file_server
    # Another common task is to set up a reverse proxy:
    # reverse_proxy localhost:8080
    # Or serve a PHP site through php-fpm:
    # php_fastcgi localhost:9000
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile

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

caddy.akmalov.com {
    root * /var/www/html
    file_server
}

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

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

systemctl reload caddy

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

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

Запуск Caddy в docker-compose

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

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

systemctl stop caddy
apt remove caddy
apt install docker.io docker-compose

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

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

mkdir -p /srv/caddy/site
cp -r /var/www/html /srv/caddy/site
cp /etc/caddy/Caddyfile /srv/caddy/Caddyfile

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

version: '3.8'
services:
  caddy:
    image: caddy:2.7.4
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./site:/var/www/html

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

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

docker-compose up -d

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

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

caddy.akmalov.com {
   basicauth * {
        volk $2y$10$v8t9CqkLFEon3UTYKUsRs.8zhMMLFX5.9WyDERzd7ESRT75PICkiW
    }
    root * /var/www/html
    file_server

}

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

docker-compose restart

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

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

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

version: '3.8'
  caddy:
    image: caddy:2.7.4
    restart: always

    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./site:/var/www/html
  grafana:
    image: grafana/grafana:10.0.5-ubuntu
    container_name: grafana
  # ports:
    #  - 3000:3000
    environment:
      GF_SECURITY_ADMIN_USER: 'admin'
      GF_SECURITY_ADMIN_PASSWORD: 'volk'

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

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

caddy.akmalov.com {
    root * /var/www/html
    file_server
}
test.akmalov.com {
    reverse_proxy grafana:3000
}

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

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

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

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

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

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

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

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

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

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

nslookup test.akmalov.com

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

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

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

Заключение

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

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

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

test.akmalov.com

reverse_proxy grafana:3000

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

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

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону