
Легковесный граничный HTTP(S) сервер и обратный прокси с автоматическим SSL, обнаружением Docker/Consul, аутентификацией по маршрутам, ограничением скорости и отказоустойчивостью на основе проверки здоровья.
Reproxy — это простой пограничный HTTP(s) сервер/обратный прокси, поддерживающий различные провайдеры (docker, static, file, consul catalog). Один или несколько провайдеров предоставляют информацию о запрашиваемом сервере, запрашиваемом URL, целевом URL и URL проверки работоспособности. Распространяется как единый бинарный файл или как docker-контейнер.
Сервер (хост) может быть задан как 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"reproxy --docker.enabled --docker.autodocker up -p 80:8080 umputun/reproxy --docker.enabled --docker.autodocker up -p 80:8080 -p 443:8443 umputun/reproxy --docker.enabled --docker.auto --ssl.type=auto --ssl.fqdn=example.comReproxy распространяется как небольшой самодостаточный бинарный файл, а также как docker-образ. И бинарный файл, и образ поддерживают несколько архитектур и несколько операционных систем, включая linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64, windows_x86_64 и windows_arm. Мы также предоставляем deb- и rpm-пакеты для arm64 и x86.
brew install umputun/apps/reproxydocker 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