HAProxy reqrep बैकएंड अनुरोध पर URI को हटा दें


27

HAProxy reqrep के बारे में वास्तविक त्वरित प्रश्न। मैं उस अनुरोध को फिर से लिखने / बदलने की कोशिश कर रहा हूं जो बैकएंड को भेजा जाता है।

मेरे पास निम्न उदाहरण डोमेन और यूआरआई हैं, दोनों एक ही डोमेन नाम को साझा कर रहे हैं, लेकिन विभिन्न बैकएंड वेब सर्वर पूल हैं।

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

मैं चाहता हूं कि वेब 1 वेबफर्म 1 का बैकएंड पर जाए, और वेब 2 वेबफार्म 2 पर जाए। वर्तमान में ऐसा होता है। हालाँकि, जब बैकएंड को अनुरोध भेजा जाता है, तो मैं web1 या web2 URI से अलग करना चाहता हूं।

यहाँ मेरा 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

यदि मैं जाता हूं http://domain/web1या http://domain/web2मैं इसे त्रुटि लॉग में देखता हूं कि प्रत्येक बैकएंड में एक सर्वर पर अनुरोध जो क्रमशः संसाधन / web1 या / web2 के लिए है। इसलिए मेरा मानना ​​है कि मेरी नियमित अभिव्यक्ति में कुछ गड़बड़ है, भले ही मैंने इसे डॉक्यूमेंटेशन से कॉपी और पेस्ट किया हो। http://code.google.com/p/haproxy-docs/wiki/reqrep

सारांश: मैं URI पर आधारित ट्रैफ़िक को रूट करने की कोशिश कर रहा हूँ, हालाँकि मैं चाहता हूँ कि जब यह बैकएंड पूल को रिक्वेस्ट भेजता है तो मैं URI को स्ट्रिप कर दूंगा।

धन्यवाद!

-जिम


अब एक संपादन और टिप्पणी बटन है।
क्रिस एस

1
जिम, आपको टिप्पणी करने में समस्या हो रही है क्योंकि आप इस प्रश्न को बनाने के लिए उपयोग किए जाने वाले किसी भिन्न खाते से लॉग इन हैं। कृपया कोशिश करें और अपने लॉगिन खाते को सुसंगत रखें ताकि भविष्य में ऐसा न हो। मैंने इसे ठीक करने के लिए एक मॉडरेटर को चिह्नित किया है।
एमडीएमरा

जवाबों:


28

आपके पास यह है:

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

मुझे लगता है कि आप यह चाहते हैं:

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

यह अंतर कि वेबएन के छोड़े जाने के बाद दूसरा काम करेगा।

नीचे अपनी टिप्पणी के जवाब में, इस बारे में विस्तार से जाना कि काम के ऊपर के भाव मेरे द्वारा दिए गए प्रयासों से अधिक कैसे हैं। हालांकि, शायद इससे मदद मिलेगी।

अनुरोध स्ट्रिंग में web1 से पहले आने वाली हर चीज़ को "web1" "कैप्चर" किया जाता है। इसलिए आमतौर पर यह GET या POST होगा। The। *) Web1 के बाद सब कुछ "कैप्चर" करता है, अगर कुछ नहीं है तो कुछ भी नहीं।

अगला भाग ( \1\2) कहता है कि उन कब्जे वाले हिस्सों का क्या करना है। यह \1(पहले कब्जा किए गए भाग) से बना एक स्ट्रिंग बनाने के लिए कहता है और \2(दूसरे कैप्चर किए गए भाग के बाद)। चूंकि web1 को कभी भी कैप्चर नहीं किया जाता है, इसलिए इसे अंतिम आउटपुट में इकट्ठा नहीं किया जाता है।


\ 1 \ 2 \ 3 क्या दर्शाता है? Reqrep प्रलेखन के बारे में ^ ([^ \] *) \ do क्या करता है? यहाँ प्रलेखन पृष्ठ पर उदाहरण दिया गया है। # किसी भी अनुरोध पथ की शुरुआत में "/ स्थिर /" को "/" से बदलें। reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
जिम

आपकी टिप्पणी को पढ़ने के बाद, मुझे एहसास हुआ कि मेरा प्रस्तावित समाधान थोड़ा जटिल था। मैंने इसे सरल बनाया।
लॉन्गनेक

तो reqrep सिंटैक्स क्या है? reqrep {string_2_search_thru} {search_string} {प्रतिस्थापित_string}? मैं \ 1 \ 2 \ 3 के रूप में उलझन में हूँ?
जिम

यदि उपयोगकर्ता डालता है / web1 या / web1 / काम करने के लिए इस reqrep को शामिल करने का कोई तरीका है?
जिम

क्या तुमने कोशिश की?
लॉन्गनेक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.