अनुरोध URI के आधार पर HAproxy 1.6 के साथ प्रतिक्रिया हेडर कैसे जोड़ें?


9

मैं tomproat सर्वर के सामने लोड बैलेंसर के रूप में HAproxy 1.6 का उपयोग करता हूं।

मुझे URI अनुरोध के आधार पर प्रतिक्रिया हेडर जोड़ना होगा।

उदाहरण के लिए, मैं प्रतिक्रिया शीर्षलेख जोड़ना चाहूंगा Cache-Control public,max-age="600"जब अनुरोध uri है, /apiलेकिन तब नहीं जब अनुरोध uri कुछ और हो।

  • Http- प्रतिक्रिया में हेडर जोड़ने के लिए पथ पर आधारित acl का उपयोग करने का मेरा पहला प्रयास था:

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

    जब मैं के साथ haproxy शुरू करता हूं -d, तो मुझे चेतावनी देते हुए कहते हैं कि path_reg(या path) इसके साथ असंगत है 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'
    
  • मैंने http-requestइसके बजाय हेडर जोड़ने की कोशिश की http-response:

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

    काम किया है, लेकिन मुझे प्रतिक्रिया में इसकी आवश्यकता है

  • मैंने haproxy चर का उपयोग करने की भी कोशिश की:

    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
    

    लेकिन जब मैं कोशिश करता हूं कि HAproxy ईवेंट प्रारंभ नहीं करता है और मेरे पास निम्न त्रुटि है:

    [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)]'.
    

प्रतिक्रिया शीर्षलेख सेट करने के लिए मैं एक acl में अनुरोध पथ का उपयोग कैसे कर सकता हूं?

जवाबों:


9

इसे इस्तेमाल करे:

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

capture.req.uriजब तक प्रतिक्रिया संसाधित नहीं होती, तब तक बनी रहती है, इसके विपरीत path, जो नहीं होती है।

कुछ नोट:

यह उदाहरण एक अनाम ACL का उपयोग करता है। आप इसे एक नामित ACL के साथ भी कर सकते हैं, लेकिन यह 2 लाइनें लेता है।

कोई कारण नहीं है कि मुझे पता है कि आपको अधिकतम-आयु मूल्य क्यों उद्धृत करना चाहिए।

आप शायद नहीं चाहते हैं add-header, आप चाहते हैं set-header, जो यह सुनिश्चित करता है कि यदि कोई पहले से मौजूद है, तो उसे हटा दिया जाएगा।

acl path_acl %[var(txn.path)] -m ^/api/(.*)$शायद सही ढंग से लिखा गया है acl path_acl var(txn.path) -m ^/api/(.*)$। HAProxy के बारे में थोड़ा बारीक है जब यह उम्मीद करता है %[ ]और जब यह नहीं करता है। मुझे यकीन है कि एक पैटर्न है, लेकिन मैं अभी स्पष्ट नहीं हूं कि क्या है।


1
आपकी प्रतिक्रिया के लिए धन्यवाद। capture.req.uriहटाने के दौरान विधि और चर दोनों का उपयोग %[ ]किया acl̀जाता है। आप max-ageमूल्य के आसपास और set-headerइसके बजाय उद्धरण के बारे में भी सही हैं add-header
jmlrt

1
ध्यान दें कि आंतरिक रूप से, मैं कुछ ऐसा ही करता हूं, अगर बैक-एंड Cache-Controlप्रतिक्रिया नहीं देता है: मैं Cache-Control-Authority: implicit, gatewayडेवलपर / समस्या निवारक / परीक्षक को हेड-अप देने के लिए एक हेडर जोड़ता हूं कि मैं, प्रॉक्सी, वह हेडर प्रदान कर रहा हूं, एप्लिकेशन नहीं , लेकिन ऐप केवल अपने हेडर प्रदान करके मुझे अक्षम कर सकता है। ध्यान दें कि यह हेडर कुछ भी मानक नहीं है - मैंने अभी इसे बनाया है, टीम के अन्य लोगों को यह जानने में मदद करने के लिए कि मैं यह इन-लाइन प्रदान कर रहा हूं, ऐप नहीं। समीपता इतनी परेशानी से मुक्त है कि उन्हें यह भूलने की बुरी आदत है कि वे रास्ते में हैं।
माइकल - साइक्लोबॉट डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.