İstek URI'sine göre HAproxy 1.6 ile yanıt üstbilgileri nasıl eklenir?


9

Tomcat sunucularının önünde yük dengeleyici olarak HAproxy 1.6 kullanıyorum.

İstek URI'sına dayalı yanıt üstbilgileri eklemem gerekiyor.

Örneğin Cache-Control public,max-age="600", istek uri olduğunda /apiancak istek uri başka bir şey olduğunda yanıt başlığını eklemek istiyorum .

  • İlk denemem, http-response başlıklarını eklemek için yola dayalı acl kullanarak oldu:

    acl api path_reg ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if api
    

    Ben haproxy ile başladığımda -d, path_reg(veya path) ile uyumsuz olduğunu söyleyerek uyarı var http-response:

    Dec  6 15:22:29 ip-10-30-0-196 haproxy-systemd-wrapper[315]: 
    [WARNING] 340/152229 (2035) : parsing 
    [/etc/haproxy/haproxy.cfg:78] : acl 'api' will never match because 
    it only involves keywords that are incompatible with 'backend 
    http-response header rule'
    
  • Bunun http-requestyerine başlığı eklemeye çalıştım http-response:

    acl api path_reg ^/api/(.*)$
    http-request add-header Cache-Control public,max-age="600" if api
    

    Bu işe yaradı ama cevapta ihtiyacım var

  • Ayrıca haproxy değişkenleri kullanmaya çalıştım:

    http-request set-var(txn.path) path
    acl path_acl %[var(txn.path)] -m ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if path_acl
    

    Ama HAproxy denediğimde olay başlamıyor ve aşağıdaki hata var:

    [ALERT] 340/162647 (2241) : parsing [/etc/haproxy/haproxy.cfg:48] 
    : error detected while parsing ACL 'path_acl' : unknown fetch 
    method '%[var' in ACL expression '%[var(txn.path)]'.
    

Yanıt başlığını ayarlamak için istek yolunu bir acl'ye nasıl kullanabilirim?

Yanıtlar:


9

Bunu dene:

http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }

capture.req.uriyanıt işlenene kadar devam eder, aksine path, işlemez .

Birkaç not:

Bu örnekte anonim bir EKL kullanılır. Ayrıca, adlandırılmış bir ACL ile de yapabilirsiniz, ancak bu 2 satır alır.

Maksimum yaş değerini neden teklif etmeniz gerektiğinin farkında olmam için hiçbir neden yok.

Muhtemelen istemezsiniz add-header, istersiniz set-header, bu zaten mevcutsa kaldırılmasını sağlar.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$muhtemelen doğru olarak yazılmıştır acl path_acl var(txn.path) -m ^/api/(.*)$. HAProxy, ne zaman beklediği %[ ]ve ne zaman beklemediği konusunda biraz titizdir . Eminim bir örüntü vardır, ama sadece ne olduğu net değil.


1
Cevabınız için teşekkürler. Kullanılarak her iki yöntem capture.req.urikaldırılırken ve değişkenler %[ ]olarak acl̀çalışmaktadır. Ayrıca etrafında tırnak konusunda haklisin max-agedeğeri ve set-headeryerine add-header.
jmlrt

1
Dahili olarak, arka uç bir Cache-Controlyanıt sağlamazsa, benzer bir şey yaptığımı unutmayın : Cache-Control-Authority: implicit, gatewayGeliştirici / sorun giderici / test cihazına, uygulama değil, o başlığı sağladığımı gösteren bir başlık vermek için bir başlık ekliyorum , ancak uygulama kendi başlığını sağlayarak beni devre dışı bırakabilir. Bu başlığın standart bir şey olmadığını unutmayın - sadece bunu yaptım, takımdaki diğerlerine uygulamayı değil, bu satır içi sağladığımı bilmelerini sağlamak için. Vekiller o kadar sorunsuz ki, yolda olduklarını unutmak gibi kötü bir alışkanlığa sahipler.
Michael - sqlbot
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.