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

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

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

הודעת שגיאה

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

HTTP/1.1 500 Internal Server Error

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

{
   "fault":{
      "faultstring":"Invalid request path",
      "detail":{
         "errorcode":"protocol.http.BadPath"
      }
   }
}

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

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

בהתאם למפרטים RFC 3986, section 3: Syntax Components and RFC 3986, section 3.3: Path:

  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.BadPath.

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

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

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

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

API Monitoring

תהליך מספר 1: שימוש ב-API Monitoring

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

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

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

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

  7. המידע על קוד התקלה protocol.http.BadPath מוצג כמו בדוגמה הבאה:

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

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

מעקב

תהליך מספר 2: שימוש בכלי המעקב

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

  1. מפעילים את trace session ואת אחת מהאפשרויות הבאות:
    • ממתינים להתרחשות השגיאה 500 Internal Server Error, או
    • אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה 500 Internal Server Error
  2. מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

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

  6. שימו לב לערך השגיאה מהמעקב:

    error: Invalid request path

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

  7. בודקים את הקטע Variables Read and Assigned (משתנים שנקראו והוקצו) בכל אחד מהזרימות אחורה מהזרימה שבה התרחשה השגיאה לכיוון השלב Target Request Flow Started (התחילה זרימת בקשת היעד).
  8. מגדירים את המדיניות, שבה משתנה הזרימה target.url was updated:

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

    בדוגמה שלמעלה, שימו לב שהערך של משתנה הזרימה variable target.url מתעדכן במדיניות JavaScript בשם JS- SetTargetURL באופן הבא: target.url : https://mocktarget.apigee.net?json

  9. שימו לב שהערך ב-target.url כולל את הרכיבים הבאים:
    • scheme: https
    • authority: mocktarget.apigee.net
    • path: ?json
  10. מכיוון שרכיב הנתיב מתחיל בסימן שאלה (?) ולא בקו נטוי (/), מוצגת השגיאה Invalid request path.
  11. עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
  12. גוללים למטה לקטע Phase Details - Error Headers וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source כמו שמוצג בהמשך:

  13. הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו protocol.http.BadPath ו-target בהתאמה, מה שמציין שהשגיאה הזו נגרמת כי הנתיב של כתובת ה-URL של שרת הקצה העורפי לא תקין.

    כותרות תגובה ערך
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

NGINX

תהליך מספר 3: שימוש ביומני גישה של NGINX

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

  1. אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי HTTP 500 Internal Server Error.
  2. בודקים את יומני הגישה של NGINX:

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

  3. מחפשים שגיאות 500 עם קוד שגיאה protocol.http.BadPath במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 500.
  4. אם מצאתם שגיאות 500 עם X-Apigee-fault-code שמתאים לערך של protocol.http.BadPath, צריך לקבוע את הערך של X-Apigee-fault-source.

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

    בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:

    כותרות ערך
    X-Apigee-fault-code protocol.http.BadPath
    X-Apigee-fault-source target

    שימו לב לערכים של X-Apigee-fault-code ו-X-Apigee-fault-source שהם protocol.http.BadPath ו-target בהתאמה. הערכים האלה מציינים שהשגיאה נגרמת בגלל שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב לא תקין.

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

אבחון

  1. קובעים את קוד השגיאה ואת מקור השגיאה של 500 Internal Server Error באמצעות API Monitoring,‏ Trace Tool או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. אם קוד השגיאה הוא protocol.http.BadPath ולמקור השגיאה יש את הערך target, זה מצביע על כך שלכתובת ה-URL של שרת הקצה העורפי יש נתיב לא תקין.
  3. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה target.url ב-Apigee Edge. השגיאה הזו מתרחשת בדרך כלל אם מנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי (target.url) באופן דינמי באמצעות אחת ממדיניות (בתוך proxy/shared flow) בתהליך בקשת היעד, כך שיהיה לה נתיב לא תקין.

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

    מעקב

    שימוש בכלי Trace

    אם צילמתם את הנתונים של השגיאה הזו, אתם יכולים לפעול לפי השלבים שמפורטים במאמר בנושא שימוש בכלי Trace .

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

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

    3. בדוגמה שלמעלה של מעקב, אפשר לראות שמדיניות JavaScript שינתה או עדכנה את הערך של target.url כך שיכיל נתיב לא תקין.
    4. שימו לב ש-target.url כולל את הרכיבים הבאים:
      • scheme: https
      • authority: mocktarget.apigee.net
      • path: ?json

      הנתיב מתחיל בסימן שאלה (?) במקום בקו נטוי קדימה (/), ולכן הוא לא תקין.

    יומנים

    שימוש ביומנים בשרת היומנים

    1. אם אין לכם מעקב לשגיאה הזו (בעיה לסירוגין), אתם יכולים לבדוק אם רשמתם ביומן את המידע על הערך של משתנה הזרימה target.url, באמצעות מדיניות כמו MessageLogging או ServiceCallout בשרת היומן.
    2. אם יש לכם את היומנים, כדאי לעיין בהם ולנסות
      1. בודקים אם הנתיב ב-target.url לא תקין, ו
      2. כדאי לבדוק אם אפשר לזהות את המידע לגבי המדיניות ששונתה target.url כך שתכלול נתיב לא תקין

    proxy ל-API

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

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

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

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

    דוגמה 1

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

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

    בדוגמה שלמעלה, שימו לב שמשתנה הזרימה target.url מתעדכן בערך https://mocktarget.apigee.net?json שכלול במשתנה אחר url..

    שימו לב שהערך של url כולל את הרכיבים הבאים:

    • scheme: https
    • authority: mocktarget.apigee.net
    • path: ?json

    הנתיב מתחיל בסימן שאלה (?) במקום בקו נטוי קדימה (/), וזה לא תקין. לכן, Apigee Edge מחזיר 500 Internal Server Error עם קוד השגיאה protocol.http.BadPath.

    דוגמה מס' 2

    דוגמה 2: עדכון מדיניות JavaScript של המשתנה target.url על סמך הערך ב-request header

    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> -H "Path: ?user"
    

    בדוגמה הזו, נתיב הכותרת לא נשלח כחלק מהבקשה. לכן, הערך של המשתנה path במדיניות JavaScript הוא null.

    כך:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + "?user"
    • target.url = https://mocktarget.apigee.net?user

    שימו לב שהערך של target.url כולל את הרכיבים הבאים:

    • scheme: https
    • authority: mocktarget.apigee.net
    • path: ?user

    הנתיב מתחיל בסימן שאלה (?) במקום בקו נטוי קדימה (/), וזה לא תקין. לכן, Apigee Edge מחזיר 500 Internal Server Error עם קוד השגיאה protocol.http.BadPath.

    דוגמה #3

    דוגמה 3: עדכון המשתנה target.url במדיניות AssignMessage

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

    שימו לב שהערך של url כולל את הרכיבים הבאים:

    • scheme: https
    • authority: mocktarget.apigee.net
    • path: ?echo

    גם בדוגמה הזו, הנתיב מתחיל בסימן שאלה (?) במקום בקו נטוי (/), מה שהופך אותו ללא תקין. לכן, Apigee Edge מחזיר את קוד השגיאה 500 Internal Server Error עם קוד השגיאה protocol.http.BadPath.

רזולוציה

בהתאם למפרט כתובות ה-URL, RFC 3986, section 3: Syntax Components, הרכיב path נדרש ותמיד צריך להתחיל ב-"/". לכן, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

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

    דוגמה 1

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

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

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

    דוגמה מס' 2

    דוגמה 2: עדכון מדיניות JavaScript של משתנה target.url על סמך הערך ב-request header

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

    כדי לפתור את הבעיה הזו, צריך לוודא שמעבירים נתיב תקין, למשל: /user כחלק מכותרת הבקשה Path, כמו שמוצג בהמשך:

    בקשה לדוגמה:

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

    דוגמה #3

    דוגמה 3: עדכון המשתנה target.url של מדיניות AssignMessage

    מוסיפים נתיב תקין לרכיב <Value> של מדיניות AssignMessage. כלומר, מחליפים את סימן השאלה (?) בקו נטוי (/) ברכיב <Value> ומגדירים אותו לערך https://mocktarget.apigee.net/echo כדי לפתור את הבעיה, כמו שמוצג בהמשך:

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

    מפרט

    ב-Apigee Edge, הרכיב path בכתובת ה-URL של שרת הקצה העורפי חייב תמיד להתחיל ב קו נטוי (/) כמו שמופיע במפרטים הבאים:

    מפרט
    RFC 3986, section 3: Syntax Components
    RFC 3986, section 3.3: Path

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

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

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

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

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

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

    • הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
    • שם הסביבה
    • חבילת 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

    קובצי עזר

    משתני זרימה – יעד