Route haproxy et réécriture basée sur le chemin de l'URI
J'essaye de configurer un Haproxy pour équilibrer la charge des requêtes sur quelques serveurs identifiés par le chemin de l'uri. Par exemple:
Devrait conduire à la "catalogue-v1" backends.
Chose est chaque application répond sur un chemin différent donc je ne dois pas seulement d'identifier l'application mais réécrire le chemin de l'URL. E. g.
- https://www.example.com/v1/catalog/product
- https://www.example.com/v2-2/checkout/cart/123
- https://www.example.com/v3.1.2/checkout/cart
À
- https://www.example.com/catalog-v1/product
- https://www.example.com/checkout-v2-2/cart/123
- https://www.example.com/checkout-v3.1.2/cart
Je sais que je ne devrais pas utiliser Haproxy pour la réécriture, mais pour l'instant c'est inévitable.
Essayé les regex qui a travaillé sur regex101:
([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*)
De Substitution:
/-/
Et enfin voici le haproxy.config:
global
daemon
user root
group root
maxconn 256000
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
stats socket /run/haproxy/stats.sock mode 777 level admin
defaults
log global
option dontlognull
maxconn 4000
retries 3
timeout connect 5s
timeout client 1m
timeout server 1m
option redispatch
balance roundrobin
listen stats :8088
mode http
stats enable
stats uri /haproxy
stats refresh 5s
backend catalog-v1
mode http
option httpchk GET /catalog-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) /-/
server 127.0.0.1:8280_catalog-v1-node01 127.0.0.1:8280 check inter 2s rise 3 fall 2
backend checkout-v1
mode http
option httpchk GET /checkout-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) /-/
server 127.0.0.1:8180_checkout-v1-node01 127.0.0.1:8180 check inter 2s rise 3 fall 2
frontend shared-frontend
mode http
bind localhost:80
acl is-catalog-v1-path path_dir /v1/catalog
acl is-checkout-v1-path path_dir /v1/checkout
use_backend catalog-v1 if is-catalog-v1-path
use_backend checkout-v1 if is-checkout-v1-path
Suis-je raté quelque chose?
J'ai eu du mal avec cela fait déjà quelques temps sans succès. Les backends montre le "HAUT" dans Haproxy page de statistiques, mais chaque fois que j'appelle le "non réecrit url" 400 Bad Request error.
Merci d'avance pour votre aide!
source d'informationauteur leovrf
Vous devez vous connecter pour publier un commentaire.
Si je vous comprends bien, remplacez l'exemple ci-dessous:
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#reqrep
Vous n'avez pas d'espaces.
La réponse ci-dessus est un correctif qui ne s'explique pas la racine du problème. Le problème est que beaucoup de supposer que nous faisons l'analyse d'une URL complète ou seulement la partie CHEMIN, quand nous avons fait l'analyse/la réécriture des en-têtes HTTP.
Par exemple:
Le but est de réécrire
GET /some_path HTTP/1.1
àGET /some_other_path HTTP/1.1
Je tiens à préciser que la solution ci-dessus fonctionne, car il prend en compte le verbe HTTP dans le match et de le remplacer.
^([^\ ]\*)\ (.*)
pour capturer le verbe et l'utiliser dans le modèle de remplacement.\1 \2