Caddy

Материал из Slipenko.Wiki
Перейти к навигации Перейти к поиску

Web-сервер caddy

Что такое caddy?

Caddy — это веб-сервер с открытым исходным кодом с автоматическим HTTPS из коробки.

Среди основных особенностей можно выделить:

  • Простота настройки;
  • Автоматическое обновление сертификатов TLS;
  • Поддержка мультиядерности/мультипроцессорности;
  • Поддержка HTTP/1.1, HTTP/2, и HTTP/3 по умолчанию;
  • Возможность изменения конфигурации через API.

Установка caddy в ОС Альт

Стандартная установка

Предпочтительным способом установки является установка пакета caddy из репозитория:

$ su -
# apt-get update && apt-get install caddy

Продвинутая установка

Caddy поставляется как единый бинарный файл со статической линковкой. Поэтому, для того чтобы добавить дополнительные модули (плагины), необходимо выполнять повторную сборку Caddy.

Для сборки необходим Go версии 1.19 или новее. Установим его:

$ su -
# apt-get update && apt-get install go
# exit

Для удобной сборки, когда требуется добавить какие-то плагины, можно воспользоваться утилитой xcaddy. Установить xcaddy можно данной командой:

$ GOBIN=$HOME/bin go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

Сборка происходит с помощью команды xcaddy build, а плагины перечисляются с помощью --with. Соберём caddy с двумя плагинами на адаптеры конфигурации: nginx и yaml.

$ xcaddy build \
    --with github.com/caddyserver/nginx-adapter \
    --with github.com/abiosoft/caddy-yaml

После этого, в текущей директории появится бинарный файл caddy.

$ ./caddy version
v2.6.4 h1:2hwYqiRwk1tf3VruhMpLcYTg+11fCdr8S3jhNAdnPy8=

Далее сделаем такой трюк: установим пакет caddy, удалим его из базы rpm и заменим исполняемый файл /usr/bin/caddy на собранный только что. Эта процедура позволит воспользоваться преимуществами конфигурации по умолчанию, служебными файлами systemd и bash-комплектацией из официального пакета.

$ su -
# apt-get install caddy
# epm mark hold caddy
# cp -p /usr/bin/caddy /opt/caddy/caddy.default && cp /home/sysadmin/caddy /opt/caddy/caddy.custom
# chmod --reference=/usr/bin/caddy /opt/caddy/caddy.custom
# chown --reference=/usr/bin/caddy /opt/caddy/caddy.custom
# rm /usr/bin/caddy

Проверим работоспособность caddy и убедимся, что нужные адаптеры конфигурации добавлены:

$ caddy list-modules | grep adapters
caddy.adapters.caddyfile
caddy.adapters.nginx
caddy.adapters.yaml

Чтобы случайно не установить заново пакет caddy и не заменить собранный нами файл, можно выполнить данную команду:

# cat <<EOF | tee /etc/apt/preferences.d/forbid-caddy
Package: caddy
Pin: origin ""
Pin-Priority: 1001
EOF

После этого, пакет caddy не будет устанавливаться, т.к. "пустой" источник будет более приоритетным:

# apt-get install caddy
Чтение списков пакетов... Завершено
Построение дерева зависимостей... Завершено
Пакет caddy присутствует в базе данных, но не имеет доступной версии.
Как правило это означает, что хотя пакет упоминается в списке зависимостей,
он отсутствует в репозитории, был вытеснен, либо в sources.list нет адреса
репози�E: Для пакета caddy не найдено подходящего кандидата для установки

Управление службой

С использованием systemd

Пакет caddy в ОС Альт предоставляет две systemd службы:

  • caddy.service — если вы настроите Caddy с Caddyfile. Если вы предпочитаете использовать другой адаптер конфигурации или файл конфигурации JSON, вы можете переопределить команды ExecStart и ExecReload.
  • caddy-api.service — если вы настраиваете Caddy исключительно через его API. Эта служба использует параметр --resume, который запускает Caddy с использованием файла autosave.json, который сохраняется по умолчанию.

Управление данными службами возможно через стандартные команды systemctl.

Например, чтобы добавить caddy в автозагрузку и запустить прямо сейчас можно воспользоваться данной командой:

# systemctl enable --now caddy

Если вам нужно переключаться между службами, вам следует отключить и остановить предыдущую, прежде чем включать и запускать другую. Например, чтобы переключиться с сервиса caddy на сервис caddy-api:

# systemctl disable --now caddy
# systemctl enable --now caddy-api

По умолчанию, логи пишутся в journald. Чтобы их посмотреть можно воспользоваться данной командой:

# journalctl -eu caddy.service
  • -e - немедленно перейдите к концу журнал
  • -u - показывать логи только выбранного юнита

Без использования systemd

Также возможно использование caddy без systemd.

Для запуска сервера воспользуйтесь командой caddy run. Для запуска с стандартной конфигурацией, предоставляемой пакетом caddy добавьте --сonfig /etc/caddy/Caddyfile:

# caddy run --config /etc/caddy/Caddyfile

Данная команда запустит сервер в текущем терминале. Если необходимо запустить в фоне, можно воспользоваться командой caddy start.

Для выключения сервера воспользуйтесь командой caddy stop.

По остальным командам можно почитать в:

Настройка caddy

В ОС Альт конфигурация caddy расположена в /etc/caddy/Caddyfile.

По умолчанию главный файл конфигурации содержит строку import Caddyfile.d/*.caddyfile. Эта строка указывает на то, что caddy импортирует все файлы с расширением .caddyfile из директории /etc/caddy/Caddyfile.d/. Данная функциональность позволяет разделять конфигурации на отдельные файлы и упрощает организацию и поддержку конфигурации сервера.

Статический файловый сервер

Для создания статического файлового сервера необходимо использовать директиву file_server.

Пример минимальной конфигурации:

example.com {
    root * /var/www/html
    file_server
}

При этом будут обслуживаться все файлы в корневом каталоге. Если не используется index файл, то для просмотра списка файлов потребуется указать file_server browse.

Если необходимо скрыть какие-то файлы, то можно воспользоваться директивой hide:

example.com {
    root * /var/www/html
    file_server {
        hide .git
    }
}

Данная конфигурация скрывает все папки .git и их содержимое.

Если необходимо скрыть какие-то файлы конкретные файлы, то можно использовать переменную http.vars.root:

example.com {
   root * /var/www/html
   file_server {
      hide {http.vars.root}/file
   }
}

Данная конфигурация скрывает файл /var/www/html/file.

Reverse proxy

Для создания обратного прокси-сервера (reverse proxy) необходимо использовать директиву reverse_proxy.

Пример минимальной конфигурации:

example.com {
    reverse_proxy localhost:5000
}

Пример конфигурации, которая проксирует запросы, начинающиеся с /api/, и обеспечивает обслуживание статических файлов:

example.com {
    root * /var/www/html
    reverse_proxy /api/* localhost:5000
    file_server
}

Редирект с www. субдомена

Для редиректа в сервере caddy используется директива redir.

Пример конфигурации для редиректа с www. субдомена:

www.example.com {
    redir https://example.com{uri}
}

example.com {
}

Если необходимо сделать редирект для нескольких доменов, то можно воспользоваться переменными {labels.*}:

www.example-one.com, www.example-two.com {
    redir https://{labels.1}.{labels.0}{uri}
}

example-one.com, example-two.com {
}

Массив labels хранит части имени хоста, индексируемые с 0 с права (0=com, 1=example-one, 2=www).

Адаптер конфигурации

Адаптер конфигурации в Caddy — это плагин, который позволяет использовать различные форматы конфигурационных файлов для определения параметров сервера Caddy. Адаптеры конфигурации обеспечивают гибкость и удобство в выборе и использовании конфигурационных форматов, которые наиболее соответствуют вашим потребностям.

Caddy поддерживает несколько встроенных адаптеров конфигурации, а также предоставляет возможность создавать собственные адаптеры. Вот некоторые из встроенных адаптеров конфигурации, доступных в Caddy:

  1. Caddyfile: Это стандартный формат конфигурации Caddy. Он основан на простом текстовом формате и позволяет определить веб-сервер и его параметры в удобном для чтения виде. Пример Caddyfile:
    localhost:80 {
        root * /var/www/html
        file_server
    }
    
  2. JSON: Caddy также поддерживает конфигурацию в формате JSON. Это может быть полезно, если вы предпочитаете работать с JSON-файлами или если ваши инструменты автоматизации используют JSON-формат. Пример JSON-конфигурации:
    {
      "apps": {
        "http": {
          "servers": {
            "srv0": {
              "listen": [
                ":80"
              ],
              "routes": [
                {
                  "match": [
                    {
                      "host": [
                        "localhost"
                      ]
                    }
                  ],
                  "handle": [
                    {
                      "handler": "vars",
                      "root": "/var/www/html"
                    },
                    {
                      "handler": "file_server"
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    }
    
  3. YAML: Caddy также поддерживает конфигурацию в формате YAML. YAML-файлы обычно более читаемы и удобны в использовании, особенно для людей, знакомых с YAML-синтаксисом. Пример YAML-конфигурации:
    apps:
      http:
        servers:
          srv0:
            listen:
              - ':80'
            routes:
              - match:
                  - host:
                      - localhost
                handle:
                  - handler: vars
                    root: /var/www/html
                  - handler: file_server
    

Решение типовых проблем

listen tcp 127.0.0.1:2019: bind: address already in use

Пример сообщения об ошибке:

 starting caddy administration endpoint: listen tcp 127.0.0.1:2019: bind: address already in use

Ошибка означает, что адрес 127.0.0.1:2019 (порт 2019) уже занят.

Для того, чтобы определить, какое приложение использует данный порт можно воспользоваться утилитой lsof:

 # lsof -i :2019
 COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 ahttpd  38108 _ahttpd   16u  IPv6  64156      0t0  TCP *:2019 (LISTEN)
  • -i - позволяет вывести сведения о файлах, интернет-адреса которых соответствуют заданному адресу;
  • :2019 - необходимый порт.

В данном случае, необходимо остановить службу ahttpd:

 # systemctl stop ahttpd.service

Дополнительно

Список использованных источников