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
Я перечислил основные моменты, с которыми сталкивался. И мне часть из них не показались очевидными. Но довольно легко я находил решение и в настройке это оказывалось довольно просто. По этому, рекомендую всем. Кто еще не щупал этот инструмент, обязательно поработать с ним 🙂