Faire un ProxyPass Apache dans HAProxy
This commit is contained in:
parent
556b052c3c
commit
2a7fa86a7a
|
@ -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
|
||||
~~~
|
||||
|
||||
|
|
Loading…
Reference in New Issue