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.

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

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

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

  1. Status-Line (נקרא Response-Line ב-Apigee)
  2. ( קבוצת כותרות HTTP )
  3. [ גוף ]

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

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

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

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

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

    HTTP/1.1 200 OK
    

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

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

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

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

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

ניתן לקרוא מידע נוסף בנושא במאמר קבלת error protocol.http.TooBigLine, "גודל שורת תגובה חורג מ-2,048.

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

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

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

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

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

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

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

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

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

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

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

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

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

כלי המעקב

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

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

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

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

  5. הודעת השגיאה שנשלחה ללקוח תופיע בשלב תגובה שנשלחה ללקוח באופן הבא:

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

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

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

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

    כותרות של בקשות Value
    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. אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של 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

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

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

הסיבה: הגודל של שורת התגובה חורג מהמגבלה המותרת

אבחון

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

    הודעת השגיאה

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

    אם יש לך גישה להודעת השגיאה המלאה שהתקבלה מ-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 K תווי ASCII.

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

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

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

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

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

CwC

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

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

מגבלות

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

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

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

בקטע הזה מוסבר איך לוודא שהמאפיין 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 לענן פרטי היא 2 KB.

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

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

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

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

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

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

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