HAProxy reqrep rimuove l'URI su richiesta back-end


27

domanda davvero veloce riguardo a HAProxy reqrep. Sto cercando di riscrivere / sostituire la richiesta che viene inviata al back-end.

Ho il seguente dominio e URI di esempio, entrambi con lo stesso nome di dominio, ma pool di server Web back-end diversi.

http://domain/web1
http://domain/web2

Voglio che web1 vada a backf webfarm1 e web2 che vada a webfarm2. Attualmente questo succede. Tuttavia, desidero rimuovere l'URI web1 o web2 quando la richiesta viene inviata al back-end.

Ecco il mio haproxy.cfg

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

Se vado http://domain/web1o http://domain/web2lo vedo nei log degli errori che la richiesta su un server in ciascun back-end è che la richiesta è rispettivamente per la risorsa / web1 o / web2. Pertanto credo che ci sia qualcosa di sbagliato nella mia espressione regolare, anche se l'ho copiato e incollato dalla Documentazione. http://code.google.com/p/haproxy-docs/wiki/reqrep

Riepilogo: sto cercando di instradare il traffico in base all'URI, tuttavia desidero che HAProxy rimuova l'URI quando invia la richiesta al pool back-end.

Grazie!

-Jim


Ora c'è un pulsante di modifica e commento.
Chris S,

1
Jim, hai problemi a commentare perché hai effettuato l'accesso con un account diverso da quello che hai usato per creare questa domanda. Prova a mantenere coerente l'account di accesso in modo che ciò non accada in futuro. Ho segnalato un moderatore per risolvere questo problema.
MDMarra,

Risposte:


28

Tu hai questo:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

Penso che tu voglia questo:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

La differenza è che il secondo funzionerà se il / dopo webN viene omesso.

In risposta al tuo commento qui sotto, entrare nei dettagli su come funzionano le espressioni sopra è più sforzo di quello che posso dare. Tuttavia, forse questo aiuterà.

Tutto ciò che precede / web1 sta "catturando" tutto ciò che precede web1 nella stringa di richiesta. Quindi di solito sarebbe GET o POST. (. *) "Cattura" tutto dopo web1, incluso nulla se non c'è nulla.

La parte successiva ( \1\2) dice cosa fare con quelle parti catturate. Dice di formare una stringa composta da \1(la prima parte catturata) e \2(seguita dalla seconda parte catturata). Poiché web1 non viene mai acquisito, non viene assemblato nell'output finale.


Cosa significa \ 1 \ \ 2 \ 3? Per quanto riguarda la documentazione reqrep, cosa fa ^ ([^ \] *) \? Ecco l'esempio riportato nella pagina della documentazione. # sostituisci "/ static /" con "/" all'inizio di qualsiasi percorso di richiesta. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim

Dopo aver letto il tuo commento, mi sono reso conto che la mia soluzione proposta era leggermente troppo complicata. L'ho semplificato.
collo lungo

Quindi qual è la sintassi di reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Sono confuso riguardo al \ 1 \ \ 2 \ 3?
Jim,

C'è un modo per incorporare questo reqrep per funzionare se l'utente mette / web1 o / web1 /?
Jim,

Hai provato?
collo lungo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.