
reproxy v1.7.0
Легковесный граничный HTTP(S) сервер и обратный прокси с автоматическим SSL, обнаружением Docker/Consul, аутентификацией по маршрутам, ограничением скорости и отказоустойчивостью на основе проверки здоровья.
Reproxy — это простой пограничный HTTP(s) сервер/обратный прокси, поддерживающий различные провайдеры (docker, static, file, consul catalog). Один или несколько провайдеров предоставляют информацию о запрашиваемом сервере, запрашиваемом URL, целевом URL и URL проверки работоспособности. Распространяется как единый бинарный файл или как docker-контейнер.
- Автоматическое завершение SSL с Let's Encrypt
- Поддержка пользовательских SSL-сертификатов
- Простые, но гибкие правила прокси
- Провайдер статических правил прокси из командной строки
- Динамический провайдер правил прокси на основе файлов
- Docker-провайдер с автоматическим обнаружением
- Провайдер Consul Catalog с обнаружением по тегам сервисов
- Поддержка нескольких (виртуальных) хостов
- Опциональное сжатие трафика
- Опциональный контроль доступа на основе IP
- Базовая аутентификация для каждого маршрута
- Заданные пользователем ограничения размера и таймауты
- Единый бинарный файл
- Docker-контейнер
- Встроенный сервер статических ассетов с опциональным режимом "SPA friendly"
- Поддержка правил перенаправления
- Опциональный ограничитель как общей активности, так и активности пользователя
- Проверка работоспособности в реальном времени и отказоустойчивость/балансировка нагрузки
- Управляющий сервер с информацией о маршрутах и метриками prometheus
- Поддержка плагинов через RPC для реализации собственной функциональности
- Опциональное логирование в формате Apache Log Format и упрощённые отчёты в stdout.
Сервер (хост) может быть задан как FQDN, например s.example.com, * (любой) или регулярное выражение. Точное совпадение имеет приоритет, поэтому если есть два правила с серверами example.com и example\.(com|org), запрос к example.com/some/url будет соответствовать первому. Запрашиваемый URL может быть регулярным выражением, например ^/api/(.*), а целевой URL может содержать группы из регулярного выражения, например http://d.example.com:8080/$1. Для приведённого примера запрос http://s.example.com/api/something?foo=bar будет проксирован на http://d.example.com:8080/something?foo=bar.
Для удобства запросы с завершающим / и без групп регулярного выражения расширяются до /(.*), а целевые адреса в таких случаях расширяются до /$1. То есть /api/ -> http://127.0.0.1/service будет преобразовано в ^/api/(.*) -> http://127.0.0.1/service/$1.
Поддерживается подстановка хоста в целевой URL. Например, /files/${host} будет заменено на имя соответствующего хоста. Также можно использовать $host (без фигурных скобок).
Поддерживаются как HTTP, так и HTTPS. Для HTTPS можно использовать статический сертификат, а также автоматические сертификаты ACME (Let's Encrypt). Опциональный сервер ассетов может использоваться для раздачи статических файлов. Для запуска reproxy требуется как минимум один определённый провайдер. Остальные параметры строго опциональны и имеют разумные значения по умолчанию.
Примеры:
- со статическим провайдером:
reproxy --static.enabled --static.rule="*,example.com/api/(.*),https://api.example.com/$1" - с автоматическим обнаружением docker:
reproxy --docker.enabled --docker.auto - как docker-контейнер:
docker up -p 80:8080 umputun/reproxy --docker.enabled --docker.auto - с автоматическим SSL:
docker up -p 80:8080 -p 443:8443 umputun/reproxy --docker.enabled --docker.auto --ssl.type=auto --ssl.fqdn=example.com
Установка
Reproxy распространяется как небольшой самодостаточный бинарный файл, а также как docker-образ. И бинарный файл, и образ поддерживают несколько архитектур и несколько операционных систем, включая linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64, windows_x86_64 и windows_arm. Мы также предоставляем deb- и rpm-пакеты для arm64 и x86.
- для бинарной версии загрузите соответствующий файл из раздела релизов
- для пользователей Homebrew:
brew install umputun/apps/reproxy - docker-контейнер доступен на Docker Hub, а также на Github Container Registry. Например,
docker pull umputun/reproxyилиdocker pull ghcr.io/umputun/reproxy.
Последняя стабильная версия имеет docker-тег :vX.Y.Z (с псевдонимом :latest), а текущий master — тег :master.
Провайдеры
Правила прокси предоставляются различными провайдерами. В настоящее время включены: file, docker, static и consul-catalog. Каждый провайдер может определять несколько правил маршрутизации как для проксируемых запросов, так и для статических ресурсов (assets). Пользователь может одновременно задавать несколько провайдеров.
Примеры различных провайдеров смотрите в examples
Статический провайдер
Это самый простой провайдер, определяющий все правила сопоставления непосредственно в командной строке (или окружении). Поддерживается несколько правил. Каждое правило состоит из 3–7 элементов, разделённых запятыми: server,sourceurl,destination[,ping-url[,forward-health-checks[,timeout[,throttle]]]]. Например:
*,^/api/(.*),https://api.example.com/$1— проксировать все запросы к любому хосту/серверу с префиксом/apiнаhttps://api.example.comexample.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping— проксировать все запросы кexample.comс URL/foo/barнаhttps://api.example.com/zzz; для проверки работоспособности используетсяhttps://api.example.com/ping.example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping,true— то же самое, но также перенаправляет запросы/pingи/healthна бэкенд.example.com,^/upload/(.*),https://api.example.com/$1,,,5m— таймаут запроса для маршрута 5 минут (4-е и 5-е поля оставлены пустыми, чтобы пропустить ping-url и forward-health-checks).example.com,^/login,https://api.example.com/login,,,,2— ограничение для маршрута 2 запроса/сек на пользователя (позиционные поля перед этим оставлены пустыми).
Четвёртый элемент задаёт опциональный ping-URL, используемый для отчётов о работоспособности. Пятый элемент опционально включает перенаправление запросов проверки работоспособности на бэкенд (true, yes, 1). Подробнее см. раздел Проверка работоспособности. Шестой элемент — опциональный таймаут запроса для маршрута (длительность Go, например 5m, 30s); 0 или пустое значение наследует глобальную настройку --timeout.write. Седьмой элемент — опциональное ограничение запросов/сек на пользователя для маршрута; 0 или пустое значение наследует --throttle.user. Допускается оставлять поля пустыми (например, ,, для неиспользуемых средних полей).
Файловый провайдер
Этот провайдер использует yaml-файл с правилами маршрутизации.
reproxy --file.enabled --file.name=config.yml