
reproxy v1.7.1
Leichter HTTP(S)-Edge-Server und Reverse-Proxy mit automatischem SSL, Docker/Consul-Erkennung, routenspezifischer Authentifizierung, Ratenbegrenzung und gesundheitscheckbasiertem Failover.
Reproxy ist ein einfacher Edge-HTTP(s)-Server / Reverse-Proxy, der verschiedene Provider unterstützt (docker, static, file, consul catalog). Ein oder mehrere Provider liefern Informationen über den angeforderten Server, die angeforderte URL, die Ziel-URL und die Health-Check-URL. Es wird als einzelne Binärdatei oder als Docker-Container verteilt.
- Automatische SSL-Terminierung mit Let's Encrypt
- Unterstützung benutzerdefinierter SSL-Zertifikate
- Einfache, aber flexible Proxy-Regeln
- Statischer Proxy-Regel-Provider über die Kommandozeile
- Dynamischer, dateibasierter Proxy-Regel-Provider
- Docker-Provider mit automatischer Erkennung
- Consul-Catalog-Provider mit Erkennung über Service-Tags
- Unterstützung mehrerer (virtueller) Hosts
- Optionale Traffic-Komprimierung
- Optionale IP-basierte Zugriffskontrolle
- Grundlegende Authentifizierung pro Route
- Benutzerdefinierte Größenbeschränkungen und Timeouts
- Verteilung als einzelne Binärdatei
- Verteilung als Docker-Container
- Integrierter Server für statische Assets mit optionalem „SPA-freundlichem" Modus
- Unterstützung von Weiterleitungsregeln
- Optionaler Limiter für die Gesamtaktivität sowie für die Aktivität einzelner Benutzer
- Live-Health-Check und Failover/Load-Balancing
- Verwaltungsserver mit Routeninformationen und Prometheus-Metriken
- Plugin-Unterstützung über RPC zur Implementierung benutzerdefinierter Funktionalität
- Optionales Logging sowohl im Apache-Log-Format als auch mit vereinfachten stdout-Berichten.
Der Server (Host) kann als FQDN, z. B. s.example.com, als * (Catch-all) oder als Regex festgelegt werden. Exakte Übereinstimmungen haben Vorrang. Wenn es also zwei Regeln mit den Servern example.com und example\.(com|org) gibt, wird eine Anfrage an example.com/some/url mit der ersteren übereinstimmen. Die angeforderte URL kann ein Regex sein, zum Beispiel ^/api/(.*), und die Ziel-URL kann durch Regex übereinstimmende Gruppen enthalten, z. B. http://d.example.com:8080/$1. Für das obige Beispiel wird http://s.example.com/api/something?foo=bar an http://d.example.com:8080/something?foo=bar weitergeleitet.
Der Einfachheit halber werden Anfragen mit abschließendem / und ohne Regex-Gruppen zu /(.*) erweitert, und Ziele in diesen Fällen zu /$1. D. h. /api/ -> http://127.0.0.1/service wird zu ^/api/(.*) -> http://127.0.0.1/service/$1 übersetzt.
Die Host-Substitution wird in der Ziel-URL unterstützt. Zum Beispiel wird /files/${host} durch den übereinstimmenden Hostnamen ersetzt. $host (ohne geschweifte Klammern) kann ebenfalls verwendet werden.
Sowohl HTTP als auch HTTPS werden unterstützt. Für HTTPS kann sowohl ein statisches Zertifikat als auch automatische ACME-Zertifikate (Let's Encrypt) verwendet werden. Ein optionaler Assets-Server kann zum Ausliefern statischer Dateien verwendet werden. Der Start von reproxy erfordert mindestens einen definierten Provider. Die übrigen Parameter sind streng optional und haben sinnvolle Standardwerte.
Beispiele:
- mit einem statischen Provider:
reproxy --static.enabled --static.rule="*,example.com/api/(.*),https://api.example.com/$1" - mit automatischer Docker-Erkennung:
reproxy --docker.enabled --docker.auto - als Docker-Container:
docker up -p 80:8080 umputun/reproxy --docker.enabled --docker.auto - mit automatischem SSL:
docker up -p 80:8080 -p 443:8443 umputun/reproxy --docker.enabled --docker.auto --ssl.type=auto --ssl.fqdn=example.com
Installation
Reproxy wird als kleine eigenständige Binärdatei sowie als Docker-Image vertrieben. Sowohl die Binärdatei als auch das Image unterstützen mehrere Architekturen und mehrere Betriebssysteme, darunter linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64, windows_x86_64 und windows_arm. Wir stellen außerdem sowohl arm64- als auch x86-deb- und rpm-Pakete bereit.
- für eine Binärverteilung laden Sie die passende Datei im Release-Bereich herunter
- für Homebrew-Nutzer:
brew install umputun/apps/reproxy - Docker-Container verfügbar auf Docker Hub sowie in der Github Container Registry. D. h.
docker pull umputun/reproxyoderdocker pull ghcr.io/umputun/reproxy.
Die neueste stabile Version hat das Docker-Tag :vX.Y.Z (mit dem Alias :latest) und der aktuelle Master hat das Tag :master.
Provider
Proxy-Regeln werden von verschiedenen Providern bereitgestellt. Derzeit enthalten – file, docker, static und consul-catalog. Jeder Provider kann mehrere Routing-Regeln sowohl für proxied Requests als auch für statische (Assets) definieren. Der Benutzer kann mehrere Provider gleichzeitig festlegen.
Beispiele für verschiedene Provider finden Sie unter examples
Static-Provider
Dies ist der einfachste Provider, der alle Mapping-Regeln direkt in der Befehlszeile (oder Umgebung) definiert. Mehrere Regeln werden unterstützt. Jede Regel besteht aus 3 bis 7 durch Kommas getrennten Elementen server,sourceurl,destination[,ping-url[,forward-health-checks[,timeout[,throttle]]]]. Zum Beispiel:
*,^/api/(.*),https://api.example.com/$1– leitet alle Anfragen an einen beliebigen Host/Server mit dem Präfix/apianhttps://api.example.comweiterexample.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping– leitet alle Anfragen anexample.comund mit der URL/foo/baranhttps://api.example.com/zzzweiter und verwendethttps://api.example.com/pingfür den Health-Check.example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping,true– wie oben, leitet aber zusätzlich/ping- und/health-Anfragen an das Backend weiter.example.com,^/upload/(.*),https://api.example.com/$1,,,5m– routenspezifisches Request-Timeout von 5 Minuten (4. und 5. Feld leer gelassen, um ping-url und forward-health-checks zu überspringen).example.com,^/login,https://api.example.com/login,,,,2– routenspezifische Drosselung von 2 Anfragen/Sekunde pro Benutzer (die davorliegenden Positionsfelder bleiben leer).
Das 4. Element definiert eine optionale Ping-URL, die für die Health-Berichterstattung verwendet wird. Das 5. Element aktiviert optional die Weiterleitung von Health-Check-Anfragen an das Backend (true, yes, 1). Weitere Details finden Sie im Abschnitt Health check. Das 6. Element ist ein optionales routenspezifisches Request-Timeout (Go-Duration, z. B. 5m, 30s); 0 oder leer erbt die globale Einstellung --timeout.write. Das 7. Element ist ein optionales routenspezifisches Limit von Anfragen/Sekunde pro Benutzer; 0 oder leer erbt --throttle.user. Leere Positionsfelder sind zulässig (z. B. ,, für die ungenutzten mittleren Felder).
File-Provider
Dieser Provider verwendet eine YAML-Datei mit Routing-Regeln.
reproxy --file.enabled --file.name=config.yml
Beispiel für config.yml: