22
0
Fork 0

Faire un ProxyPass Apache dans HAProxy

This commit is contained in:
Jérémy Lecour 2020-05-21 09:38:12 +02:00 committed by Jérémy Lecour
parent 556b052c3c
commit 2a7fa86a7a
1 changed files with 37 additions and 1 deletions

View File

@ -225,6 +225,43 @@ backend domain2
server web02 192.0.2.2:80 cookie web02 check
~~~
### Reproduire un ProxyPass Apache
Avec Apache il est courant de faire un proxy qui modifie le chemin (_path_) :
~~~
ProxyPass / http://localhost:9999/path/to/app
ProxyPassReverse / http://localhost:9999/path/to/app
~~~
Ainsi, une requete à `/foo/bar` sera transise au final à `/path/to/app/foo/bar`.
Il est possible de reproduire le même comportement directement dans HAProxy :
~~~
backend be_http
mode http
http-request set-path /path/to/app%[path]
acl header_location res.hdr(Location) -m found
http-response replace-header Location (https?://%[req.hdr(Host)](:[0-9]+)?)?(/path/to/app)(.*) \1\4 if header_location
server localhost 127.0.0.1:9999
~~~
La partie `http-request set-path` permet de modifier le path au moment du traitement de la requête (équivalent à `ProxyPass` pour Apache).
Le serveur amont n'ayant aucune information de l'URL intiale, s'il doit envoyer un en-tête de redirection calculé de manière relative à la requête, celui-ci ne sera pas correct. Il faut le modifier à la volée avant de renvoyer la réponse.
La partie `http-response replace-header` va donc remplacer la valeur de l'en-tête `Location`.
L'expression régulière ne sera satisfaite que si le domaine d'origine est utilisé (ou totalement absent), conservant ainsi la possibilité d'avoir des redirection intactes vers d'autres domaines.
Détail des captures :
1. http ou https, suivi du _host_ et éventuellement un port (facultatif)
2. port (factultatif)
3. partie du _path_ à supprimer
4. reste du _path_ à garder
L'utilisation d'un ACL (très rapide) permet de ne faire l'opération (plus lente) que si l'entête est présent.
### Exemple en mode TCP
~~~
@ -492,4 +529,3 @@ net.ipv4.tcp_max_orphans=65536
# echo "show acl" | socat stdio /var/run/haproxy.sock
# echo "show acl #<ID>" | socat stdio /var/run/haproxy.sock
~~~