
Servidor HTTP(S) de borde ligero y proxy inverso con SSL automático, descubrimiento Docker/Consul, autenticación por ruta, limitación de velocidad y conmutación por error basada en comprobaciones de salud.
Reproxy es un servidor/proxy inverso simple de borde HTTP(s) que admite varios proveedores (docker, estático, archivo, catálogo consul). Uno o más proveedores suministran información sobre el servidor solicitado, la URL solicitada, la URL de destino y la URL de verificación de salud. Se distribuye como un solo binario o como un contenedor docker.
El servidor (host) puede configurarse como FQDN, ej. s.example.com, * (catch all) o una expresión regular. La coincidencia exacta tiene prioridad, por lo que si hay dos reglas con servidores example.com y example\.(com|org), la solicitud a example.com/some/url coincidirá con la primera. La URL solicitada puede ser una expresión regular, por ejemplo ^/api/(.*) y la URL de destino puede tener grupos coincidentes de la expresión regular, ej. http://d.example.com:8080/$1. Para el ejemplo anterior, http://s.example.com/api/something?foo=bar se proxyará a http://d.example.com:8080/something?foo=bar.
Por conveniencia, las solicitudes con / final y sin grupos de expresión regular se expanden a /(.*), y los destinos en esos casos se expanden a /$1. Es decir, /api/ -> http://127.0.0.1/service se traducirá a ^/api/(.*) -> http://127.0.0.1/service/$1.
La sustitución de host es compatible en la URL de destino. Por ejemplo, /files/${host} se reemplazará con el nombre del host coincidente. También se puede usar $host (sin llaves).
Se admiten tanto HTTP como HTTPS. Para HTTPS, se puede usar un certificado estático así como certificados ACME automatizados (Let's Encrypt). Se puede usar un servidor de activos opcional para servir archivos estáticos. Iniciar reproxy requiere al menos un proveedor definido. El resto de parámetros son estrictamente opcionales y tienen valores predeterminados razonables.
Ejemplos:
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 se distribuye como un pequeño binario autónomo, así como una imagen docker. Tanto el binario como la imagen admiten múltiples arquitecturas y múltiples sistemas operativos, incluyendo linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64, windows_x86_64 y windows_arm. También proporcionamos paquetes deb y rpm tanto para arm64 como para x86.
brew install umputun/apps/reproxydocker pull umputun/reproxy o docker pull ghcr.io/umputun/reproxy.La última versión estable tiene la etiqueta docker :vX.Y.Z (con el alias :latest) y la rama master actual tiene la etiqueta :master.
Las reglas de proxy son proporcionadas por varios proveedores. Actualmente incluidos - file, docker, static y consul-catalog. Cada proveedor puede definir múltiples reglas de enrutamiento tanto para solicitudes proxy como para activos estáticos. El usuario puede configurar múltiples proveedores al mismo tiempo.
Vea ejemplos de varios proveedores en examples
Este es el proveedor más simple que define todas las reglas de mapeo directamente en la línea de comandos (o entorno). Se admiten múltiples reglas. Cada regla tiene de 3 a 7 elementos separados por comas server,sourceurl,destination[,ping-url[,forward-health-checks[,timeout[,throttle]]]]. Por ejemplo:
*,^/api/(.*),https://api.example.com/$1 - proxy todas las solicitudes a cualquier host/servidor con prefijo /api a https://api.example.comexample.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping - proxy todas las solicitudes a example.com y con url /foo/bar a https://api.example.com/zzz y usa https://api.example.com/ping para la verificación de salud.example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping,true - igual que el anterior pero también reenvía las solicitudes /ping y /health al backend.example.com,^/upload/(.*),https://api.example.com/$1,,,5m - tiempo de espera de solicitud por ruta de 5 minutos (4to y 5to campos vacíos para omitir ping-url y forward-health-checks).example.com,^/login,https://api.example.com/login,,,,2 - limitación por ruta de 2 req/seg por usuario (los campos posicionales anteriores están vacíos).El 4º elemento define una url de ping opcional utilizada para informes de salud. El 5º elemento habilita opcionalmente el reenvío de solicitudes de verificación de salud al backend (true, yes, 1). Consulte la sección Verificación de salud para más detalles. El 6º elemento es un tiempo de espera de solicitud por ruta opcional (duración Go, ej. 5m, 30s); 0 o vacío hereda la configuración global --timeout.write. El 7º elemento es un límite opcional de req/seg por usuario por ruta; 0 o vacío hereda la configuración --throttle.user. Se permiten campos posicionales vacíos (ej. ,, para los campos intermedios no utilizados).
Este proveedor utiliza un archivo yaml con reglas de enrutamiento.
reproxy --file.enabled --file.name=config.yml