Tutoriales

Servidor perimetral simple / Proxy inverso 2021

Reproxy es un servidor HTTP Edge / Proxy inverso simple que admite varios proveedores (Docker, Static, File). Uno o más proveedores proporcionan información sobre el servidor solicitado, la URL solicitada, la URL de destino y la URL para la comprobación de integridad. Se distribuye como un solo archivo binario o como un contenedor Docker.

  • Terminación SSL cibernética con Let’s Encrypt
  • Soporte para certificados SSL proporcionados por el adjudicatario
  • Reglas de proxy simples pero flexibles
  • Proveedor de reglas de proxy de secante de comandos estática
  • Proveedor de reglas de proxy dinámicas basadas en archivos
  • Proveedor de Docker con detección cibernética
  • Compatibilidad con varios hosts (virtuales)
  • Compresión de tráfico opcional
  • Límites y tiempos de dilación personalizados
  • Distribución binaria única
  • Distribución de contenedores Docker
  • Servidor de activos estáticos incorporado
  • Servidor de sucursal con información de ruta y métricas de Prometheus

El servidor (host) se puede configurar como FQDN, es asegurar s.example.com o * (Coger todo). Por ejemplo, la URL solicitada puede ser una expresión regular ^/api/(.*) y la URL de destino puede tener grupos que coincidan con expresiones regulares en ie http://d.example.com:8080/$1. Para el ejemplo preparatorio http://s.example.com/api/something?foo=bar estará representado http://d.example.com:8080/something?foo=bar.

En aras de la simplicidad, las consultas con el final / y sin grupos de expresiones regulares expandidos a /(.*)y los objetivos en estos casos se ampliaron /$1. Es asegurar /api/ -> http://127.0.0.1/service se traduce en ^/api/(.*) -> http://127.0.0.1/service/$1

Se admiten tanto HTTP como HTTPS. Tanto los certificados estáticos como los certificados ACME (Let’s Encrypt) automatizados se pueden utilizar para HTTPS. El servidor de activos opcional se puede utilizar para servir archivos estáticos. Se debe puntualizar al menos un proveedor para iniciar Reproxy. Los demás parámetros son estrictamente opcionales y de un tipificado regular.

Ejemplos:

  • con un proveedor quieto: reproxy --static.enabled --static.rule="example.com/api/(.*),https://api.example.com/$1"
  • con una detección cibernética de Docker: reproxy --docker.enabled --docker.utilitario

Instalar

Tiene la última traducción estable :vX.Y.Z Día (con :latest Apelativo) y el avezado presente tiene :master Rótulo.

proveedores

Reglas de proxy proporcionadas por varios proveedores. Incluido actualmente file, docker y static. Cada proveedor puede puntualizar varias reglas de enrutamiento para solicitudes de proxy y estáticas (activos). El adjudicatario puede especificar varios proveedores al mismo tiempo.

Puede encontrar ejemplos en ejemplos de varios proveedores

Fijo

Este es el proveedor más simple que define todas las reglas de mapeo directamente en la secante de comando (o entorno). Se admiten varias reglas. Cada regla consta de 3 o 4 fundamentos separados por comas server,sourceurl,destination,[ping-url]. Por ejemplo:

  • *,^/api/(.*),https://api.example.com/$1, – Proxy todas las solicitudes a un host / servidor con /api Prefijo a https://api.example.com
  • example.com,/foo/bar,https://api.example.com/zzz,https://api.example.com/ping – Representar todas las solicitudes example.com y con /foo/bar URL a https://api.example.com/zzz. Usos https://api.example.com/ping para el chequeo de lozanía

El posterior (cuarto) aspecto define una URL de ping opcional que se utilizará para los informes de lozanía. Es asegurar*,^/api/(.*),https://api.example.com/$1,https://api.example.com/ping. Consulte la sección Examen de lozanía para obtener más información.

expediente

reproxy --file.enabled --file.name=config.yml

Ejemplo de config.yml::

default: # the same as * (catch-all) server
  -  route: "^/api/svc1/(.*)", dest: "http://127.0.0.1:8080/blah1/$1" 
  - 
      route: "/api/svc3/xyz",
      dest: "http://127.0.0.3:8080/blah3/xyz",
      "ping": "http://127.0.0.3:8080/ping",
    
srv.example.com:
  -  route: "^/api/svc2/(.*)", dest: "http://127.0.0.2:8080/blah2/$1/abc" 

Este es un proveedor dinámico y el cambio de archivo se aplicará automáticamente.

estibador

El proveedor de Docker admite la detección completamente cibernética (con --docker.utilitario) sin configuración adicional y redirige de forma predeterminada todas las solicitudes, como https://server/<container_name>/(.*) a la IP interna del contenedor especificado y el puerto expuesto. Solo se reconocen los contenedores activos (en ejecución).

Esta configuración predeterminada se puede cambiar con etiquetas:

  • reproxy.server – Servidor (nombre de host) adecuado. Incluso puede ser una serie de servidores separados por comas.
  • reproxy.route – ruta de origen (ubicación)
  • reproxy.dest – camino a la meta. Nota: Esta no es una URL completa, solo la ruta adjunta al puerto IP del contenedor.
  • reproxy.port – Puerto de destino del contenedor agradecido
  • reproxy.ping – Ruta de ping para el contenedor de destino.
  • reproxy.enabled – activar (yes, true, 1) o desactivar (no, false, 0) Contenedor de dianas de reproducción.

Tenga en cuenta: sin --docker.utilitario El contenedor de destino debe tener al menos uno de reproxy.* Etiquetas para ser vistas como un objetivo potencial.

Con --docker.utilitarioTodos los contenedores con un puerto expuesto se consideran destinos de enrutamiento. Hay tres formas de delimitar esto:

  • Excluir algunos contenedores de forma explícita --docker.excludees asegurar --docker.exclude=c1 --docker.exclude=c2 ...
  • Permitir solo una determinada red de Docker --docker.network
  • Establecer la protocolo reproxy.enabled=false o reproxy.enabled=no o reproxy.enabled=0

Este es un proveedor dinámico y cualquier cambio en el estado del contenedor se aplicará automáticamente.

Soporte SSL

El modo SSL (ningún de forma predeterminada) se puede configurar en utilitario (Certificados ACME / LE), static (certificado existente) o none. Si utilitario El certificado SSL activado se emite automáticamente para todos los nombres de servidor reconocidos. El adjudicatario puede sobrescribirlo configurando --ssl.fqdn Títulos)

Inicio sesión

De forma predeterminada, no se genera ningún registro de solicitudes. Esto se puede activar configurando --logger.enabled. El registro (girado automáticamente) tiene el formato de registro de Apache combinado

El adjudicatario además puede iniciar sesión con stdout --logger.stdout. Esto no afecta el registro de archivos, pero proporciona información mínima sobre las solicitudes que se procesan.

2021/04/16 01:17:25.601 [INFO]  GET - /echo/image.png - xxx.xxx.xxx.xxx - 200 (155400) - 371.661251ms
2021/04/16 01:18:18.959 [INFO]  GET - /api/v1/params - xxx.xxx.xxx.xxx - 200 (74) - 1.217669m

Servidor de activos

Los usuarios pueden habilitar (deshabilitar de forma predeterminada) el servidor de activos para entregar archivos estáticos. Mientras --assets.location configúrelo manejará cualquier solicitud que no sea de proxy a continuación assets.root como una solicitud de archivos estáticos. El servidor de activos se puede utilizar sin un proveedor de proxy. En este modo, Reproxy actúa como un servidor web simple para el contenido quieto.

Encima del servidor de activos comunes, se admiten varios servidores estáticos personalizados. Cada proveedor tiene una forma diferente de puntualizar dicha regla estática y es posible que algunos proveedores no la admitan en total. Por ejemplo, varios servidores estáticos tienen sentido en estáticos (proveedores de secante de comandos), proveedores de archivos e incluso proveedores de Docker.

  1. proveedor quieto: si el aspecto de origen tiene el prefijo assets: Se prostitución como un servidor de archivos. Por ejemplo *,assets:/web,/var/www, servirá a todos /web/* Solicitar con un servidor de archivos a través de /var/www Directorio.
  2. Proveedor de archivos: establezca un campo opcional assets: true
  3. Proveedor de Docker – reproxy.assets=web-root:locationes asegurar reproxy.assets=/web:/var/www.

Assets Server admite el control de almacenamiento en gusto con el --assets.cache=<duration> Parámetro. 0s Duración (predeterminado) deshabilita el control de almacenamiento en gusto. Una duración es una secuencia de números decimales, cada uno con una fracción opcional y un sufijo de dispositivo, p. Ej. B. «300 ms», «1,5 h» o «2 h 45 m». Las unidades de tiempo válidas son «ns», «nosotros» (o «µs»), «ms», «s», «m», «h» y «d».

Hay dos formas de establecer la duración de la gusto:

  1. Un valencia único para todos los activos estáticos. Es tan simple como --assets.cache=48h.
  2. Duración personalizada para diferentes tipos de MIME. Debe tener dos partes: el valencia predeterminado y los pares MIME: duración. En la secante de comando, esto parece múltiple --assets.cache Opciones, es asegurar --assets.cache=48h --assets.cache=text/html:24h --assets.cache=image/png:2h. Los títulos del entorno deben estar separados por comas; H. ASSETS_CACHE=48h,text/html:24h,image/png:2h

Mas opciones

  • --gzip Habilita la compresión gzip para las respuestas.
  • --max=N Le permite establecer el tamaño mayor de solicitud (predeterminado 64 KB).
  • --header Especifica encabezados adicionales que se agregarán a cada respuesta de proxy. Por ejemplo, se puede hacer con Docker compose:
  environment:
      - HEADER=
          X-Frame-Options:SAMEORIGIN,
          X-XSS-Protection:1; mode=block;,
          Content-Security-Policy:default-src 'self'; style-src 'self' 'unsafe-inline';

Ping y controles de lozanía

Reproxy ofrece 2 puntos finales para este propósito:

  • /ping argumenta con pong e indica qué reproxy se está ejecutando
  • /health devoluciones 200 OK Estado cuando todos los servidores de destino han respondido a su solicitud de ping 200 o 417 Expectation Failed Cuando uno de los servidores respondió con un código que no era 200. Incluso devuelve el cuerpo json con detalles sobre los servicios pasados ​​/ fallidos.

API de sucursal

Opcional, se puede encender con --mgmt.enabled. Exposiciones 2 puntos finales mgmt.listen (Dirección: Puerto):

  • GET /routes – Índice de todas las rutas descubiertas
  • GET /metrics – devuelve métricas de Prometheus (http_requests_total, response_status y http_response_time_seconds)

ver además ejemplos / métricas

Todas las opciones de aplicación

  -l, --listen=                     listen on host:port (default: 127.0.0.1:8080) [$LISTEN]
  -m, --max=                        max request size (default: 64000) [$MAX_SIZE]
  -g, --gzip                        enable gz compression [$GZIP]
  -x, --header=                     proxy headers [$HEADER]
      --signature                   enable reproxy signature headers [$SIGNATURE]
      --dbg                         debug mode [$DEBUG]

ssl:
      --ssl.type=[none|static|auto] ssl (utilitario) support (default: none) [$SSL_TYPE]
      --ssl.cert=                   path to cert.pem file [$SSL_CERT]
      --ssl.key=                    path to key.pem file [$SSL_KEY]
      --ssl.acme-location=          dir where certificates will be stored by autocert manager (default: ./var/acme) [$SSL_ACME_LOCATION]
      --ssl.acme-email=             admin email for certificate notifications [$SSL_ACME_EMAIL]
      --ssl.http-port=              http port for redirect to https and acme challenge test (default: 80) [$SSL_HTTP_PORT]
      --ssl.fqdn=                   FQDN(s) for ACME certificates [$SSL_ACME_FQDN]

assets:
  -a, --assets.location=            assets location [$ASSETS_LOCATION]
      --assets.root=                assets web root (default: /) [$ASSETS_ROOT]
      --assets.cache=               cache duration for assets (default: 0s) [$ASSETS_CACHE]

logger:
      --logger.stdout               enable stdout logging [$LOGGER_STDOUT]
      --logger.enabled              enable access and error rotated logs [$LOGGER_ENABLED]
      --logger.file=                location of access log (default: access.log) [$LOGGER_FILE]
      --logger.max-size=            maximum size in megabytes before it gets rotated (default: 100) [$LOGGER_MAX_SIZE]
      --logger.max-backups=         maximum number of old log files to retain (default: 10) [$LOGGER_MAX_BACKUPS]

docker:
      --docker.enabled              enable docker provider [$DOCKER_ENABLED]
      --docker.host=                docker host (default: unix:///var/run/docker.sock) [$DOCKER_HOST]
      --docker.network=             docker network [$DOCKER_NETWORK]
      --docker.exclude=             excluded containers [$DOCKER_EXCLUDE]
      --docker.utilitario                 enable automatic routing (without labels) [$DOCKER_AUTO]

file:
      --file.enabled                enable file provider [$FILE_ENABLED]
      --file.name=                  file name (default: reproxy.yml) [$FILE_NAME]
      --file.interval=              file check interval (default: 3s) [$FILE_INTERVAL]
      --file.delay=                 file event delay (default: 500ms) [$FILE_DELAY]

static:
      --static.enabled              enable static provider [$STATIC_ENABLED]
      --static.rule=                routing rules [$STATIC_RULES]

timeout:
      --timeout.read-header=        read header server timeout (default: 5s) [$TIMEOUT_READ_HEADER]
      --timeout.write=              write server timeout (default: 30s) [$TIMEOUT_WRITE]
      --timeout.idle=               idle server timeout (default: 30s) [$TIMEOUT_IDLE]
      --timeout.dial=               dial transport timeout (default: 30s) [$TIMEOUT_DIAL]
      --timeout.keep-alive=         keep-alive transport timeout (default: 30s) [$TIMEOUT_KEEP_ALIVE]
      --timeout.resp-header=        response header transport timeout (default: 5s) [$TIMEOUT_RESP_HEADER]
      --timeout.idle-conn=          idle connection transport timeout (default: 90s) [$TIMEOUT_IDLE_CONN]
      --timeout.tls=                TLS hanshake transport timeout (default: 10s) [$TIMEOUT_TLS]
      --timeout.continue=           expect continue transport timeout (default: 1s) [$TIMEOUT_CONTINUE]

mgmt:
      --mgmt.enabled                enable management API [$MGMT_ENABLED]
      --mgmt.listen=                listen on host:port (default: 0.0.0.0:8081) [$MGMT_LISTEN]

Help Options:
  -h, --help                        Show this help message

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba