502 Bad Gateway - TooBigBody

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

علامت

برنامه سرویس گیرنده کد وضعیت HTTP 502 Bad Gateway را با protocol.http.TooBigBody کد خطا دریافت می کند.http.TooBigBody به عنوان پاسخی برای تماس های API.

پیغام خطا

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

HTTP/1.1 502 Bad Gateway

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

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

علل احتمالی

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

در اینجا دلایل احتمالی خطا وجود دارد:

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

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

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

مانیتورینگ API

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

  1. به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
  2. به سازمانی که می‌خواهید در آن موضوع را بررسی کنید بروید.

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

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

  9. روی View logs کلیک کنید و ردیف درخواست ناموفق را گسترش دهید.

  10. از پنجره Logs به جزئیات زیر توجه کنید:
    • کد وضعیت: 502
    • منبع خطا: target
    • کد خطا: protocol.http.TooBigBody .
  11. اگر منبع خطا دارای مقدار target و کد خطا دارای protocol.http.TooBigBody مقدار باشد.http.TooBigBody، پس این نشان می‌دهد که پاسخ HTTP از سرور هدف/پشتیبان دارای اندازه بار پاسخی بیشتر از حد مجاز در Apigee Edge است .

ردیابی

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

  1. جلسه ردیابی را فعال کنید و یا:
    • صبر کنید تا خطای 502 Bad Gateway رخ دهد یا
    • اگر می‌توانید مشکل را تکرار کنید، تماس API را برقرار کرده و خطای 502 Bad Gateway را تکرار کنید.
  2. یکی از درخواست های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
  3. در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
  4. همانطور که در زیر نشان داده شده است، بلافاصله پس از دریافت پاسخ از مرحله سرور مورد نظر، به خطای فاز بروید:

    به مقادیر خطا از trace توجه کنید:

    • خطا: Body buffer overflow
    • error.class : com.apigee.errors.http.server.BadGateway

    این نشان می دهد که Apigee Edge (کامپوننت پردازشگر پیام) به محض دریافت پاسخ از سرور باطن به دلیل حجم بار بیش از حد مجاز، خطا را پرتاب می کند.

  5. شکست را در مرحله Response Sent to Client مانند شکل زیر مشاهده خواهید کرد:

  6. به مقادیر خطا از ردیابی توجه کنید. ردیابی نمونه بالا نشان می دهد:
    • خطا: 502 Bad Gateway
    • محتوای خطا: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. برای سناریوهای مختلف، همانطور که در زیر نشان داده شده است، به مرحله پاسخ دریافت شده از سرور مورد نظر بروید:

    فشرده نشده

    سناریوی شماره 1: بار پاسخ به شکل غیرفشرده ارسال شد

    به مقادیر خطا از trace توجه کنید:

    • پاسخ دریافت شده از سرور مورد نظر : 200 OK
    • طول محتوا (از بخش سرصفحه پاسخ ): ~ 11 مگابایت

    فشرده شده

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

    به مقادیر خطا از trace توجه کنید:

    • پاسخ دریافت شده از سرور مورد نظر : 200 OK
    • Content-Encoding : اگر این هدر را در بخش Response Headers مشاهده کردید، مقدار آن را یادداشت کنید. به عنوان مثال، در این مثال مقدار gzip است.
  8. به متن زیر بخش محتوای پاسخ توجه کنید:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. به مرحله AX (Analytics Data Recorded) در trace بروید و روی آن کلیک کنید تا جزئیات مربوطه را ببینید.

  10. در قسمت Phase Details به قسمت Variables Read بروید و مقادیر target.received.content.length را تعیین کنید که نشان می دهد:
    • اندازه واقعی محموله پاسخ هنگامی که در قالب غیر فشرده ارسال می شود و
    • اندازه بار پاسخ پس از فشرده سازی توسط Apigee، زمانی که محموله در قالب فشرده ارسال می شود. در این سناریو همیشه همان مقدار حد مجاز (10 مگابایت) خواهد بود.

    فشرده نشده

    سناریوی شماره 1: بار پاسخ به شکل غیرفشرده ارسال شد

    به مقدار target.received.content.length توجه کنید:

    درخواست سرصفحه ها ارزش
    هدف.دریافت شده.محتوا.طول ~ 11 مگابایت

    فشرده شده

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

    به مقدار target.received.content.length توجه کنید:

    سرصفحه های درخواستی ارزش
    هدف.دریافت شده.محتوا.طول ~ 10 مگابایت
  11. جدول زیر توضیح می دهد که چرا خطای 502 توسط Apigee در دو سناریو بر اساس مقدار target.received.content.length برگردانده می شود:

    سناریو مقدار target.received.content.length دلیل شکست
    Response Payload در قالب غیر فشرده ~ 11 مگابایت اندازه > حد مجاز 10 مگابایت
    Response Payload در قالب فشرده ~ 10 مگابایت

    با رفع فشار از حد مجاز اندازه بیشتر شد

NGINX

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

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

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

    جایی که: ORG ، ENV ، و PORT# با مقادیر واقعی جایگزین می‌شوند.

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

    نمونه خطای 502 از گزارش دسترسی NGINX:

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

    سرصفحه های پاسخ ارزش
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source target

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

تشخیص

  1. کد خطا ، منبع خطا و اندازه بار پاسخ را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace، یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج با سناریوی شماره 1 توضیح داده شده است، تعیین کنید.
  2. اگر منبع خطا دارای مقدار target باشد، این نشان می‌دهد که اندازه بار پاسخ ارسال شده توسط سرور هدف/بک‌اند به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. اندازه بار پاسخ را همانطور که از مرحله 1 تعیین شده است، تأیید کنید.
  4. با بررسی پاسخ واقعی با استفاده از مراحل زیر، تأیید کنید که حجم بار پاسخ در واقع > 10 مگابایت محدودیت مجاز است:
    1. اگر به درخواست واقعی ارائه شده به سرور هدف/بکاند دسترسی ندارید، به Resolution بروید.
    2. اگر به درخواست واقعی ارسال شده به سرور هدف/بک‌اند دسترسی دارید، مراحل زیر را انجام دهید:
      1. اگر کاربر عمومی Cloud/Private Cloud هستید، مستقیماً از سرور باطن یا هر دستگاه دیگری که از آنجا مجاز به ارائه درخواست به سرور باطن هستید، به سرور باطن درخواست دهید.
      2. اگر کاربر Private Cloud هستید، می توانید از یکی از پردازشگرهای پیام نیز درخواست را به سرور پشتیبان ارسال کنید.
      3. با بررسی هدر Content-Length اندازه بار ارسال شده در پاسخ را بررسی کنید.
      4. اگر متوجه شدید که اندازه محموله بیش از حد مجاز در Apigee Edge است، دلیل این مشکل همین است.

    نمونه پاسخ از سرور باطن:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>

    در مثال بالا، Content-Length: 11534336 (which is ~11 MB) را می بینید که دلیل این خطا است زیرا از حد مجاز در Apigee Edge فراتر رفته است.

قطعنامه

رجوع به قطعنامه شود.

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

اگر محموله پاسخ در قالب فشرده ارسال شود و هدر پاسخ Content-Encoding روی gzip , Apigee بار پاسخ را از حالت فشرده خارج می کند. در طول فرآیند رفع فشار، اگر Apigee اندازه محموله را بزرگتر از حد مجاز در Apigee Edge بیابد. ، سپس فشرده سازی بیشتر را متوقف می کند و بلافاصله با 502 Bad Gateway و protocol.http.TooBigBody کد خطا پاسخ می دهد.http.TooBigBody.

تشخیص

  1. کد خطا، منبع خطا و اندازه بار پاسخ را برای خطای مشاهده شده با استفاده از API Monitoring، Trace Tool یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج با سناریوی شماره 2 توضیح داده شده است، تعیین کنید.
  2. اگر منبع خطا دارای مقدار target باشد، این نشان می‌دهد که اندازه بار پاسخ ارسال شده توسط برنامه هدف/بک‌اند به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. اندازه بار پاسخ را همانطور که از مرحله 1 تعیین شده است، تأیید کنید.
    • اگر حجم محموله بیش از 10 مگابایت محدودیت مجاز است، پس این دلیل خطا است.
    • اگر حجم محموله ~ 10 مگابایت محدودیت مجاز باشد، ممکن است بار پاسخ به فرمت فشرده ارسال شود. در این مورد، اندازه فشرده نشده بار پاسخ فشرده را بررسی کنید.
  4. با استفاده از یکی از روش‌های زیر می‌توانید تأیید کنید که آیا پاسخ از هدف/پشت‌هند در قالب فشرده ارسال شده است و اندازه غیرفشرده بیشتر از حد مجاز است:

    ردیابی

    با استفاده از ابزار Trace:

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

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

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

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

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

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * About to connect() to 10.1.0.10 port 9000 (#0)
        *   Trying 10.1.0.10...
        * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
        > GET /testzippedfile.gz HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 10.1.0.10:9000
        > Accept: */*
        >
        < HTTP/1.1 200 OK
        < Accept-Ranges: bytes
        < Content-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>

        در مورد بالا، هدر Content-Encoding: gzip ارسال می شود و حجم فایل testzippedfile.gz در پاسخ کمتر از حد مجاز است، اما اندازه فایل فشرده نشده testzippedfile ~15 مگابایت بود.

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

    استفاده از گزارش‌های پردازشگر پیام:

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

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

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

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. خطوطی را از system.log خواهید دید که شبیه به شکل زیر هستند (ممکن است TotalRead و chunkCount در مورد شما متفاوت باشد):
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
    5. در طول فرآیند فشرده سازی، به محض اینکه پردازشگر پیام تشخیص داد که کل بایت های خوانده شده > 10 مگابایت است، متوقف می شود و خط زیر را چاپ می کند:

      Message is too large. TotalRead 10489856 chunkCount 2571

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

قطعنامه

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

گزینه شماره 1 [توصیه می شود]: برنامه سرور مورد نظر را اصلاح کنید تا اندازه بار بیش از حد Apigee ارسال نکند

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

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

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

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

جریان

گزینه شماره 3: از Streaming استفاده کنید

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

CwC

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

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

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

محدودیت ها

Apigee انتظار دارد که برنامه کلاینت و سرور پشتیبان اندازه های باری بیشتر از حد مجاز را که برای Request/response size در Apigee Edge Limits مستند شده است ارسال نکند.

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

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

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

  1. در دستگاه Message Processor، ویژگی HTTPResponse.body.buffer.limit را در پوشه /opt/apigee/edge-message- processor/conf جستجو کنید و بررسی کنید که چه مقداری مطابق شکل زیر تنظیم شده است:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. نتیجه نمونه دستور بالا به شرح زیر است:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
  3. در خروجی مثال بالا، توجه کنید که ویژگی HTTPResponse.body.buffer.limit با مقدار 10m در http.properties تنظیم شده است.

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

اگر همچنان به کمک پشتیبانی Apigee نیاز دارید، به Must collect information diagnostic بروید.

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

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

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

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

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

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