IT
June 25, 2022

Caddy2 и некоторые полезности

Оф. сайт: https://caddyserver.com/v2

Начну пожалуй с описания. Что же это за зверек?
Caddy 2 - это маленький, легковесный, функциональный веб-сервер с автоматическим созданием SSL сертификата от Let's Encrypt написанный на Go.

Преимущества

  • Простая и быстрая установка
  • Легкая настройка
  • Быстродействие (может поспорить с nginx)

Область применения

В первую очередь он будет удобен разработчикам. Когда нужен простой реверс прокси на хосте/локалхосте для ваших вм, контейнеров или даже для статики.
Особенно, когда нужен 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 и без него

Без SSL

site.example.com:80 {
...
}

:80 - указывает что SSL не будет использоваться.

С 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

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

Полезные ссылки

https://www.shixuen.com/linux/services_web_caddy_v2.html