500 सर्वर में गड़बड़ी - खाली पाथ

आपको Apigee Edge दस्तावेज़ दिख रहा है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस पेज पर जाएं Apigee X दस्तावेज़.
जानकारी

समस्या का ब्यौरा

क्लाइंट ऐप्लिकेशन को 500 Internal Server Error का एचटीटीपी स्टेटस कोड मिलता है: एपीआई कॉल के रिस्पॉन्स के तौर पर गड़बड़ी कोड protocol.http.EmptyPath.

गड़बड़ी का मैसेज

क्लाइंट ऐप्लिकेशन को यह रिस्पॉन्स कोड मिलता है:

HTTP/1.1 500 Internal Server Error

इसके अलावा, आपको गड़बड़ी का यह मैसेज भी दिख सकता है:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

संभावित कारण

यह गड़बड़ी तब होती है, जब बैकएंड सर्वर का अनुरोध यूआरएल, फ़्लो वैरिएबल से दिखाया जाता है target.url का पाथ खाली है.

निर्देशों के मुताबिक आरएफ़सी 3986, सेक्शन 3: सिंटैक्स कॉम्पोनेंट और आरएफ़सी 3986, सेक्शन 3.3: पाथ:

  1. यूआरआई सिंटैक्स में ये कॉम्पोनेंट होते हैं:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. path कॉम्पोनेंट जोड़ना ज़रूरी है और इसमें हमेशा फ़ॉरवर्ड स्लैश होना चाहिए (/), भले ही पाथ के हिस्से के तौर पर कोई दूसरा वर्ण न हो.

इसलिए, अगर बैकएंड सर्वर के अनुरोध किए गए यूआरएल में path नहीं है एक तरह का कॉम्पोनेंट होता है. इसका मतलब है कि इसमें Apigee, और फ़ॉरवर्ड स्लैश (/) भी नहीं होता Edge 500 Internal Server Error और गड़बड़ी कोड के साथ जवाब देता है protocol.http.EmptyPath.

उदाहरण के लिए: अगर target.url की वैल्यू https://www.mocktarget.apigee.net है, तो यह गड़बड़ी इस तरह दिखती है path घटक या तो खाली है या मौजूद नहीं है.

वजह ब्यौरा इसके लिए लागू होने वाले, समस्या हल करने के निर्देश
बैकएंड सर्वर के यूआरएल (target.url) का पाथ खाली है फ़्लो वैरिएबल target.url से दिखाए जाने वाले बैकएंड सर्वर यूआरएल में एक खाली पाथ है. Edge के सार्वजनिक और प्राइवेट क्लाउड उपयोगकर्ता

गड़बड़ी की जांच करने के सामान्य तरीके

इस गड़बड़ी का पता लगाने के लिए, इनमें से किसी एक टूल/तकनीक का इस्तेमाल करें:

एपीआई मॉनिटरिंग

प्रोसेस #1: एपीआई मॉनिटरिंग का इस्तेमाल करना

एपीआई मॉनिटरिंग का इस्तेमाल करके, गड़बड़ी का पता लगाने के लिए:

  1. Apigee Edge के यूज़र इंटरफ़ेस (यूआई) में ऐसे उपयोगकर्ता के तौर पर साइन इन करें जिसके साथ की भूमिका होनी चाहिए.
  2. उस संगठन पर जाएं जिसमें आपको समस्या की जांच करनी है.

  3. विश्लेषण > एपीआई मॉनिटरिंग > पेज की जांच करें.
  4. वह समयावधि चुनें जिसमें आपको गड़बड़ियां दिखी थीं.
  5. समय के हिसाब से गड़बड़ी कोड दिखाएं.

  6. वह सेल चुनें जिसमें गड़बड़ी का कोड protocol.http.EmptyPath है, जैसा कि नीचे दिखाया गया है:

  7. गड़बड़ी कोड protocol.http.EmptyPath के बारे में जानकारी इस तरह दिखाई गई है नीचे दिखाया गया है:

  8. पूरे न हो पाने वाले अनुरोध की पंक्ति को बड़ा करने के लिए, लॉग देखें पर क्लिक करें.

  9. लॉग विंडो में जाकर, यह जानकारी देखें:
    • स्टेटस कोड: 500
    • गलत सोर्स: target
    • गलत कोड: protocol.http.EmptyPath
  10. अगर गलत सोर्स target है और गलत कोड protocol.http.EmptyPath है, तो इससे पता चलता है कि बैकएंड सर्वर के यूआरएल में खाली पाथ.

ट्रेस

प्रोसेस #2: ट्रेस टूल का इस्तेमाल करना

ट्रेस टूल का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:

  1. ट्रेस सेशन को चालू करें और
    • 500 Internal Server Error गड़बड़ी आने तक इंतज़ार करें, या
    • अगर आपको समस्या के बारे में अच्छे से पता है, तो समस्या के बारे में बताने के लिए एपीआई कॉल करें 500 Internal Server Error अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  2. पक्का करें कि सभी FlowInfos दिखाएं चालू है:

  3. पूरे न हो पाने वाले अनुरोधों में से किसी एक को चुनें और ट्रेस की जांच करें.
  4. ट्रेस के अलग-अलग फ़ेज़ पर जाएं और देखें कि गड़बड़ी कहां हुई.
  5. आपको गड़बड़ी आम तौर पर टारगेट अनुरोध फ़्लो शुरू होने के बाद फ़्लो में दिखेगी चरण नीचे बताए गए हैं:

  6. ट्रेस में गड़बड़ी की वैल्यू नोट करें.

    गड़बड़ी: अनुरोध के पाथ को खाली नहीं छोड़ा जा सकता

    Apigee Edge से गड़बड़ी, टारगेट अनुरोध का फ़्लो शुरू होने के बाद होती है, इससे पता चलता है कि बैकएंड सर्वर के यूआरएल में मौजूद path खाली है. यह करने में अक्सर तब होता है, जब फ़्लो वैरिएबल target.url (जो बैकएंड सर्वर ) को खाली पाथ के साथ अपडेट किया गया है. ऐसा, इस अनुरोध का फ़्लो.

  7. मौजूदा कॉलम से वापस की ओर हर एक फ़्लो में 'पढ़ा गया' और 'असाइन किया गया वैरिएबल' सेक्शन की जांच करें टारगेट अनुरोध का फ़्लो शुरू हुआ चरण के बारे में बताने वाला गड़बड़ी.
  8. वह नीति तय करें जिसमें फ़्लो वैरिएबल target.url को अपडेट किया जाता है.

    JavaScript नीति दिखाने वाले सैंपल ट्रेस ने फ़्लो वैरिएबल target.url को अपडेट कर दिया है:

    ऊपर दिखाए गए सैंपल ट्रेस में, फ़्लो वैरिएबल की वैल्यू को नोट करें target.url को SetTargetURL नाम की JavaScript नीति में इस तरह अपडेट किया जाता है अनुसरण करता है:

    target.url : https://mocktarget.apigee.net
    
  9. ध्यान दें कि target.url में ये कॉम्पोनेंट होते हैं:
    • स्कीम: https://mocktarget.apigee.net
    • path: खाली
  10. इसलिए, आपको गड़बड़ी Request path cannot be empty मिलती है.
  11. ट्रेस में AX (Analytics डेटा रिकॉर्ड किया गया) चरण पर जाएं और उस पर क्लिक करें.
  12. नीचे स्क्रोल करते हुए चरण से जुड़ी जानकारी - गड़बड़ी हेडर सेक्शन पर जाएं और तय करें कि X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू, जैसा कि यहां दिखाया गया है:

  13. आपको X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू इस तरह दिखेंगी protocol.http.EmptyPath और target का मतलब है कि इसका मतलब है कि यह गड़बड़ी इसलिए हुई है, क्योंकि बैकएंड सर्वर के यूआरएल का पाथ खाली है.
    रिस्पॉन्स हेडर मान
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

प्रक्रिया #3: NGINX ऐक्सेस लॉग का इस्तेमाल करना

NGINX ऐक्सेस लॉग का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:

  1. अगर आप निजी Cloud उपयोगकर्ता हैं, तो यह पता करने के लिए कि NGINX ऐक्सेस लॉग का इस्तेमाल किया जा सकता है या नहीं एचटीटीपी 500 Internal Server Error के बारे में अहम जानकारी.
  2. NGINX ऐक्सेस लॉग देखें:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. यह देखने के लिए खोजें कि क्या गड़बड़ी कोड में कोई 500 गड़बड़ी है किसी खास समय के दौरान protocol.http.EmptyPath (अगर समस्या इतनी देर में हुई पुराना) या अगर कोई अनुरोध अब भी 500 के साथ पूरा नहीं हो पा रहा है.
  4. अगर आपको मेल खाने वाले X-Apigee-fault-code की 500 गड़बड़ी मिलती है protocol.http.EmptyPath का मान निकालें, फिर इसका मान निर्धारित करें: X-Apigee-fault-source.

    NGINX ऐक्सेस लॉग में 500 गड़बड़ी का नमूना:

    NGINX ऐक्सेस लॉग की ऊपर दी गई सैंपल एंट्री में X- के लिए नीचे दिए गए मान हैं Apigee-fault-code और X-Apigee-fault-source:

    हेडर मान
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    ध्यान दें कि X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू हैं protocol.http.EmptyPath और target का मतलब है कि इसका मतलब है कि यह गड़बड़ी तब होती है, जब बैकएंड सर्वर के यूआरएल में खाली पाथ है.

वजह: बैकएंड सर्वर यूआरएल (target.url) का पाथ खाली है

संक्रमण की जांच

  1. यहां बताए गए तरीके से, एपीआई मॉनिटरिंग, ट्रेस टूल या NGINX ऐक्सेस लॉग का इस्तेमाल करके, 500 Internal Server Error के लिए गलत कोड और गलत सोर्स का पता लगाएं डाइग्नोस्टिक्स के सामान्य तरीके.
  2. अगर गलत कोड protocol.http.EmptyPath है और गलत सोर्स में वैल्यू target है, तो इससे पता चलता है कि बैकएंड सर्वर के यूआरएल में खाली है पाथ.
  3. बैकएंड सर्वर का यूआरएल, Apigee में मौजूद फ़्लो वैरिएबल target.url से दिखाया जाता है किनारे. आम तौर पर, यह गड़बड़ी तब होती है, जब बैकएंड सर्वर यूआरएल को अपडेट करने की कोशिश की जाती है. इसका मतलब है कि target.url में से किसी भी नीति का इस्तेमाल करके, डाइनैमिक तौर पर (इनमें) प्रॉक्सी/शेयर किया गया फ़्लो) को इस तरह से सेट करते हैं कि उसका पाथ खाली हो.

  4. पता लगाएं कि क्या फ़्लो चर target.url में वाकई एक खाली पथ है और स्रोत की वैल्यू सेट करने में मदद मिलेगी. इसके लिए नीचे दिया गया तरीका अपनाएं:

    ट्रेस

    ट्रेस टूल का इस्तेमाल करना

    अगर आपने इस गड़बड़ी के लिए कोई ट्रेस कैप्चर किया है, तो यहां बताए गए तरीके का इस्तेमाल करें ट्रेस टूल का इस्तेमाल करना और:

    1. पुष्टि करें कि target.url का पाथ खाली है या नहीं.
    2. अगर हां, तो पता लगाएं कि किस नीति ने खाली पाथ शामिल करने के लिए target.url.

      JavaScript नीति दिखाने वाले सैंपल ट्रेस ने फ़्लो वैरिएबल को अपडेट कर दिया target.url:

    3. ऊपर दिए गए सैंपल ट्रेस में, ध्यान दें कि JavaScript नीति में बदलाव किया गया है या खाली पाथ को शामिल करने के लिए, target.url की वैल्यू अपडेट की गई.
    4. ध्यान दें कि target.url में ये कॉम्पोनेंट मौजूद हैं:
      • स्कीम: https://mocktarget.apigee.net
      • path: खाली

    लॉग

    अपने लॉग सर्वर में लॉग इस्तेमाल करना

    1. अगर आपको इस गड़बड़ी (बार-बार होने वाली समस्या) के लिए कोई ट्रेस नहीं मिलता है, तो देखें कि आपने फ़्लो वैरिएबल की वैल्यू के बारे में जानकारी लॉग की है या नहीं target.url की नीतियों का इस्तेमाल किया जा रहा है MessageLogging या सेवा कॉलआउट का इस्तेमाल अपने लॉग सर्वर पर करें.
    2. अगर आपके पास लॉग हैं, तो उनकी समीक्षा करें और:
      1. पुष्टि करें कि target.url का पाथ खाली है या नहीं.
      2. देखें कि क्या यह तय किया जा सकता है कि target.url किस नीति में बदलाव किया गया है खाली पाथ शामिल करें

    एपीआई प्रॉक्सी

    काम न करने वाले एपीआई प्रॉक्सी की समीक्षा करना

    अगर आपके पास इस गड़बड़ी के लिए कोई ट्रेस या लॉग नहीं हैं, तो काम न करने वाले एपीआई की समीक्षा करें प्रॉक्सी के ज़रिए यह पता लगाया जा सकता है कि फ़्लो वैरिएबल target.url में कौनसे बदलाव किए गए या कौनसे अपडेट हुए ताकि अमान्य पाथ शामिल न हो. इनकी जांच करें:

    • एपीआई प्रॉक्सी में मौजूद नीति
    • प्रॉक्सी सर्वर से शुरू किया गया कोई भी शेयर किया गया फ़्लो
  5. नीति में बदलाव करने वाली उस नीति (उदाहरण के लिए, assignMessage या JavaScript) की जांच करें फ़्लो वैरिएबल target.url को ध्यान से अपडेट करता है और अपडेट करने की वजह तय करता है खाली पाथ पाने के लिए target.url.

    फ़्लो वैरिएबल target.url को अपडेट करने वाली नीतियों के कुछ उदाहरण यहां दिए गए हैं में 'गलत है' का इस्तेमाल किया गया है.

    सैंपल #1

    सैंपल #1: target.url वैरिएबल को अपडेट करने वाली JavaScript नीति

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    ऊपर दिए गए नमूने में, ध्यान दें कि फ़्लो वैरिएबल target.url को अपडेट किया गया है किसी दूसरे वैरिएबल में मौजूद https://mocktarget.apigee.net मान के साथ url.

    ध्यान दें कि target.url में ये कॉम्पोनेंट मौजूद हैं:

    • स्कीम: https://mocktarget.apigee.net
    • path: खाली

    पाथ खाली है, इसलिए Apigee Edge, 500 Internal Server Error को इसके साथ दिखाता है गड़बड़ी कोड protocol.http.EmptyPath.

    सैंपल #2

    सैंपल #2: target.url वैरिएबल को अपडेट करने वाली JavaScript नीति

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    ऊपर दिए गए नमूने में, ध्यान दें कि फ़्लो वैरिएबल target.url को वैरिएबल में मौजूद वैल्यू https://mocktarget.apigee.net को जोड़ना url और किसी अन्य वैरिएबल path की वैल्यू, जिसके लिए मान request.header.Path. से फिर से लिया गया है

    अगर आपके पास असल अनुरोध या ट्रेस का ऐक्सेस है, तो असल वैल्यू की पुष्टि की जा सकती है request.header.Path को पास किया गया.

    उपयोगकर्ता के किए गए अनुरोध का सैंपल:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    इस उदाहरण में, हेडर पाथ को अनुरोध के हिस्से के तौर पर नहीं भेजा गया है. इसलिए, मान JavaScript नीति में वैरिएबल पाथ null है.

    इसलिए:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    ध्यान दें कि target.url में ये कॉम्पोनेंट होते हैं:

    • स्कीम: https://mocktarget.apigee.netnull
    • path: खाली

    सैंपल #3

    सैंपल #3: assignMessage नीति के ज़रिए target.url वैरिएबल अपडेट किया जा रहा है कोई अन्य वैरिएबल

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    ध्यान दें कि target.url में ये कॉम्पोनेंट होते हैं:

    • स्कीम: https://mocktarget.apigee.net
    • path: खाली

    ऊपर दिए गए सभी उदाहरणों में, बैकएंड सर्वर यूआरएल का पाथ target.url खाली है. इसलिए, Apigee Edge वापस आ रहा है protocol.http.EmptyPath गड़बड़ी कोड के साथ 500 Internal Server Error.

रिज़ॉल्यूशन

स्पेसिफ़िकेशन के मुताबिक आरएफ़सी 3986, सेक्शन 2: सिंटैक्स कॉम्पोनेंट, path कॉम्पोनेंट यह है ज़रूरी है. साथ ही, इसमें हमेशा फ़ॉरवर्ड स्लैश (/) होना चाहिए, भले ही कोई path के हिस्से के रूप में अन्य वर्ण. इसके लिए, नीचे दिया गया तरीका अपनाएं इस समस्या को ठीक करें:

  1. पक्का करें कि बैकएंड सर्वर यूआरएल, फ़्लो वैरिएबल से दिखाया जाता है target.url का पाथ हमेशा खाली नहीं होता.
    1. कुछ मामलों में, हो सकता है कि पाथ में संसाधन का नाम न हो. इसके बाद, पक्का करें कि पाथ कम से कम एक फ़ॉरवर्ड स्लैश (/) है.
    2. अगर फ़्लो वैरिएबल की वैल्यू तय करने के लिए, किसी अन्य वैरिएबल का इस्तेमाल किया जाता है target.url को चुनें. इसके बाद, पक्का करें कि दूसरे वैरिएबल का पाथ खाली न हो.
    3. अगर फ़्लो वैरिएबल की वैल्यू पता करने के लिए, स्ट्रिंग में कोई कार्रवाई की जाती है target.url, इसके बाद पक्का करें कि स्ट्रिंग का नतीजा या नतीजा हो कार्रवाइयों का पाथ खाली नहीं है.
  2. डायग्नोसिस में बताए गए सैंपल में, इस समस्या को इस तरह ठीक किया जा सकता है ज़्यादा जानकारी यहां दी गई है:

    सैंपल #1

    सैंपल #1: target.url वैरिएबल को अपडेट करने वाली JavaScript नीति

    इसे ठीक करने के लिए, वैरिएबल url में फ़ॉरवर्ड स्लैश (/) जोड़ें समस्या है, जैसा कि नीचे दिखाया गया है:

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    सैंपल #2

    सैंपल #2: target.url वैरिएबल को अपडेट करने वाली JavaScript नीति

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    पक्का करें कि आपने एक मान्य पाथ पास किया हो. उदाहरण के लिए, /iloveapis नीचे दिखाए गए तरीके से इस समस्या को ठीक करने के लिए, हेडर Path का अनुरोध करें:

    अनुरोध का सैंपल:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    सैंपल #3

    सैंपल #3: assignMessage नीति के ज़रिए target.url वैरिएबल अपडेट किया जा रहा है कोई अन्य वैरिएबल

    ConsentMessage नीति के <Value> एलिमेंट में मान्य पाथ जोड़ें. इसके लिए उदाहरण के लिए, आपके पास /json को MockTarget एपीआई. इसका मतलब है कि <Value> एलिमेंट में बदलाव करके https://mocktarget.apigee.net/json, जैसा कि नीचे दिखाया गया है:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

खास जानकारी

Apigee Edge के लिए यह ज़रूरी है कि बैकएंड सर्वर यूआरएल में खाली पाथ न हो ये खास जानकारी यहां दी गई हैं:

खास जानकारी
आरएफ़सी 3986, सेक्शन 3: सिंटैक्स कॉम्पोनेंट
आरएफ़सी 3986, सेक्शन 3.3: पाथ

अगर आपको अब भी Apigee की सहायता टीम से कोई मदद चाहिए, तो यहां जाएं गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है.

गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है

अगर ऊपर दिए गए निर्देशों का पालन करने के बाद भी समस्या बनी रहती है, तो यह जानकारी इकट्ठा करें और उसके बाद Apigee Edge सहायता से संपर्क करें.

अगर आप सार्वजनिक क्लाउड के उपयोगकर्ता हैं, तो यह जानकारी दें:

  • संगठन का नाम
  • परिवेश का नाम
  • एपीआई प्रॉक्सी का नाम
  • 500 Internal Server Error को गड़बड़ी कोड protocol.http.EmptyPath के साथ फिर से दिखाने के लिए इस्तेमाल किए गए curl निर्देश को पूरा करें
  • एपीआई अनुरोधों के लिए फ़ाइल ट्रेस करें

अगर आप निजी Cloud उपयोगकर्ता हैं, तो यह जानकारी दें:

  • पूरे न हो पाने वाले अनुरोधों की वजह से, गड़बड़ी का पूरा मैसेज मिला
  • परिवेश का नाम
  • एपीआई प्रॉक्सी बंडल
  • एपीआई अनुरोधों के लिए फ़ाइल ट्रेस करें
  • NGINX ऐक्सेस के लॉग:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    कहां: ORG, ENV और PORT# को इससे बदल दिया गया है सेट करें.

  • मैसेज प्रोसेसर के सिस्टम लॉग /opt/apigee/var/log/edge-message- processor/logs/system.log

रेफ़रंस

फ़्लो वैरिएबल - टारगेट