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 Monitoring

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

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

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

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

  7. מידע על קוד התקלה protocol.http.EmptyPath מוצג באופן הבא:

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

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

נתוני מעקב

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

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

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

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

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

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

    מכיוון ש-Apigee Edge יוצר את השגיאה אחרי השלב התחיל תהליך של בקשת יעד, המשמעות היא שה-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. גוללים למטה לקטע Phase DetailsError Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.

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

    כותרות Value
    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. קובעים את קוד התקלה ואת מקור התקלה של 500 Internal Server Error באמצעות API Monitoring, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם קוד ה-Fault הוא protocol.http.EmptyPath והמאפיין Fault Source כולל את הערך target, זה אומר שבכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק.
  3. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה target.url ב-Apigee Edge. השגיאה הזו מופיעה בדרך כלל כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי, כלומר target.url באופן דינמי באמצעות אחד מכללי המדיניות (בתוך שרת ה-Proxy או בתהליך המשותף) בתהליך הבקשה ליעד, כלומר יש בו נתיב ריק.

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

    API מסוג proxy

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

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

    • המדיניות בתוך שרת proxy ל-API
    • תהליכי עבודה משותפים שהופעלו דרך שרת ה-proxy
  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
    • path: ריק

    מכיוון שהנתיב ריק, Apigee Edge מחזירה את הערך 500 Internal Server Error עם קוד השגיאה protocol.http.EmptyPath.

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

    כדי לתקן את הבעיה, צריך לוודא שנתיב תקין, כמו /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, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם שרת proxy ל-API
  • צריך להשלים את פקודת 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

קובצי עזר

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