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 לשרת, השורה הראשונה שעוברת לשרת מכילה את Request-Line כמתואר למעלה. לאחר מכן מופיעות הכותרות וגוף הבקשה/מטען ייעודי (payload).

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

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

  1. בדוגמה שלמעלה, שורת ההתחלה (השורה הראשונה) בבקשה, שנקראת גם 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) של הבקשה חורג מהמגבלה המותרת הגודל של ה-URI של בקשת הלקוח כחלק מבקשת ה-HTTP ל-Apigee Edge גדול מהמגבלה המותרת ב-Apigee Edge. משתמשי Edge הציבוריים והפרטיים

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

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

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

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

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

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

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

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

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

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

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

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

    • קוד סטטוס: 414
    • מקור התקלה: apigee
    • קוד תקלה: protocol.http.TooBigLine.
    • אורך הבקשה: 7244 (> 7KB)
  10. אם ל-Fault Source יש את הערך apigee או MP, Fault Code כוללת את הערך protocol.http.TooBigLine ו-Request-Length גדול מ- 7 KB, המשמעות היא שבקשת ה-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 שתואם לערך של X-Apigee-fault-code , צריך לקבוע את הערך של X-Apigee-fault-code

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

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

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

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

אבחון

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

    הודעת השגיאה

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

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

CwC

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

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

מגבלות

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

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

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

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

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

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

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

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

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