500 שגיאת שרת פנימית - EmptyPath

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 500 Internal Server Error עם את קוד השגיאה protocol.http.EmptyPath כתגובה לקריאות ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 500 Internal Server Error

בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:

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

גורמים אפשריים

השגיאה הזו מתקבלת אם כתובת ה-URL של הבקשה של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה target.url, מכיל נתיב ריק.

בהתאם למפרט RFC 3986, סעיף 3: רכיבי תחביר וגם RFC 3986, סעיף 3.3: נתיב:

  1. תחביר ה-URI כולל את הרכיבים הבאים:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. הרכיב path הוא חובה וחייב תמיד להיות בו קו נטוי קדימה (/), גם אם אין תווים אחרים כחלק מהנתיב.

לכן, אם כתובת ה-URL של הבקשה של שרת הקצה העורפי לא כוללת את השדה path רכיב בכלל, כלומר אין בו אפילו קו נטוי לפנים (/), ואז ב-Apigee התגובה של Edge היא 500 Internal Server Error וקוד השגיאה protocol.http.EmptyPath

לדוגמה: אם target.url מכיל את הערך https://www.mocktarget.apigee.net, השגיאה הזו מתרחשת path הרכיב ריק או חסר.

סיבה תיאור הוראות לפתרון בעיות עבור
בכתובת ה-URL של שרת הקצה העורפי (target.url) יש נתיב ריק כתובת ה-URL של שרת הקצה העורפי שמיוצגת על ידי משתנה הזרימה target.url מכילה נתיב ריק. משתמשי Edge בענן הציבורי והפרטי

שלבי אבחון נפוצים

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

הליך מס' 1: שימוש במעקב API

כדי לאבחן את השגיאה באמצעות API Monitoring:

  1. נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לחקור את הבעיה.

  3. מנווטים אל ניתוח > מעקב API > לחקור את הדף.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. הציגו את קוד התקלה ביחס ל-Time.

  6. צריך לבחור תא עם קוד השגיאה protocol.http.EmptyPath, כמו בדוגמה הבאה:

  7. מידע על קוד התקלה protocol.http.EmptyPath מוצג כך למטה:

  8. לוחצים על צפייה ביומנים כדי להרחיב את השורה של הבקשה שנכשלה.

  9. בחלון יומנים שימו לב לפרטים הבאים:
    • קוד סטטוס: 500
    • מקור התקלה: target
    • קוד התקלה: protocol.http.EmptyPath
  10. אם מקור התקלה הוא target ו-קוד השגיאה הוא protocol.http.EmptyPath, אז מציין שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב ריק.

Trace

הליך מס' 2: שימוש בכלי המעקב

כדי לאבחן את השגיאה באמצעות כלי המעקב:

  1. להפעיל את סשן המעקב ואז
    • צריך להמתין עד שהשגיאה 500 Internal Server Error תתרחש, או
    • אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה 500 Internal Server Error
  2. מוודאים שהאפשרות Show all FlowInfos מופעלת:

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. צריך לעבור בין השלבים השונים במעקב ולאתר את מקום הכשל.
  5. השגיאה בדרך כלל תופיע בתהליך אחרי שהתחיל תהליך היעד של הבקשה בשלב הבא:

  6. בודקים את ערך השגיאה במעקב.

    שגיאה: נתיב הבקשה לא יכול להיות ריק

    מכיוון שהשגיאה נוצרה על ידי Apigee Edge אחרי השלב Target Request Flow Started, הוא מציין שה-path בכתובת ה-URL של שרת הקצה העורפי ריק. במקרה כזה מתרחשת סבירות גבוהה ביותר אם משתנה הזרימה target.url (המייצג את כתובת ה-URL של שרת עורפי ) אולי עודכן עם נתיב ריק דרך אחד מכללי המדיניות ב תהליך הבקשה.

  7. לעיין בסעיף משתנים שנקראו והוקצו בכל אחד מהתהליכים שחוזרים אחורה ספציפית לשלב התחיל תהליך היעד של הבקשה.
  8. קובעים את המדיניות שבה משתנה הזרימה target.url מתעדכן.

    דוח מעקב לדוגמה שמציג את המדיניות בנושא JavaScript עדכנה את משתנה הזרימה target.url:

    במעקב לדוגמה שלמעלה, שימו לב לערך של משתנה הזרימה target.url מעודכן במדיניות JavaScript בשם SetTargetURL בתור ככה:

    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 בהתאמה, מציינים השגיאה הזו מתרחשת כי בכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק.
    כותרות של תשובות ערך
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

הליך מס' 3: שימוש ביומני גישה ל-NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשים של ענן פרטי, אתם יכולים להשתמש ביומני הגישה ל-NGINX כדי להבין את המידע העיקרי על HTTP 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. אם מופיעות שגיאות 500 עם התאמה של X-Apigee-fault-code את הערך של protocol.http.EmptyPath, ואז קובעים את הערך X-Apigee-fault-source.

    דוגמה לשגיאה 500 ביומן הגישה ל-NGINX:

    הרשומה לדוגמה שלמעלה מיומן הגישה ל-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 בהתאמה, מציינים השגיאה הזו מתרחשת כי בכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק.

הסיבה: בכתובת ה-URL של שרת הקצה העורפי (target.url) יש נתיב ריק

אבחון

  1. מגדירים את Fault Code ואת מקור התקלה של 500 Internal Server Error באמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כמו שמוסבר ב שלבי האבחון הנפוצים.
  2. אם קוד התקלה הוא protocol.http.EmptyPath ו-Fault Source כולל הערך target, אז הוא מציין שכתובת ה-URL של שרת הקצה העורפי ריקה .
  3. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה target.url ב-Apigee קצה. בדרך כלל, השגיאה הזו קורית כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי, כלומר target.url באופן דינמי באמצעות כל אחד מכללי המדיניות (בתוך שרת proxy/תהליך משותף) בתהליך הבקשה ליעד, כלומר יש נתיב ריק.

  4. בודקים אם משתנה הזרימה target.url אכן מכיל נתיב ריק את הערך של המקור באמצעות אחת מהשלבים הבאים:

    Trace

    שימוש בכלי המעקב

    אם תיעדתם מעקב אחרי השגיאה הזו, אתם יכולים לפעול לפי השלבים שמתוארים ב באמצעות כלי המעקב וגם:

    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 או ServiceCallout לשרת היומנים.
    2. אם יש לכם את היומנים, עליכם לבדוק אותם ואז:
      1. צריך לבדוק אם ב-target.url יש נתיב ריק, וגם
      2. בדיקה אם אפשר לקבוע איזו מדיניות שונתה target.url להכיל נתיב ריק

    API מסוג proxy

    בדיקה של שרת ה-proxy ל-API שנכשלו

    אם אין לכם מעקב או יומנים לגבי השגיאה הזו, אתם יכולים לבדוק את ה-API שנכשל שרת proxy כדי לקבוע מה שינה או עדכן את משתנה הזרימה target.url כדי להכיל נתיב לא חוקי. בדוק את הפרטים הבאים:

    • המדיניות בתוך שרת proxy ל-API
    • כל תהליכי העבודה המשותפים שהופעלו על ידי שרת ה-proxy
  5. לבדוק את המדיניות הספציפית (לדוגמה, AssignMessage או JavaScript) שמשנה או מעדכנים את משתנה הזרימה target.url בקפידה וקובעים את הסיבה לעדכון target.url מכיל נתיב ריק.

    לפניכם מספר כללי מדיניות לדוגמה לעדכון משתנה הזרימה target.url כך שהוא לא מכיל נתיב ריק שמוביל לשגיאה הזו.

    דוגמא מס' 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

    דוגמה שנייה: עדכון של משתנה 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: ריק

    בכל הדוגמאות שלמעלה, הנתיב בכתובת ה-URL של שרת הקצה העורפי, השדה target.url ריק, ולכן Apigee Edge מחזירה 500 Internal Server Error עם קוד השגיאה protocol.http.EmptyPath.

רזולוציה

לפי המפרט RFC 3986, סעיף 2: רכיבי התחביר, הרכיב path הוא חובה ותמיד צריך להיות בו קו נטוי (/), גם אם אין תווים אחרים כחלק מpath. צריך לבצע את השלבים הבאים כדי כדי לפתור את הבעיה:

  1. עליך לוודא שכתובת האתר של שרת הקצה העורפי, שמיוצגת על ידי משתנה הזרימה target.url תמיד מכיל נתיב שאינו ריק.
    1. במקרים מסוימים אין שם משאב בנתיב, ולכן יש לוודא שהנתיב מכיל קו נטוי קדימה (/) לפחות.
    2. אם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה, target.url, ולאחר מכן מוודאים שאין נתיב ריק במשתנים אחרים.
    3. אם מבצעים פעולות מחרוזת כלשהן כדי לקבוע את הערך של משתנה הזרימה target.url, ואז מוודאים שהתוצאה או התוצאה של המחרוזת אין נתיב ריק.
  2. בדוגמאות שמופיעות בקטע אבחון, אפשר לפתור את הבעיה כך: כפי שמוסבר בהמשך:

    דוגמא מס' 1

    דוגמה ראשונה: עדכון של משתנה target.url במדיניות JavaScript

    כדי לתקן את הבעיה, צריך להוסיף קו נטוי קדימה (/) למשתנה url כפי שמוצג בהמשך:

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

    דוגמא מס' 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 באמצעות משתנה אחר

    צריך להוסיף נתיב חוקי לרכיב <Value> של מדיניות AssignMessage. עבור לדוגמה, אפשר להגדיר את /json כנתיב של MockTarget API כלומר, לשנות את הרכיב <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 מצפה שלכתובת ה-URL של שרת הקצה העורפי אין נתיב ריק, בהתאם המפרטים הבאים:

מפרט
RFC 3986, סעיף 3: רכיבי תחביר
RFC 3986, סעיף 3.3: נתיב

אם עדיין דרושה לך עזרה מהתמיכה של Apigee, אפשר לעבור אל חובה לאסוף את פרטי האבחון.

צריך לאסוף את פרטי האבחון

אם הבעיה נמשכת גם לאחר ביצוע ההוראות שלמעלה, יש לאסוף את הפריטים הבאים את נתוני האבחון, ואז פונים לתמיכה של Apigee Edge.

אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם ה-API של ה-Proxy
  • צריך להשלים את הפקודה curl שמשמשת לשחזור 500 Internal Server Error עם קוד השגיאה protocol.http.EmptyPath
  • קובץ מעקב אחר בקשות ה-API

אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:

  • הודעת שגיאה מלאה שנצפתה בבקשות שנכשלו
  • שם הסביבה
  • חבילת proxy ל-API
  • קובץ מעקב אחר בקשות ה-API
  • יומני גישה ל-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

קובצי עזר

משתנים משתנים – יעד