414 Request-URI ארוך מדי - ToBigLine

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 414 Request-URI Too Long עם קוד שגיאה protocol.http.TooBigLine כתגובה לקריאות ל-API.

הודעת שגיאה

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

HTTP/1.1 414 Request-URI Too Long

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

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

לתשומת ליבך: ה-faultstring בהודעת השגיאה שלמעלה מכיל את המגבלה המותרת לשורת הבקשה ב-Apigee Edge, שהיא 7168 bytes (7 KB).

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

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

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

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

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

  1. שורת בקשה
  2. ( קבוצה של כותרות HTTP )
  3. [ גוף ]

שורת הבקשה מורכבת משלושה חלקים כפי שמוצג בהמשך.

Request-Line = <Method> <Request-URI> <HTTP-Version>

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

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

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

  1. בדוגמה שלמעלה, שורת start (השורה הראשונה) בבקשה, גם היא שנקרא Request-Line, הוא כך:
    GET /test/ HTTP/1.1
    

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

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

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

סיבה תיאור הוראות לפתרון בעיות עבור
גודל המטען הייעודי (payload) של הבקשה חורג מהמגבלה המותרת הגודל של ה-Request-URI שנשלח על ידי אפליקציית הלקוח כחלק מה-HTTP הבקשה ל-Apigee Edge גדולה מהמגבלה המותרת ב-Apigee Edge. משתמשי Edge בענן הציבורי והפרטי

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

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

מעקב API

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

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

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

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

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

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

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

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

  9. בחלון יומנים שימו לב לפרטים הבאים:

    • קוד סטטוס: 414
    • מקור התקלה: apigee
    • קוד התקלה: protocol.http.TooBigLine.
    • אורך הבקשה(בייטים): 7244 (> 7KB)
  10. אם ל-Fault Source יש את הערך apigee או MP, קוד השגיאה כולל את הערך protocol.http.TooBigLine ו הערך Request-Length יותר מ-7KB מציין שבקשת ה-HTTP מהלקוח יש URI של בקשה גדול מ- למגבלה ב-Apigee.

כלי המעקב

NGINX

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

  1. אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה ל-NGINX כדי לדעת את המידע העיקרי לגבי שגיאות HTTP 414.
  2. בודקים את יומני הגישה ל-NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    איפה: ORG, ENV ו-PORT# מוחלפים בערכים בפועל.

  3. אפשר לחפש אם יש שגיאות 414 בטווח זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין לא נענו 414
  4. אם מופיעות שגיאות 414 בקוד 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 policy

    לתשומת ליבכם: אורך הבקשה: 7244 (7.244KB > המגבלה המותרת)

הסיבה: גודל המטען הייעודי (payload) של הבקשה חורג מהמגבלה המותרת

אבחון

  1. קובעים את Fault Code (קוד התקלה), Fault Source וגודל בקשה-אורך של שגיאה שזוהתה באמצעות יומני API Monitoring, Trace Tool או NGINX Access כמו שמוסבר ב- שלבי האבחון הנפוצים.
  2. אם מקור התקלה מכיל את הערך apigee או MP, הערך הזה מציין שגודל הבקשה שנשלח על ידי אפליקציית הלקוח ל-Apigee גדול מ- המגבלה המותרת ב-Apigee Edge.
  3. אפשר לוודא שגודל שורת הבקשה חרג מהמגבלה המותרת של 7 KB באמצעות אחת מהאפשרויות הבאות: אחת מהשיטות הבאות:

    הודעת שגיאה

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

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

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

    "faultstring":"request line size exceeding 7,168"
    

    הבקשה בפועל

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

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

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

      בקשה לדוגמה:

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      במקרה שלמעלה, הערך של פרמטר השאילתה qparam גדול מ-7KB, כלומר הוא מכיל יותר מ-7 K תווי ASCII.

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

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

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

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

    1. בודקים את יומני מעבד ההודעות:

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

    2. אפשר לחפש כדי לראות אם יש שגיאות 414 במהלך משך הזמן (אם הבעיה התרחשה בעבר) או אם יש בקשות כלשהן עדיין נכשל עם 414. אפשר להשתמש במחרוזות החיפוש הבאות.
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. יופיעו שורות מ-system.log שדומות לאלה:
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)
      

      הטקסט message = request line size exceeding 7,168 במחרוזת הודעת השגיאה שלמעלה מציינת שגודל ה-URI של הבקשה גדול מ-7KB. לכן, Apigee Edge מקפיצה את החריג com.apigee.errors.http.user.RequestURITooLong והחזרות קוד סטטוס 414 עם קוד שגיאה protocol.http.TooBigline לאפליקציות לקוח.

רזולוציה

תיקון הגודל

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

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

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. אם זה רצוי ואתם רוצים לשלוח URI שחורג מהמגבלה המותרת, עוברים אל האפשרויות הבאות.

CwC

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

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

מגבלות

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

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

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

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

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

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

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

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

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

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

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

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

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