502 שער שגוי - כותרת כפולה

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 502 Bad Gateway עם קוד השגיאה protocol.http.DuplicateHeader כתגובה לקריאות ל-API.

הודעת השגיאה

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

סיבות אפשריות

השגיאה הזו מתרחשת כשכותרת HTTP ספציפית שלא יכולה לכלול כפילויות ב-Apigee Edge מופיעה יותר מפעם אחת עם ערכים זהים או שונים, כחלק מתגובת ה-HTTP שנשלחת על ידי שרת הקצה העורפי אל Apigee Edge.

בהתאם ל RFC 7230, סעיף 3.2.2: סדר שדות, שולח לא יכול ליצור שדות כותרת מרובים עם אותו שם שדה בהודעה, אלא אם הערך המלא של שדה הכותרת מוגדר כרשימה שמופרדת בפסיקים, כלומר #(values)] או שדה הכותרת הוא חריג ידוע. אם ב-Apigee Edge מוצגת כותרת ספציפית שלא יכולה לכלול כפילויות, היא נשלחת יותר מפעם אחת בתגובת HTTP שנשלחת על ידי שרת היעד/השרת העורפי, התגובה נשלחת עם קוד השגיאה 502 Bad Gateway וקוד שגיאה protocol.http.DuplicateHeader

אלה הסיבות האפשריות לשגיאה הזו:

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

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

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

מעקב באמצעות API

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

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

  3. עוברים לדף ניתוח > API Monitoring > חקירה.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. מוודאים שמסנן שרת ה-Proxy מוגדר לערך הכול.
  6. יש להציב את קוד השגיאה ביחס ל-Time.
  7. צריך לבחור תא שמכיל את קוד השגיאה protocol.http.DuplicateHeader כפי שמוצג כאן:

    (הצג תמונה גדולה יותר)

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

    (הצג תמונה גדולה יותר)

  9. מוודאים ש-Status Code (קוד הסטטוס) הוא 502 כפי שמוצג בדוגמה שלמעלה.
  10. לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
  11. בחלון 'יומנים', שימו לב לפרטים הבאים:

    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד תקלה: protocol.http.DuplicateHeader.
  12. מקור התקלה הוא target, שמציין שהתגובה משרת הקצה העורפי הכילה כותרות כפולות.

כלי המעקב

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

  1. מפעילים את סשן המעקב ואז
    1. צריך להמתין עד שהשגיאה 502 Bad Gateway תתרחש, או
    2. אם אפשר לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את השגיאה 502 Bad Gateway
  2. יש לוודא שהאפשרות הצג את כל פרטי הזרימה מופעלת:

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

    (הצג תמונה גדולה יותר)

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

    המעקב לדוגמה שלמעלה מציג את השגיאה כ-Duplicate Header "Expires". מכיוון שהשגיאה הועלתה על ידי Apigee אחרי שהבקשה נשלחה לשרת הקצה העורפי, היא מציינת ששרת הקצה העורפי שלח את הכותרת Expires יותר מפעם אחת.

  7. עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
  8. גוללים למטה לקטע Phase Details – Response Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source, כפי שמוצג בהמשך:

    (הצג תמונה גדולה יותר)

  9. הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source יופיעו כ-protocol.http.DuplicateHeader ו-target, כדי לציין שהשגיאה הזו נגרמת כי שרת הקצה העורפי העביר כותרות כפולות עבור כותרת התגובה Expires.
    כותרות תגובה Value
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. צריך לבדוק אם משתמשים בשרשור proxy. כלומר, אם שרת היעד או נקודת הקצה של היעד מפעילים שרת proxy אחר ב-Apigee.

    1. כדי לבדוק זאת, חוזרים לשלב הבקשה נשלחה לשרת היעד. לוחצים על Show Curl (הצגת כתובת ה-URL).

    2. החלון Curl for Request sent to Target שליחה נפתח, שבו אפשר לקבוע את הכינוי של שרת היעד כמארח.

    3. אם הכינוי של שרת היעד מפנה אל כינוי מארח וירטואלי, מדובר בשרשור של שרת proxy. במקרה כזה, צריך לחזור על כל השלבים שלמעלה בשביל שרת ה-proxy המשורשר עד שמבינים מה גורם בפועל לשגיאה 502 Bad Gateway.
    4. אם הכינוי של שרת היעד מפנה לשרת הקצה העורפי שלך, פירוש הדבר הוא ששרת הקצה העורפי שולח את הכותרות הכפולות בתגובה ל-Apigee.

NGINX

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

  1. אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לזהות את המידע העיקרי על שגיאות HTTP 502.
  2. כדאי לבדוק את יומני הגישה של NGINX:

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

    היכן:ORG, ENV ו-PORT# מוחלפים בערכים בפועל.

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

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

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

    כותרות תגובה Value
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

הסיבה: כותרת כפולה בתגובה

אבחון

  1. מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שזוהתה באמצעות יומני API Monitoring או יומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם מקור ה-Fault כולל את הערך target, זה אומר שהתגובה שנשלחת על ידי שרת היעד מכילה כותרות כפולות.
  3. אפשר לקבוע מהי הכותרת שנשלחת בפועל יותר מפעם אחת כחלק מהתגובה באחת מהשיטות הבאות:

    הודעת השגיאה

    באמצעות הודעת השגיאה:

    1. אם יש לך גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, כדאי לעיין ב-faultstring. השדה faultstring מכיל את שם הכותרת שנשלח יותר מפעם אחת.

      הודעת שגיאה לדוגמה:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. בהודעת השגיאה שלמעלה, ניתן לראות שהכותרת Expires נשלחה יותר מפעם אחת כפי שניתן לראות ב-faultstring.

    בקשה בפועל

    באמצעות הבקשה עצמה:

    1. אם אין לכם גישה לבקשה שנשלחה בפועל לשרת היעד, צריך לקבל את פקודת ה-curl המתאימה מהשימוש בכלי המעקב משלב 10.א ומשלב 10.ב.
    2. אם יש לך גישה לבקשה שנשלחה בפועל לאפליקציית שרת היעד, עליך לבצע את השלבים הבאים:

      1. ביצוע קריאה לשרת היעד.

        בקשה לדוגמה לשרת היעד שמשמשת בדוגמה הזו:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. מאמתים את רשימת הכותרות שמופיעות בתגובה.

        תגובה לדוגמה משרת היעד שבה נעשה שימוש בדוגמה הזו:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        בבקשה לדוגמה שלמעלה, הכותרת Expires נשלחת יותר מפעם אחת. לכן, הבקשה הזו נכשלת עם השגיאה 502 Bad Gateway וקוד השגיאה: protocol.http.DuplicateHeader.

      3. אם הכותרת ששמה מופיע ב-faultstring מופיע יותר מפעם אחת בתגובה של השרת העורפי, זו הסיבה לשגיאה. במקרה שלמעלה, הכותרת Expires נשלחת יותר מפעם אחת.

רזולוציה

תיקון הכפילויות

אפשרות מס' 1 [אפשרות מומלצת] תיקון השרת בקצה העורפי כך שלא יכלול כותרות כפולות

  1. צריך לנתח את הסיבה שבגללה שרת הקצה העורפי הספציפי שולח את הכותרת הכפולה Expires ולוודא ששרתי ה-proxy של ה-API יכולים לקבל אותה. ברוב המקרים, הוא לא יהיה רצוי בהתאם למפרט ה-HTTP RFC7230.
  2. אם הוא לא רצוי, משנים את אפליקציית שרת היעד כך שלא תשלח כותרות כפולות. בדוגמה שלמעלה, ניתן לראות שהכותרת Expires נשלחת פעמיים עם אותו ערך, והדבר אינו רצוי. אפשר לתקן את הבעיה על ידי כך ששרת היעד מעביר את הכותרת Expires פעם אחת בלבד.
  3. אם הוא רצוי ורוצים לאפשר שימוש בכותרות כפולות, עוברים אל אפשרות מס' 2 שימוש בנכס CwC.

CwC

אפשרות מס' 2 – שימוש בנכס CwC

Apigee מספקת מאפיין מסוג CwC HTTPHeader.<HeaderName> ,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות לשרתי API של API ב-Apigee Edge.

נכס CwC ערכים
HTTPHeader.<HeaderName> allowDuplicates,multivalued

לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וערכים מרובים עבור הכותרת Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. למשתמשים בענן פרטי יש אפשרות להגדיר את המאפיין כדי למנוע מ-Apigee Edge להעלות את השגיאה 502 Bad Gateway, גם אם הבקשה מכילה כותרות כפולות באמצעות המדריך הגדרה של מעבדי הודעות לשימוש בכותרות כפולות.
  2. אם אתם משתמשים ב-Public Cloud, תוכלו לפנות לתמיכה של Apigee Edge כדי להגדיר את הנכס הזה לארגון שלכם.

מפרט

Apigee מגיב עם תגובת השגיאה 502 Bad Gateway כי הוא מצפה ששרת הקצה העורפי יפעל בהתאם למפרטי RFC הבאים:

מפרט
RFC 7230, סעיף 3.2.2: סדר שדות
RFC 7230, סעיף 3.2: שדות כותרת

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

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

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

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

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