502 Bad Gateway – ToBigLine

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

תיאור הבעיה

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

הודעת שגיאה

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

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

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

לפני שנבדוק את הסיבות האפשריות לשגיאה הזו, נסביר מה המשמעות של Response-Line ואיך בודקים את הגודל שלה.

הסבר על Response-Line

תשובת HTTP טיפוסית מורכבת משלושה חלקים:

  1. Status-Line (נקרא Response-Line ב-Apigee)
  2. ( Set of HTTP headers )
  3. [ Body ]

שורת התגובה מורכבת משלושה חלקים: גרסת הפרוטוקול, ואחריה קוד סטטוס מספרי והביטוי הטקסטואלי שמשויך אליו, כמו שמוצג בהמשך:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

כששרת היעד או שרת הקצה העורפי שולח תגובת HTTP, השורה הראשונה שנשלחת מייצגת את שורה התגובה כפי שמתואר למעלה. אחרי זה מופיעות הכותרות וגוף התשובה או המטען הייעודי.בצילום המסך לדוגמה הבא מוצגת בקשת curl טיפוסית, החלק Request והחלק Response (יחד עם Response-Line).

הסבר על גודל שורת התגובה

  1. בדוגמה שצוינה למעלה, השורה start (השורה הראשונה) בתגובה, שנקראת גם Response-Line, היא כזו:

    HTTP/1.1 200 OK

    הגודל של שורת התגובה הזו הוא ~15 bytes כי היא מכילה 15 ASCII characters. מכיוון שהערך הזה נמצא בגבול המותר ב-Apigee Edge, התגובה נשלחת חזרה ללקוח ללא שגיאות מ-Apigee Edge.

  2. באופן דומה, אם מסתכלים על faultstring בהודעת השגיאה שמוצגת למעלה, היא מכילה "response line size exceeding 2,048". המשמעות היא ששורת התגובה בתגובת ה-HTTP שנשלחה על ידי שרת היעד או השרת העורפי חרגה מ-2,048 בייט.

הסבר על שורת תגובה גדולה

בהתאם להגדרה של Status-Line (שנקראת כאן Response-Line) ולבקשות ותגובות HTTP טיפוסיות, הגודל יהיה קטן בהרבה מהמגבלה המוגדרת כברירת מחדל של 2 K ב-Apigee Edge, ולכן יכול להיות שלא נגיע למגבלה. עם זאת, הנה כמה תרחישים אפשריים שבהם יכול להיות שתחרגו מהמגבלה הזו:

  1. שרת היעד או השרת העורפי אינו מערכת HTTP. יכול להיות שהיא מגיבה בתגובה שאינה HTTP.
  2. יש בעיות בשרת היעד או בשרת העורפי, והוא שולח שורת תגובה ארוכה כחלק מתגובת ה-HTTP.

מידע נוסף על כך זמין במאמר בנושא קבלת השגיאה protocol.http.TooBigLine, ‏'גודל שורת התגובה חורג מ-2,048'.

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

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
גודל שורת התגובה גדול מהמגבלה המותרת הגודל של Response-Line שנשלח על ידי שרת היעד או השרת העורפי כחלק מתגובת ה-HTTP ל-Apigee Edge גדול מהמגבלה המותרת ב-Apigee Edge. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

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

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

API Monitoring

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

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

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

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

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

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

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

  10. בחלון יומנים, רושמים את הפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד שגיאה: protocol.http.TooBigLine.
  11. אם הערך של Fault Source הוא target והערך של Fault Code הוא protocol.http.TooBigLine, המשמעות היא שגודל שורת התגובה בתגובת ה-HTTP מהשרת של היעד או מהשרת העורפי גדול יותר מהמגבלה המקסימלית המותרת ב-Apigee Edge.

כלי המעקב

  1. מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
    1. מחכים שהשגיאה 502 Bad Gateway תתרחש. או
    2. אם אתם מצליחים לשחזר את הבעיה, מבצעים את קריאה ל-API ומשחזרים את השגיאה 502 Bad Gateway.
  2. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  3. אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
  4. בדרך כלל השגיאה מופיעה בflowinfo Error מיד אחרי השלב Request sent to target server, כמו שמוצג כאן:

    שימו לב לערכי השגיאה מהמעקב:

    • שגיאה: response line exceeding 2,048
    • ‫error.class: com.apigee.errors.http.server.BadGateway

    השגיאה הזו מציינת ש-Apigee Edge (רכיב Message Processor) מחזיר את השגיאה ברגע שהוא מקבל את התגובה משרת הקצה העורפי, כי גודל שורת התגובה חורג מהמגבלה המותרת.

  5. הודעת השגיאה שתישלח ללקוח תוצג בשלב Response Sent to Client, כמו שמוצג בהמשך:

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

  6. שימו לב לערכי השגיאה מהמעקב:
    • שגיאה: 502 Bad Gateway.
    • תוכן השגיאה: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. אפשר גם לעבור לשלב AX (נתוני Analytics שתועדו) במעקב וללחוץ עליו כדי לראות את פרטי השגיאה.

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

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

    כותרות של בקשות ערך
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    תוכן השגיאה : גוף {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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.TooBigLine, צריך לקבוע את הערך של X-Apigee-fault-source.

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

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

הגורם: גודל שורת התגובה גדול מהמגבלה המותרת

אבחון

  1. כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי למעקב אחר API, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם הערך של Fault Source הוא target, המשמעות היא שגודל שורת התגובה שנשלחה על ידי אפליקציית השרת של היעד או העורף אל Apigee גדול יותר מהמגבלה המותרת ב-Apigee Edge.
  3. אפשר לוודא שגודל שורת התגובה חורג מהמגבלה המותרת של 2KB‎ באמצעות אחת מהשיטות הבאות:

    הודעת שגיאה

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

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

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

    "faultstring":"response line size exceeding 2,048"

    השגיאה faultstring שמופיעה למעלה מציינת שגודל שורת התגובה חרג מהמגבלה המותרת של 2KB.

    הבקשה בפועל

    כדי לאמת באמצעות הבקשה בפועל:

    אם יש לכם גישה לבקשה בפועל שנשלחה לאפליקציית השרת של היעד או העורף, אתם יכולים לבצע את השלבים הבאים:

    1. בדיקת הגודל של שורת התגובה
    2. אם תגלו שהגודל של ה-URI גדול מהמגבלה המותרת ב-Apigee Edge, זו הסיבה לבעיה.

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

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      בדוגמה שלמעלה, שורת התגובה HTTP/1.1 200 1111…<trimmed>...11111111 גדולה מ-2KB, כלומר היא מכילה יותר מ-2, 000 תווים ב-ASCII.

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

    יומנים של מעבד הודעות

    כדי לבצע אימות באמצעות יומני מעבד בקשות:

    אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל שורת התגובה חרג מהמגבלה המותרת ב-Apigee Edge.

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

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. יוצגו שורות מ-system.log שדומות לאלה:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      הטקסט message = response line size exceeding 2,048 בהודעת השגיאה שלמעלה מציין שהגודל של שורת התגובה גדול מ-2KB. לכן, Apigee Edge מעלה את החריגה ומחזיר קוד סטטוס 502 עם קוד שגיאה protocol.http.TooBigline לאפליקציות לקוח.

רזולוציה

תיקון המידה

אפשרות מספר 1 [מומלצת]: תיקון האפליקציה של שרת היעד או השרת העורפי כדי שלא ישלחו שורות תגובה בגודל שגדול מהמגבלה המותרת

  1. לנתח את הסיבה לכך שהלקוח הספציפי שולח שורת תגובה בגודל שחורג מהמגבלה המותרת כפי שמוגדר במגבלות.
  2. אם זה לא רצוי, צריך לשנות את אפליקציית השרת של היעד או העורף כך שהיא תשלח שורת תגובה בגודל שקטן מהמגבלה המותרת.
  3. אם רוצים לשלוח שורת תגובה בגודל שגדול מהמגבלה המותרת, אפשר לעבור לאפשרויות הבאות.

CwC

אפשרות 2: שימוש במאפיין CwC כדי להגדיל את המגבלה של שורת התגובה

‫Apigee מספק מאפיין CwC שמאפשר להגדיל את מגבלת הגודל של שורת התגובה. פרטים נוספים מופיעים במאמר בנושא הגדרת המגבלה של שורת התגובה במעבד ההודעות.

מגבלות

מערכת Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו שורות בקשה/תגובה שגודלן גדול מהמגבלה המותרת, כפי שמפורט במאמר מגבלת שורת בקשה/תגובה במגבלות של Apigee Edge.

  1. אם אתם משתמשים בענן ציבורי, המגבלה המקסימלית לגודל של שורת הבקשה והתגובה היא כפי שמפורט במאמר גודל שורת הבקשה/התגובה בנושא מגבלות ב-Apigee Edge.
  2. אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל השורה של בקשות ותשובות (למרות שזו לא שיטה מומלצת). כדי לקבוע את המגבלה המקסימלית של גודל שורת התגובה, אפשר לפעול לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.

איך בודקים את המגבלה הנוכחית?

בקטע הזה מוסבר איך לוודא שהנכס HTTPResponse.line.limit עודכן עם ערך חדש במעבדי ההודעות.

  1. במחשב של מעבד ההודעות, מחפשים את המאפיין HTTPResponse.line.limit בספרייה /opt/apigee/edge-message-processor/conf ובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. התוצאה לדוגמה מהפקודה שלמעלה היא:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. בדוגמת הפלט שלמעלה, אפשר לראות שהמאפיין HTTPResponse.line.limit הוגדר עם הערך 2k ב-http.properties.

    המשמעות היא שהמגבלה על גודל שורת התגובה שהוגדרה ב-Apigee לענן פרטי היא 2KB.

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

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

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

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

  • שם הארגון
  • שם הסביבה
  • שם ה-proxy ל-API
  • פקודת curl מלאה שמשמשת לשחזור השגיאה 502
  • קובץ מעקב לבקשות ה-API

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

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