Caddy
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 # rpm -e --justdb caddy # chmod --reference /usr/bin/caddy /home/sysadmin/caddy # chown --reference=/usr/bin/caddy /home/sysadmin/caddy # rm /usr/bin/caddy && cp /home/sysadmin/caddy /usr/bin/
В данном случае, собранный исполняемый файл находится по пути /home/sysadmin/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 help
иcaddy help [command]
- официальной документации .
Настройка caddy
В ОС Альт конфигурация caddy расположена в /etc/caddy/Caddyfile
.
По умолчанию главный файл конфигурации содержит строку import Caddyfile.d/*.caddyfile
. Эта строка указывает на то, что caddy импортирует все файлы с расширением .caddyfile из директории /etc/caddy/Caddyfile.d/. Данная функциональность позволяет разделять конфигурации на отдельные файлы и упрощает организацию и поддержку конфигурации сервера.
Настройка через Caddyfile
Статический файловый сервер
Для создания статического файлового сервера необходимо использовать директиву 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:
-
Caddyfile: Это стандартный формат конфигурации Caddy. Он основан на простом текстовом формате и позволяет определить веб-сервер и его параметры в удобном для чтения виде. Пример Caddyfile:
localhost:80 { root * /var/www/html file_server }
-
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" } ] } ] } } } } }
-
YAML: Caddy также поддерживает конфигурацию в формате YAML. YAML обеспечивает более читаемую и структурированную форму конфигурации. Чтобы использовать данный адаптер конфигурации, необходимо собрать caddy с плагином abiosoft/caddy-yaml. Пример YAML-конфигурации:
apps: http: servers: srv0: listen: - ':80' routes: - match: - host: - localhost handle: - handler: vars root: /var/www/html - handler: file_server
-
Nginx. Caddy также может импортировать конфигурации из Nginx. Это очень удобно, если у вас уже есть настроенные конфигурации Nginx, и вы хотите перейти на Caddy.
server { listen 80; server_name localhost; location / { root /var/www/html; try_files $uri $uri/ =404; } }
Настройка через API
TODO
Решение типовых проблем
Error: decoding config
TODO
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