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. Request-Line
  2. ( Set of HTTP headers )
  3. [ Body ]

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

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

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

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

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

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

    הגודל של Request-Line הוא ~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 Public Cloud וב-Edge Private Cloud

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

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

API Monitoring

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

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

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

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

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

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

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

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

  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. אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של 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. כדי לזהות את קוד השגיאה, מקור השגיאה וגודל אורך הבקשה של השגיאה שנצפתה, אפשר להשתמש בכלי למעקב אחר API, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. אם הערך של Fault Source הוא apigee או MP, סימן שגודל הבקשה שנשלחה על ידי אפליקציית הלקוח אל Apigee גדול מהמגבלה המותרת ב-Apigee Edge.
  3. אפשר לוודא שגודל שורת הבקשה חורג מהמגבלה המותרת של 7 KB באחת מהשיטות הבאות:

    הודעת שגיאה

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

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

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

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

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

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

    אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל שורת הבקשה לא חרג מהמגבלה המותרת ב-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 מעבר למגבלה המותרת, אפשר לעבור לאפשרויות הבאות.

CwC

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

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

מגבלות

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

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

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

בקטע הזה מוסבר איך לוודא שהנכס 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:

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

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

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

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