HAProxy reqrep, arka uç isteğinde URI'yi kaldır


27

HAProxy reqrep ile ilgili gerçek hızlı bir soru. Arka uçtan gönderilen isteği yeniden yazmaya / değiştirmeye çalışıyorum.

Aşağıdaki örnek etki alanı ve URI'lar var, ikisi de aynı etki alanı adını paylaşıyor, ancak farklı arka uç web sunucusu havuzları.

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

Web1'in webfarm1'e ve web2'nin webfarm2'ye gitmesini istiyorum. Şu anda bu oluyor. Bununla birlikte, istek arka uçtan gönderildiğinde web1 veya web2 URI'sini çıkarmak istiyorum.

İşte benim 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

Eğer gidersem http://domain/web1ya http://domain/web2da hatayı görürsem, her bir arka uçtaki bir sunucudaki isteğin, istemin sırasıyla kaynak / web1 veya / web2 için olduğu anlamına gelir. Bu nedenle, düzenli ifademle ilgili olarak, Belgelerden kopyalayıp yapıştırdığım halde yanlış bir şey olduğuna inanıyorum. http://code.google.com/p/haproxy-docs/wiki/reqrep

Özet: URI'ya dayalı trafik yönlendirmeye çalışıyorum, ancak isteği arka uç havuzuna gönderdiğinde HAProxy'nin URI'yi soymasını istiyorum.

Teşekkür ederim!

Jim


Şimdi bir düzenleme ve yorum düğmesi var.
Chris S,

1
Jim, yorum yapmada sorun yaşıyorsun çünkü bu soruyu yarattığından farklı bir hesapla giriş yaptın. Lütfen ileride gerçekleşmeyecek şekilde giriş hesabınızı tutarlı tutmaya çalışın. Bunu düzeltmek için bir moderatör etiketledim.
MDMarra

Yanıtlar:


28

Bu sizde:

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

Sanırım bunu istiyorsun:

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

Aradaki fark, webN / after ihmal edilirse ikincinin çalışacağıdır.

Aşağıdaki yorumunuza cevaben, yukarıdaki ifadelerin nasıl çalıştığımdan daha fazla çaba harcadığı konusunda ayrıntılı bilgi verilmektedir. Ancak, belki bu yardımcı olacaktır.

/ Web1'den önceki her şey, istek dizesindeki web1'den önceki her şeyi "yakalar". Bu yüzden genellikle bu GET veya POST olur. (. *) Web1'den sonraki her şeyi "yakalar", hiçbir şey yoksa hiçbir şey dahil değil.

Bir sonraki kısım ( \1\2), ele geçirilen parçalarla ne yapılması gerektiğini söylüyor. \1(İlk yakalanan kısım) ve \2(ikinci yakalanan kısımdan sonra ) oluşan bir ipin oluşturulduğunu söylüyor . Web1 asla yakalanmadığından, son çıktıya birleştirilmez.


\ 1 \ \ 2 \ 3 ne anlama geliyor? Reqrep belgelerine gelince, ^ ([^ \] *) \ ne yapar? İşte dokümantasyon sayfasında verilen örnek. # Herhangi bir istek yolunun başında "/ static /" yerine "/" yazın. reqrep ^ ([^ \] *) \ / statik /(.*) \ 1 \ / \ 2
Jim

Yorumunuzu okuduktan sonra, önerdiğim çözümün biraz aşırı karmaşık olduğunu anladım. Basitleştirdim.
Longneck

Peki reqrep sözdizimi nedir? reqrep {string_2_search_thru} {search_string} {replace_string}? \ 1 \ \ 2 \ 3 hakkında kafam karıştı?
Jim

Eğer kullanıcı / web1 veya / web1 / 'i koyarsa, bu reqrep ile çalışmanın bir yolu var mı?
Jim

Onu denedin mi?
Longneck

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.