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 Public Cloud וב-Edge Private Cloud

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

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

API Monitoring

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

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

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

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

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

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

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

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

כלי המעקב

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

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

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

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

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

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

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

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

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

    1. כדי לדעת מהו, צריך לחזור לשלב השרת Request sent to target. לוחצים על הצגת Curl.

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

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

NGINX

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

  1. אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של 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. אם הערך של Fault Source הוא target, המשמעות היא שהתגובה שנשלחה על ידי שרת היעד מכילה כותרות כפולות.
  3. אפשר לקבוע את הכותרת בפועל שנשלחת יותר מפעם אחת כחלק מהתגובה באמצעות אחת מהשיטות הבאות:

    הודעת שגיאה

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

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

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

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

    הבקשה בפועל

    שימוש בבקשה בפועל:

    1. אם אין לכם גישה לבקשה בפועל שנשלחה לשרת היעד, תוכלו לקבל את הפקודה המתאימה curl משלב 10.א ומשלב 10.ב במאמר שימוש בכלי Trace.
    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 ולוודא שאין בעיה ששרתי ה-API proxy יקבלו אותה. ברוב המקרים, זה לא רצוי בהתאם למפרט HTTP‏ RFC7230.
  2. אם זה לא רצוי, צריך לשנות את אפליקציית שרת היעד כך שלא יישלחו כותרות כפולות. בדוגמה שצוינה למעלה, אפשר לראות שהכותרת Expires נשלחת פעמיים עם אותו ערך, וזה לא רצוי. כדי לפתור את הבעיה, צריך לוודא ששרת היעד מעביר את הכותרת Expires רק פעם אחת.
  3. אם רוצים לאפשר את הכותרות הכפולות, אפשר לעבור אל אפשרות 2: שימוש בנכס CwC.

CwC

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

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

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

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

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

מפרט

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

מפרט
RFC 7230, section 3.2.2: Field Order
RFC 7230, section 3.2: Header Fields

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

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

אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge.

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

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