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"
      }
   }
}

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

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

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

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

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

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

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

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

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

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

  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 בייטים.

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

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

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

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

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

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

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

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

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

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

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

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

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

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

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

  10. בחלון יומנים שימו לב לפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד התקלה: protocol.http.TooBigLine.
  11. אם מקור התקלה כולל את הערך target ואת הערך Fault הקוד מכיל את הערך 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 Data Recorded) ולוחצים עליו כדי לראות את פרטי השגיאה.

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

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

    כותרות של בקשות ערך
    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 תואם לערך של 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 יומני Monitoring, כלי מעקב או יומני גישה ל-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. כלומר היא מכילה יותר מ-2K תווי ASCII.

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

    יומני מעבד ההודעות

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

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

CwC

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

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

מגבלות

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

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

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

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

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

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

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

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

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