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

Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं.
जानकारी

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

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

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

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

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
    • पाथ: खाली
  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. अगर आप प्राइवेट क्लाउड उपयोगकर्ता हैं, तो एचटीटीपी 500 Internal Server Error के बारे में अहम जानकारी तय करने के लिए, NGINX ऐक्सेस लॉग का इस्तेमाल कर सकते हैं.
  2. NGINX ऐक्सेस लॉग देखें:

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

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

    लॉग

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

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

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

    फ़ेल हो रहे एपीआई प्रॉक्सी की समीक्षा करना

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

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

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

    नमूना #1

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

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

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

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

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

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

    नमूना #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 को अपडेट करने के लिए, किसी वैरिएबल में मौजूद url और किसी ऐसे वैरिएबल path की वैल्यू को जोड़ा गया है जिसका वैल्यू request.header.Path. से मिला हैhttps://mocktarget.apigee.net

    अगर आपके पास असल अनुरोध या ट्रेस का ऐक्सेस है, तो 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
    • पाथ: खाली

    नमूना #3

    सैंपल #3: AssignmentsMessage नीति किसी दूसरे वैरिएबल की मदद से 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
    • पाथ: खाली

    ऊपर दिए गए सभी उदाहरणों में, बैकएंड सर्वर यूआरएल में 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 वैरिएबल अपडेट करना

    AssignmentsMessage नीति के <Value> एलिमेंट में सही पाथ जोड़ें. उदाहरण के लिए, आपके पास MockTarget API के पाथ के तौर पर /json का इस्तेमाल किया जा सकता है. इसका मतलब है कि <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 को पता है कि नीचे दिए गए निर्देशों के मुताबिक, बैकएंड सर्वर के यूआरएल में कोई खाली पाथ न हो:

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

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

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

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

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

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

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

  • असफल अनुरोधों के लिए देखा गया पूरा गड़बड़ी का मैसेज
  • परिवेश का नाम
  • एपीआई प्रॉक्सी बंडल
  • एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
  • 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

References

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