Caddy2 и некоторые полезности
Оф. сайт: https://caddyserver.com/v2
Начну пожалуй с описания. Что же это за зверек?
Caddy 2 - это маленький, легковесный, функциональный веб-сервер с автоматическим созданием SSL сертификата от Let's Encrypt написанный на Go.
Преимущества
Область применения
В первую очередь он будет удобен разработчикам. Когда нужен простой реверс прокси на хосте/локалхосте для ваших вм, контейнеров или даже для статики.
Особенно, когда нужен SSL.
Лично я его использую чаще всего на хосте, где есть контейнеры (docker).
Часто я стою перед выбором между nginx (one love ❤) и Caddy. И nginx я выбираю в случае, когда мне нужны тонкие настройки вэб-сервера или особые модули. Но и Caddy тоже довольно гибок.
Установка
Не буду заострять на этом внимание.
Все хорошо описано здесь: https://caddyserver.com/docs/install
Пример простой конфигурации
По дефолту конфиг находится по пути /etc/caddy/Caddyfile
site.example.com:80 {
# Set this path to your site's directory.
root * /var/www/
# 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
# When using php-fpm listening via a unix socket:
php_fastcgi /blog/* unix//run/php/php7.0-fpm.sock
}Сайт с SSL и без него
site.example.com:80 {
...
}:80 - указывает что SSL не будет использоваться.
site.example.com {
...
tls почтовый@ящик.ru
}Почта указывается, для регистрации в Let's Encrypt. И автоматической загрузки сертификата. Естественно, у вас должен быть доступ извне к машинке. На которой запущен Caddy. И A-запись указывающая на этот хост.
Редирект с 80 на 443 порт подключается автоматически. Если не задан отдельно блок с :80.
Или используем свои сертификаты:
site.example.com {
...
tls /etc/ssl/site.example.com.pem /etc/ssl/site.example.com.key
...
}Реверс прокси и прокидывание реального IP
site.example.com {
...
reverse_proxy localhost:5580 {
header_up X-Real-IP {remote_host}
}
...
}Ограничение доступа к сайту по ip
site.example.com {
...
@matchost {
remote_ip 51.89.16.234 192.168.0.0/16
}
reverse_proxy @matchost localhost:9503 {
header_up X-Real-IP {remote_host}
}
...
}Скрываем заголовок server
site.example.com {
...
header / {
-Server
}
...
}Добавляем любой заголовок
site.example.com {
...
header / Content-Type "text/html; charset=UTF-8;"
...
}Ограничиваем доступ к сайту по странам
Для этого понадобиться модуль: https://github.com/porech/caddy-maxmind-geolocation
Согласно документации, нужно скачать инструмент xcaddy и установить пакет golang. Что бы сделать свою сборку caddy.
Но есть вариант проще: https://caddyserver.com/download
Там в поиске пишем "geolocation".
И скачиваем готовый кастомный бинарник под вашу архитектуру. Например, linux amd64.
Подсовываем его вместо оригинального и готово. Осталось скачать БД geoip и настроить.
Идем на сайт maxmind: https://dev.maxmind.com/geoip/updating-databases?lang=en
Там все неплохо описано. В двух словах, надо зарегистрироваться, сгенерировать ключ и скачать базу. Нас интересует GeoLite2-Country.
Как только мы это сделали и распаковали базу, можно приступить к настройке.
(GEOFILTER) {
@geofilter {
not maxmind_geolocation {
db_path "/opt/caddy/geoip/GeoLite2-Country.mmdb"
deny_countries FR UNK
}
}
respond @geofilter "Access Denied" 403
}В примере мы закрываем доступ странам Франция и неопределенным IP.
Далее в секции с описанием сайта добавляем
site.example.com {
...
import GEOFILTER
...
}Готово
Теперь из указанных стран будут получать 403 ошибку.
Логирование
site.example.com {
...
log {
output file /var/log/caddy/site.example.com_access.log
format console
}
...
}Подробнее о логировании: https://caddyserver.com/docs/caddyfile/directives/log
Я перечислил основные моменты, с которыми сталкивался. И мне часть из них не показались очевидными. Но довольно легко я находил решение и в настройке это оказывалось довольно просто. По этому, рекомендую всем. Кто еще не щупал этот инструмент, обязательно поработать с ним 🙂