414 درخواست-URI خیلی طولانی - TooBigLine

شما در حال مشاهده مستندات 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 (۷ کیلوبایت) است.

علل احتمالی

این خطا زمانی رخ می‌دهد که اندازه خط درخواست ارسالی توسط برنامه کلاینت به Apigee Edge به عنوان بخشی از درخواست HTTP، بزرگتر از حد مجاز در Apigee Edge باشد.

قبل از اینکه به دلایل احتمالی این خطا بپردازیم، بیایید بفهمیم منظور از خط درخواست چیست و چگونه می‌توان اندازه آن را بررسی کرد.

درک خط درخواست

یک درخواست HTTP معمولی از سه بخش تشکیل شده است:

  1. خط درخواست
  2. (مجموعه‌ای از هدرهای HTTP)
  3. [بدن]

خط درخواست از سه بخش تشکیل شده است که در زیر نشان داده شده است.

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

وقتی یک درخواست HTTP توسط برنامه کلاینت به سرور ارسال می‌شود، اولین خطی که به سرور می‌رود شامل خط درخواستی است که در بالا توضیح داده شد. به دنبال آن هدرها و بدنه/بار درخواست قرار می‌گیرند.

تصویر نمونه زیر یک درخواست معمولی curl ، بخش Request (همراه با Request-Line) و بخش Response را نشان می‌دهد.

درک اندازه خط درخواست

  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 بایت فراتر رفته است.

در اینجا علل احتمالی این خطا آورده شده است:

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
حجم درخواست بیشتر از حد مجاز است اندازه Request-URI ارسال شده توسط برنامه کلاینت به عنوان بخشی از درخواست HTTP به Apigee Edge از حد مجاز در Apigee Edge بیشتر است. کاربران فضای ابری عمومی و خصوصی Edge

مراحل تشخیص مشترک

برای تشخیص این خطا از یکی از ابزارها/تکنیک‌های زیر استفاده کنید:

نظارت بر API

برای تشخیص خطا با استفاده از مانیتورینگ API:

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  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 بیش از ۷ کیلوبایت باشد، این نشان می‌دهد که درخواست HTTP از کلاینت دارای یک آدرس اینترنتی (URI) درخواستی بزرگتر از حد مجاز در Apigee است.

ابزار ردیابی

انجینکس

برای تشخیص خطا با استفاده از گزارش‌های دسترسی 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 protocol.http.TooBigLine
    منبع گسل X-Apigee policy

    به طول درخواست توجه کنید: 7244 (۷.۲۴۴ کیلوبایت > حد مجاز)

علت: اندازه بار درخواستی بیشتر از حد مجاز است

تشخیص

  1. کد خطا ، منبع خطا و اندازه طول درخواست را برای خطای مشاهده شده با استفاده از گزارش‌های API Monitoring، Trace Tool یا NGINX Access همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. اگر منبع خطا مقدار apigee یا MP داشته باشد، نشان می‌دهد که اندازه درخواست ارسال شده توسط برنامه کلاینت به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. شما می‌توانید با استفاده از یکی از روش‌های زیر تأیید کنید که اندازه خط درخواست از حد مجاز ۷ کیلوبایت فراتر رفته است:

    پیام خطا

    برای اعتبارسنجی با استفاده از پیام خطا:

    اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به faultstring مراجعه کنید. faultstring نشان می‌دهد که اندازه خط درخواست (Request-Line) از حد مجاز ۷ کیلوبایت فراتر رفته است.

    نمونه پیام خطا:

    "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 بزرگتر از ۷ کیلوبایت است، یعنی حاوی بیش از ۷ هزار کاراکتر ASCII است.

      اگر از کلاینت دیگری استفاده می‌کنید، می‌توانید لاگ‌های کلاینت را بررسی کنید و سعی کنید اندازه خط درخواستی که به Apigee Edge ارسال می‌شود را پیدا کنید.

    گزارش‌های پردازنده پیام

    برای اعتبارسنجی با استفاده از گزارش‌های پردازشگر پیام:

    اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های Message Processor برای تأیید اینکه آیا اندازه Request-Line از حد مجاز در 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 درخواست بیش از ۷ کیلوبایت است. بنابراین، Apigee Edge خطای com.apigee.errors.http.user.RequestURITooLong را صادر می‌کند و کد وضعیت 414 را با کد خطا protocol.http.TooBigline به برنامه‌های کلاینت برمی‌گرداند.

وضوح تصویر

اندازه را ثابت کنید

گزینه شماره ۱ [توصیه شده]: برنامه کلاینت را طوری تنظیم کنید که درخواست‌هایی با اندازه URI بزرگتر از حد مجاز ارسال نکند

  1. دلیل اینکه کلاینت خاصی درخواست ارسال اندازه URI بیشتر از حد مجاز تعریف شده در Limits را دارد، تجزیه و تحلیل کنید.
  2. اگر مطلوب نیست، برنامه کلاینت خود را طوری تغییر دهید که اندازه URI درخواست کمتر از حد مجاز باشد.

    در مثالی که در بالا مورد بحث قرار گرفت، می‌توانید با ارسال پارامتر کوئری طولانی به عنوان بخشی از بدنه/بار درخواست به جای ارسال آن به عنوان بخشی از URL درخواست، همانطور که در زیر نشان داده شده است، مشکل را برطرف کنید:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. اگر مطلوب است و می‌خواهید URI بیش از حد مجاز ارسال کنید، به گزینه‌های بعدی بروید.

سی دبلیو سی

گزینه شماره ۲: استفاده از ویژگی CwC برای افزایش محدودیت خط درخواست

Apigee یک ویژگی CwC ارائه می‌دهد که به آن اجازه می‌دهد محدودیت اندازه خط درخواست را افزایش دهد. برای جزئیات بیشتر به تنظیم محدودیت خط درخواست در پردازنده پیام مراجعه کنید.

محدودیت‌ها

شرکت Apigee انتظار دارد که برنامه‌ی کلاینت و سرور backend، خطوط درخواست / پاسخی که اندازه‌ی آنها بزرگتر از حد مجاز ذکر شده در Apigee Edge Limits است را ارسال نکنند.

  1. اگر شما یک کاربر ابر عمومی هستید، حداکثر محدودیت برای اندازه خط درخواست و پاسخ، همانطور که برای اندازه خط درخواست/پاسخ در Apigee Edge Limits مستند شده است، می‌باشد.
  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 برای ابر خصوصی ، ۷ کیلوبایت است.

اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمع‌آوری کنید» بروید.

باید اطلاعات تشخیصی جمع‌آوری کند

اطلاعات تشخیصی زیر را جمع‌آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط
  • نام پروکسی API
  • دستور curl کامل که برای بازتولید خطای 414 استفاده می‌شود
  • فایل ردیابی برای درخواست‌های API

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل مشاهده شده برای درخواست‌های ناموفق
  • نام سازمان
  • نام محیط
  • بسته پروکسی 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