413 درخواست موجودیت خیلی بزرگ - TooBigBody

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP 413 Request Entity Too Large به همراه کد خطای protocol.http.TooBigBody را به عنوان پاسخی برای فراخوانی‌های API دریافت می‌کند.

پیام خطا

برنامه‌ی کلاینت کد پاسخ زیر را دریافت می‌کند:

HTTP/1.1 413 Request Entity Too Large

علاوه بر این، ممکن است پیام خطای زیر را مشاهده کنید:

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

علل احتمالی

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

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

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

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

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

نظارت بر API

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

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  2. به سازمانی که می‌خواهید مشکل را در آن بررسی کنید، مراجعه کنید

  3. به صفحه Analyze > API Monitoring > Investigate بروید.
  4. بازه زمانی خاصی را که در آن خطاها را مشاهده کرده‌اید، انتخاب کنید.
  5. شما می‌توانید فیلتر پروکسی را برای محدود کردن کد خطا انتخاب کنید.
  6. رسم کد خطا در مقابل زمان .
  7. سلولی را انتخاب کنید که دارای کد خطا protocol.http.TooBigBody و کد وضعیت 413 باشد، همانطور که در زیر نشان داده شده است:

  8. اطلاعات مربوط به کد خطا protocol.http.TooBigBody مطابق شکل زیر نمایش داده می‌شود:

  9. روی «مشاهده گزارش‌ها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید. سپس از پنجره «گزارش‌ها» ، جزئیات را مطابق شکل زیر یادداشت کنید:

    فشرده نشده

    سناریوی شماره ۱: درخواست ارسال محموله به صورت غیرفشرده

    از پنجره Logs، جزئیات زیر را یادداشت کنید:

    • کد وضعیت: 413
    • منبع خطا: proxy
    • کد خطا: protocol.http.TooBigBody .
    • طول درخواست (بایت): 15360440 (~۱۵ مگابایت)

    اگر منبع خطا مقدار proxy ، کد خطا مقدار protocol.http.TooBigBody و طول درخواست بیش از 10 مگابایت داشته باشد، نشان می‌دهد که درخواست HTTP از کلاینت دارای اندازه بار درخواستی بزرگتر از حد مجاز در Apigee است.

    فشرده

    سناریوی شماره ۲: درخواست ارسال بار داده به صورت فشرده

    از پنجره Logs ، جزئیات زیر را یادداشت کنید:

    • کد وضعیت: 413
    • منبع خطا: proxy
    • کد خطا: protocol.http.TooBigBody .
    • طول درخواست (بایت): 15264 (~۱۵ کیلوبایت)

    اگر منبع خطا مقدار proxy ، کد خطا مقدار protocol.http.TooBigBody و طول درخواست کمتر از 10 مگابایت داشته باشد، نشان می‌دهد که درخواست HTTP از کلاینت دارای اندازه بار درخواست کمتر از حد مجاز در قالب فشرده شده خود است، اما اندازه بار درخواست هنگام فشرده سازی توسط Apigee بزرگتر از حد مجاز است.

ردیابی

برای تشخیص خطا با استفاده از ابزار Trace:

  1. جلسه ردیابی را فعال کنید و یا
    • منتظر بمانید تا خطای 413 Request Entity Too Large رخ دهد یا
    • اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای 413 Request Entity Too Large را دوباره ایجاد کنید.
  2. مطمئن شوید که گزینه‌ی «نمایش تمام اطلاعات جریان» فعال است.

  3. یکی از درخواست‌های ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
  4. به مرحله درخواست دریافتی از کلاینت بروید.

    فشرده نشده

    سناریوی شماره ۱: درخواست ارسال محموله به صورت غیرفشرده

    به اطلاعات زیر توجه کنید:

    • کدگذاری محتوا: موجود نیست
    • طول محتوا: 15360204

    فشرده

    سناریوی شماره ۲: درخواست ارسال بار داده به صورت فشرده

    به اطلاعات زیر توجه کنید:

    • رمزگذاری محتوا: gzip
    • طول محتوا: 14969
    • نوع محتوا: application/x-gzip
  5. مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
  6. معمولاً خطا را در جریانی پس از مرحله‌ی «درخواست دریافت‌شده از کلاینت» مشاهده خواهید کرد، همانطور که در زیر نشان داده شده است:

  7. به مقدار خطا از مسیر ردیابی توجه کنید. مسیر نمونه بالا نشان می‌دهد:
    • خطا: Body buffer overflow
    • کلاس خطا: com.apigee.errors.http.user.RequestTooLarge
  8. به قسمت پاسخ ارسال شده به کلاینت بروید و مقادیر خطا را از مسیر ردیابی یادداشت کنید. نمونه مسیر ردیابی زیر نشان می‌دهد:

    • خطا: 413 Request Entity Too Large
    • محتوای خطا: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  9. در مسیر ردیابی، به مرحله AX (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید.
  10. در بخش جزئیات فاز ، به پایین اسکرول کنید تا به متغیرها برسید .

  11. مقدار متغیر client.received.content.length را تعیین کنید که نشان می‌دهد:
    • اندازه واقعی بار درخواست هنگام ارسال در قالب غیر فشرده و
    • اندازه‌ی درخواست ارسالی پس از خارج کردن از حالت فشرده توسط Apigee، زمانی که درخواست در قالب فشرده ارسال می‌شود. در این سناریو، این مقدار همیشه برابر با مقدار مجاز (۱۰ مگابایت) خواهد بود.

    فشرده نشده

    سناریوی شماره ۱: درخواست بار داده به صورت غیرفشرده

    متغیر client.received.content.length: 15360204

    فشرده

    سناریوی شماره ۲: درخواست بار داده در قالب فشرده

    متغیر client.received.content.length: 10489856

  12. جدول زیر توضیح می‌دهد که چرا خطای 413 توسط Apigee تحت دو سناریو بر اساس مقدار متغیر client.received.content.length برگردانده می‌شود:
    سناریو مقدار طول محتوای دریافتی مشتری دلیل شکست
    درخواست Payload در قالب غیر فشرده حدود ۱۵ مگابایت حجم > حد مجاز ۱۰ مگابایت.
    درخواست Payload در قالب فشرده حدود ۱۰ مگابایت

    محدودیت حجم پس از رفع فشار از حد مجاز فراتر رفت

انجینکس

برای تشخیص خطا با استفاده از گزارش‌های دسترسی NGINX:

  1. اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP 413 استفاده کنید.
  2. گزارش‌های دسترسی NGINX را بررسی کنید:

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

  3. جستجو کنید تا ببینید آیا در یک بازه زمانی خاص خطای 413 وجود دارد یا خیر (اگر مشکل در گذشته رخ داده است) یا اینکه آیا درخواست‌هایی با 413 هنوز با شکست مواجه شده‌اند یا خیر.
  4. اگر هرگونه خطای 413 با X-Apigee-fault-code مطابق با مقدار protocol.http.TooBigBody پیدا کردید، مقدار X-Apigee-fault-source را تعیین کنید.

    فشرده نشده

    سناریوی شماره ۱: درخواست اندازه بار داده در قالب غیرفشرده

    ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    هدرهای پاسخ ارزش
    کد خطای X-Apigee protocol.http.TooBigBody
    منبع گسل X-Apigee policy

    به طول درخواست توجه کنید: 15360440 (۱۴.۶ مگابایت > حد مجاز)

    فشرده

    سناریوی شماره ۲: درخواست اندازه بار داده در قالب فشرده

    ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    هدرهای پاسخ ارزش
    کد خطای X-Apigee protocol.http.TooBigBody
    منبع گسل X-Apigee policy

    به طول درخواست توجه کنید: 15264 (۱۴.۹ کیلوبایت < حد مجاز)

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

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

تشخیص

  1. کد خطا ، منبع خطا و اندازه بار درخواست را برای خطای مشاهده شده با استفاده از گزارش‌های دسترسی API Monitoring، Trace Tool یا NGINX همانطور که در مراحل تشخیص مشترک با سناریوی شماره ۱ (فشرده نشده) توضیح داده شده است، تعیین کنید.
  2. اگر منبع خطا دارای policy یا proxy مقدار باشد، این نشان می‌دهد که اندازه بار درخواست ارسال شده توسط برنامه کلاینت به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. اندازه بار درخواست را همانطور که از مرحله ۱ تعیین شده است، تأیید کنید.
  4. همچنین می‌توانید با بررسی درخواست واقعی با استفاده از مراحل زیر، تأیید کنید که آیا اندازه بار درخواست واقعاً بالای 10 مگابایت است یا خیر:
    1. اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی ندارید، به Resolution بروید.
    2. اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی دارید، مراحل زیر را انجام دهید:
      1. اندازه‌ی payload ارسالی در درخواست را تأیید کنید.
      2. اگر متوجه شدید که اندازه‌ی payload بیشتر از حد مجاز در Apigee Edge است، پس مشکل از همین‌جا ناشی می‌شود.
      3. درخواست نمونه:

        curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
        

        در مورد فوق، فایل test15mbfile حدود ۱۵ مگابایت است. اگر از کلاینت دیگری استفاده می‌کنید، لاگ‌های کلاینت را بررسی کنید تا اندازه‌ی payload ارسالی را متوجه شوید.

وضوح تصویر

به قسمت رزولوشن بروید.

علت: حجم بار درخواستی پس از رفع فشار از حد مجاز فراتر می‌رود.

اگر بار داده درخواست در قالب فشرده ارسال شود و هدر درخواست Content-Encoding روی gzip , Apigee بار داده درخواست را از حالت فشرده خارج می‌کند. در طول فرآیند خارج کردن از حالت فشرده، اگر Apigee متوجه شود که اندازه بار داده بیشتر از 10 مگابایت، یعنی حد مجاز ، است، خارج کردن بیشتر از حالت فشرده را متوقف می‌کند و بلافاصله با خطای 413 Request Entity Too Large with error code protocol.http.TooBigBody پاسخ می‌دهد.

تشخیص

  1. کد خطا، منبع خطا ، را تعیین کنید و اندازه بار درخواستی برای خطای مشاهده شده با استفاده از گزارش‌های API Monitoring، Trace Tool یا NGINX Access همانطور که در مراحل تشخیص مشترک با سناریوی شماره ۲ (فشرده شده) توضیح داده شده است.
  2. اگر منبع خطا دارای policy یا proxy مقدار باشد، این نشان می‌دهد که اندازه بار درخواست ارسال شده توسط برنامه کلاینت به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. اندازه بار درخواست (Request Payload Size) را همانطور که در مرحله ۱ تعیین شده است، تأیید کنید.
    • اگر اندازه‌ی بار داده (payload size) بیش از ۱۰ مگابایت باشد، پس دلیل خطا همین است.
    • اگر اندازه‌ی بار داده کمتر از حد مجاز ۱۰ مگابایت باشد، ممکن است بار داده‌ی درخواست به صورت فشرده ارسال شده باشد. در این صورت، اندازه‌ی فشرده نشده‌ی بار داده‌ی درخواست فشرده را بررسی کنید.
  4. شما می‌توانید با استفاده از یکی از روش‌های زیر، اعتبارسنجی کنید که آیا درخواست از طرف کلاینت در قالب فشرده ارسال شده است و اندازه فشرده نشده آن بزرگتر از حد مجاز است یا خیر:

    ردیابی

    برای اعتبارسنجی با استفاده از ابزار Trace:

    1. اگر ردی از درخواست ناموفق گرفته‌اید، به مراحل تفصیلی در بخش ردگیری و
      1. مقدار متغیر client.received.content.length را تعیین کنید.
      2. بررسی کنید که آیا درخواست کلاینت حاوی هدر Content-Encoding: gzip بوده است یا خیر.
    2. اگر مقدار متغیر client.received.content.length بیشتر از 10 مگابایت، محدودیت مجاز و هدر درخواست Content-Encoding: gzip باشد، دلیل این خطا همین است.

    درخواست واقعی

    برای اعتبارسنجی با استفاده از درخواست واقعی:

    1. اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی ندارید، به Resolution بروید.
    2. اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی دارید، مراحل زیر را انجام دهید:
      1. اندازه‌ی payload ارسالی در درخواست را به همراه هدر Content-Encoding ارسالی در درخواست، تأیید کنید.
      2. بررسی کنید که آیا اندازه فشرده نشده payload بیشتر از حد مجاز در Apigee Edge است یا خیر.

        نمونه درخواست:

        curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
        

        در مورد بالا، فایل test15mbfile.gz کمتر از محدودیت اندازه است؛ با این حال، اندازه فایل فشرده نشده test15mbfile حدود ۱۵ مگابایت است و هدر Content-Encoding آن gzip است.

        اگر از کلاینت دیگری استفاده می‌کنید، لاگ‌های کلاینت را بررسی کنید تا اندازه‌ی بار داده‌ی ارسالی و اینکه آیا هدر Content-Encoding روی gzip تنظیم شده است یا خیر را بیابید.

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

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

    1. اگر شما یک کاربر ابر خصوصی هستید، می‌توانید از گزارش‌های پردازشگر پیام برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP 413 استفاده کنید.
    2. لاگ‌های پردازشگر پیام را بررسی کنید:

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

    3. جستجو کنید تا ببینید آیا در یک بازه زمانی خاص خطای 413 وجود دارد یا خیر (اگر مشکل در گذشته رخ داده است) یا اینکه آیا درخواست‌هایی با 413 هنوز با شکست مواجه شده‌اند یا خیر.

      می‌توانید از رشته‌های جستجوی زیر استفاده کنید:

      grep -ri "chunkCount"
      
      grep -ri "RequestTooLarge"
      
    4. خطوطی مشابه زیر را در system.log خواهید یافت ( TotalRead و chunkCount ممکن است در مورد شما متفاوت باشند):
      2021-07-06 13:29:57,544  NIOThread@1 ERROR HTTP.SERVICE -
        TrackingInputChannel.checkMessageBodyTooLarge()
        : Message is too large.  TotalRead 10489856 chunkCount 2570
      
      2021-07-06 13:29:57,545  NIOThread@1 INFO  HTTP.SERVICE -
        ExceptionHandler.handleException()
        : Exception trace: com.apigee.errors.http.user.RequestTooLarge
        : Body buffer overflow
    5. در طول فرآیند رفع فشار، به محض اینکه پردازنده پیام تشخیص دهد که کل بایت‌های خوانده شده > 10 مگابایت است، متوقف شده و خط زیر را چاپ می‌کند:
      Message is too large.  TotalRead 10489856 chunkCount 2570

      این نشان می‌دهد که اندازه بار درخواست (Request Payload Size) بیش از ۱۰ مگابایت است و Apigee وقتی اندازه شروع به فراتر رفتن از حد مجاز ۱۰ مگابایت می‌کند، خطای RequestTooLarge را با کد خطا protocol.http.TooBigBody ارسال می‌کند.

وضوح تصویر

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

گزینه شماره ۱ [توصیه شده]: برنامه کلاینت را طوری تنظیم کنید که حجم بار داده (payload) بیشتر از حد مجاز ارسال نکند.

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

    در مثالی که در بالا مورد بحث قرار گرفت، می‌توانید با ارسال یک فایل با حجم کمتر، مثلاً test5mbfile (با حجم ۵ مگابایت) به صورت زیر، مشکل را برطرف کنید:

    curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
    
  3. اگر مطلوب است و می‌خواهید درخواست/بار داده‌ای بیش از حد مجاز ارسال کنید، به گزینه‌های بعدی بروید.

الگوی URL امضا شده

گزینه شماره ۲ [توصیه می‌شود]: استفاده از الگوی URLهای امضا شده در Apigee JavaCallout

برای بارهای داده بزرگتر از ۱۰ مگابایت، Apigee استفاده از الگوی URLهای امضا شده در Apigee JavaCallout را توصیه می‌کند، که توسط مثال Edge Callout: Signed URL Generator در GitHub نشان داده شده است.

پخش جریانی

گزینه شماره ۳: استفاده از استریمینگ

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

سی دبلیو سی

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

این گزینه فقط زمانی باید استفاده شود که نمی‌توانید از هیچ یک از گزینه‌های توصیه‌شده استفاده کنید، زیرا در صورت افزایش اندازه پیش‌فرض، ممکن است مشکلات عملکردی ایجاد شود.

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

محدودیت‌ها

شرکت Apigee انتظار دارد که برنامه‌ی کلاینت و سرور backend، اندازه‌ی بار داده (payload) بزرگتر از حد مجاز، همانطور که برای Request/response size در Apigee Edge Limits مستند شده است، ارسال نکنند.

  1. اگر شما یک کاربر ابر عمومی هستید، حداکثر محدودیت برای اندازه بار درخواست و پاسخ، همانطور که برای Request/response size در Apigee Edge Limits مستند شده است، می‌باشد.
  2. اگر شما یک کاربر Private Cloud هستید، ممکن است محدودیت پیش‌فرض برای اندازه بار درخواست و پاسخ را تغییر داده باشید (هرچند که این یک روش توصیه شده نیست). می‌توانید حداکثر محدودیت اندازه بار درخواست را با دنبال کردن دستورالعمل‌های موجود در بخش «نحوه بررسی محدودیت فعلی» تعیین کنید.

چگونه حد فعلی را بررسی کنیم؟

این بخش توضیح می‌دهد که چگونه می‌توان تأیید کرد که ویژگی HTTPRequest.body.buffer.limit با مقدار جدیدی در پردازنده‌های پیام به‌روزرسانی شده است.

  1. در دستگاه پردازشگر پیام، ویژگی HTTPRequest.body.buffer.limit را در دایرکتوری /opt/apigee/edge-message- processor/conf جستجو کنید و با استفاده از دستور زیر بررسی کنید که چه مقداری تنظیم شده است:
    grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. نتیجه نمونه از دستور بالا به شرح زیر است:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
  3. در خروجی مثال بالا، توجه کنید که ویژگی HTTPRequest.body.buffer.limit با مقدار 10m در http.properties تنظیم شده است.

    این نشان می‌دهد که محدودیت اندازه بار درخواست پیکربندی‌شده در Apigee برای Private Cloud، 10 مگابایت است.

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

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

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

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

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

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

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