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 Public और Private Cloud के उपयोगकर्ताओं के लिए

गड़बड़ी का पता लगाने के सामान्य चरण

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

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

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

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

  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 है, तो इसका मतलब है कि बैकएंड सर्वर यूआरएल का पाथ खाली है.

ट्रेस

दूसरी प्रक्रिया: Trace टूल का इस्तेमाल करना

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

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

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

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

    error: Request path cannot be empty

    यह गड़बड़ी, Target Request Flow Started फ़ेज़ के बाद 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 Data Recorded) फ़ेज़ पर जाएं और उस पर क्लिक करें.
  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

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

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

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

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

  3. खोजें कि क्या किसी खास अवधि के दौरान, गड़बड़ी कोड 500protocol.http.EmptyPath वाली कोई गड़बड़ी हुई है (अगर समस्या पहले हुई थी) या क्या अब भी 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. एपीआई मॉनिटरिंग, Trace Tool या 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 या ServiceCallout जैसी नीतियों का इस्तेमाल करें.
    2. अगर आपके पास लॉग हैं, तो उनकी समीक्षा करें और:
      1. पुष्टि करें कि target.url में कोई पाथ मौजूद नहीं है. साथ ही,
      2. देखें कि क्या यह पता लगाया जा सकता है कि किस नीति में बदलाव करके target.url पाथ को खाली किया गया है

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

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

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

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

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

    पहला सैंपल

    उदाहरण #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

    दूसरा उदाहरण: JavaScript की नीति को अपडेट करने वाला target.url वैरिएबल

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

    ऊपर दिए गए सैंपल में, ध्यान दें कि फ़्लो वैरिएबल target.url को अपडेट किया गया है. इसके लिए, वैरिएबल url में मौजूद वैल्यू https://mocktarget.apigee.net और दूसरे वैरिएबल 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
    • पाथ: खाली है

    तीसरा सैंपल

    तीसरा सैंपल: 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
    • पाथ: खाली है

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

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

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

    सैंपल #2

    दूसरा उदाहरण: JavaScript की नीति को अपडेट करने वाला target.url वैरिएबल

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

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

    अनुरोध का उदाहरण:

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

    तीसरा सैंपल

    तीसरा सैंपल: AssignMessage नीति, दूसरे वैरिएबल के ज़रिए target.url वैरिएबल को अपडेट कर रही है

    AssignMessage नीति के <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 को उम्मीद है कि बैकएंड सर्वर के यूआरएल में, यहां दी गई खास शर्तों के मुताबिक पाथ खाली नहीं है:

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

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

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

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

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

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

अगर आप Private 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

रेफ़रंस

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