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

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

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

  8. מידע על קוד התקלה protocol.http.DuplicateHeader מוצג כך:

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

  9. יש לוודא שקוד הסטטוס הוא 502 כפי שמוצג בדוגמה שלמעלה.
  10. לוחצים על הצגת היומנים ומרחיבים את השורה של הבקשה שנכשלה.
  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. גוללים למטה לקטע פרטי שלב – כותרות של תגובות ומזהים את של X-Apigee-fault-code ו-X-Apigee-fault-source כפי שמוצג כאן:

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

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

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

    2. החלון Curl for Request Sent to target Server (מספר בקשה שנשלחה לשרת היעד) נפתח שממנו אפשר לקבוע את הכינוי של שרת היעד.

    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 תואם לערך של protocol.http.DuplicateHeader, אז לקבוע את הערך של X-Apigee-fault-source.

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

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

    כותרות של תשובות ערך
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

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

אבחון

  1. מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב או יומני גישה ל-NGINX, כמו שמוסבר בשלבי האבחון הנפוצים.
  2. אם מקור התקלה מכיל את הערך 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> ,שמאפשר לאפליקציות לקוח ולטרגט לשרתים לשלוח כותרות כפולות לשרתי proxy ל-API ב-Apigee Edge.

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

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

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

מפרט

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

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

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

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

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

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

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