شما در حال مشاهده اسناد 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:
- به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید در آن موضوع را بررسی کنید بروید.
- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کرده اید انتخاب کنید.
- میتوانید فیلتر Proxy را برای محدود کردن کد خطا انتخاب کنید.
- کد خطا را در برابر زمان ترسیم کنید.
سلولی را انتخاب کنید که دارای
protocol.http.TooBigBody
کد خطا باشد.http.TooBigBody مانند شکل زیر:اطلاعات مربوط به
protocol.http.TooBigBody
کد خطا را مشاهده خواهید کرد.http.TooBigBody مانند شکل زیر:روی View logs کلیک کنید و ردیف درخواست ناموفق را گسترش دهید.
- از پنجره Logs به جزئیات زیر توجه کنید:
- کد وضعیت:
502
- منبع خطا:
target
- کد خطا:
protocol.http.TooBigBody
.
- کد وضعیت:
- اگر منبع خطا دارای مقدار
target
و کد خطا دارایprotocol.http.TooBigBody
مقدار باشد.http.TooBigBody، پس این نشان میدهد که پاسخ HTTP از سرور هدف/پشتیبان دارای اندازه بار پاسخی بیشتر از حد مجاز در Apigee Edge است .
ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا:
- صبر کنید تا خطای
502 Bad Gateway
رخ دهد یا - اگر میتوانید مشکل را تکرار کنید، تماس API را برقرار کرده و خطای
502 Bad Gateway
را تکرار کنید.
- صبر کنید تا خطای
- یکی از درخواست های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
همانطور که در زیر نشان داده شده است، بلافاصله پس از دریافت پاسخ از مرحله سرور مورد نظر، به خطای فاز بروید:
به مقادیر خطا از trace توجه کنید:
- خطا:
Body buffer overflow
- error.class :
com.apigee.errors.http.server.BadGateway
این نشان می دهد که Apigee Edge (کامپوننت پردازشگر پیام) به محض دریافت پاسخ از سرور باطن به دلیل حجم بار بیش از حد مجاز، خطا را پرتاب می کند.
- خطا:
شکست را در مرحله Response Sent to Client مانند شکل زیر مشاهده خواهید کرد:
- به مقادیر خطا از ردیابی توجه کنید. ردیابی نمونه بالا نشان می دهد:
- خطا:
502 Bad Gateway
- محتوای خطا:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- خطا:
برای سناریوهای مختلف، همانطور که در زیر نشان داده شده است، به مرحله پاسخ دریافت شده از سرور مورد نظر بروید:
فشرده نشده
سناریوی شماره 1: بار پاسخ به شکل غیرفشرده ارسال شد
به مقادیر خطا از trace توجه کنید:
- پاسخ دریافت شده از سرور مورد نظر :
200 OK
- طول محتوا (از بخش سرصفحه پاسخ ): ~ 11 مگابایت
فشرده شده
سناریوی شماره 2: درخواست ارسال بار به صورت فشرده
به مقادیر خطا از trace توجه کنید:
- پاسخ دریافت شده از سرور مورد نظر :
200 OK
- Content-Encoding : اگر این هدر را در بخش Response Headers مشاهده کردید، مقدار آن را یادداشت کنید. به عنوان مثال، در این مثال مقدار
gzip
است.
- پاسخ دریافت شده از سرور مورد نظر :
به متن زیر بخش محتوای پاسخ توجه کنید:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
به مرحله AX (Analytics Data Recorded) در trace بروید و روی آن کلیک کنید تا جزئیات مربوطه را ببینید.
- در قسمت Phase Details به قسمت Variables Read بروید و مقادیر
target.received.content.length
را تعیین کنید که نشان می دهد:- اندازه واقعی محموله پاسخ هنگامی که در قالب غیر فشرده ارسال می شود و
- اندازه بار پاسخ پس از فشرده سازی توسط Apigee، زمانی که محموله در قالب فشرده ارسال می شود. در این سناریو همیشه همان مقدار حد مجاز (10 مگابایت) خواهد بود.
فشرده نشده
سناریوی شماره 1: بار پاسخ به شکل غیرفشرده ارسال شد
به مقدار target.received.content.length توجه کنید:
درخواست سرصفحه ها ارزش هدف.دریافت شده.محتوا.طول ~ 11 مگابایت فشرده شده
سناریوی شماره 2: درخواست ارسال بار به صورت فشرده
به مقدار target.received.content.length توجه کنید:
سرصفحه های درخواستی ارزش هدف.دریافت شده.محتوا.طول ~ 10 مگابایت جدول زیر توضیح می دهد که چرا خطای
502
توسط Apigee در دو سناریو بر اساس مقدار target.received.content.length برگردانده می شود:سناریو مقدار target.received.content.length دلیل شکست Response Payload در قالب غیر فشرده ~ 11 مگابایت اندازه > حد مجاز 10 مگابایت Response Payload در قالب فشرده ~ 10 مگابایت با رفع فشار از حد مجاز اندازه بیشتر شد
NGINX
برای تشخیص خطا با استفاده از گزارش های دسترسی NGINX:
- اگر کاربر Private Cloud هستید، می توانید از گزارش های دسترسی NGINX برای تعیین اطلاعات کلیدی مربوط به خطاهای HTTP
502
استفاده کنید. گزارش های دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
جایی که: ORG ، ENV ، و PORT# با مقادیر واقعی جایگزین میشوند.
- جستجو کنید تا ببینید آیا خطاهای
502
در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده است) یا اینکه آیا هنوز درخواست هایی وجود دارد که با502
ناموفق هستند. - اگر هر گونه خطای
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
علت: حجم بار پاسخگویی بیشتر از حد مجاز است
تشخیص
- کد خطا ، منبع خطا و اندازه بار پاسخ را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace، یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج با سناریوی شماره 1 توضیح داده شده است، تعیین کنید.
- اگر منبع خطا دارای مقدار
target
باشد، این نشان میدهد که اندازه بار پاسخ ارسال شده توسط سرور هدف/بکاند به Apigee بیشتر از حد مجاز در Apigee Edge است. - اندازه بار پاسخ را همانطور که از مرحله 1 تعیین شده است، تأیید کنید.
- اگر حجم محموله بیش از 10 مگابایت محدودیت مجاز است، پس این دلیل خطا است.
- اگر حجم محموله ~ 10 مگابایت محدودیت مجاز باشد، ممکن است بار پاسخ به فرمت فشرده ارسال شود. برو به علت: اندازه بار پاسخ از حد مجاز پس از فشرده سازی فراتر می رود .
- با بررسی پاسخ واقعی با استفاده از مراحل زیر، تأیید کنید که حجم بار پاسخ در واقع > 10 مگابایت محدودیت مجاز است:
- اگر به درخواست واقعی ارائه شده به سرور هدف/بکاند دسترسی ندارید، به Resolution بروید.
- اگر به درخواست واقعی ارسال شده به سرور هدف/بکاند دسترسی دارید، مراحل زیر را انجام دهید:
- اگر کاربر عمومی Cloud/Private Cloud هستید، مستقیماً از سرور باطن یا هر دستگاه دیگری که از آنجا مجاز به ارائه درخواست به سرور باطن هستید، به سرور باطن درخواست دهید.
- اگر کاربر Private Cloud هستید، می توانید از یکی از پردازشگرهای پیام نیز درخواست را به سرور پشتیبان ارسال کنید.
- با بررسی هدر Content-Length اندازه بار ارسال شده در پاسخ را بررسی کنید.
- اگر متوجه شدید که اندازه محموله بیش از حد مجاز در 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.
تشخیص
- کد خطا، منبع خطا و اندازه بار پاسخ را برای خطای مشاهده شده با استفاده از API Monitoring، Trace Tool یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج با سناریوی شماره 2 توضیح داده شده است، تعیین کنید.
- اگر منبع خطا دارای مقدار
target
باشد، این نشان میدهد که اندازه بار پاسخ ارسال شده توسط برنامه هدف/بکاند به Apigee بیشتر از حد مجاز در Apigee Edge است. - اندازه بار پاسخ را همانطور که از مرحله 1 تعیین شده است، تأیید کنید.
- اگر حجم محموله بیش از 10 مگابایت محدودیت مجاز است، پس این دلیل خطا است.
- اگر حجم محموله ~ 10 مگابایت محدودیت مجاز باشد، ممکن است بار پاسخ به فرمت فشرده ارسال شود. در این مورد، اندازه فشرده نشده بار پاسخ فشرده را بررسی کنید.
- با استفاده از یکی از روشهای زیر میتوانید تأیید کنید که آیا پاسخ از هدف/پشتهند در قالب فشرده ارسال شده است و اندازه غیرفشرده بیشتر از حد مجاز است:
ردیابی
با استفاده از ابزار Trace:
- اگر ردی برای درخواست ناموفق ثبت کرده اید، به مراحل شرح داده شده در Trace و مراجعه کنید
- مقدار target.received.content.length را تعیین کنید
- بررسی کنید که آیا درخواست مشتری حاوی سرصفحه Content-Encoding:
gzip
است یا خیر
- اگر مقدار target.received.content.length حدود 10 مگابایت حد مجاز باشد، و سرصفحه پاسخ Content-Encoding:
gzip
، پس دلیل این خطا همین است.
درخواست واقعی
استفاده از درخواست واقعی:
- اگر به درخواست واقعی ارائه شده به سرور هدف/بکاند دسترسی ندارید، به Resolution بروید.
- اگر به درخواست واقعی ارسال شده به سرور هدف/بکاند دسترسی دارید، مراحل زیر را انجام دهید:
- اندازه بار ارسال شده در پاسخ را به همراه هدر
Content-Encoding
ارسال شده در پاسخ بررسی کنید. - اگر متوجه شدید که هدر پاسخ
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 مگابایت بود.
- اندازه بار ارسال شده در پاسخ را به همراه هدر
گزارش های پردازشگر پیام
استفاده از گزارشهای پردازشگر پیام:
- اگر کاربر Private Cloud هستید، میتوانید از گزارشهای پردازشگر پیام برای تعیین اطلاعات کلیدی درباره خطاهای HTTP
502
استفاده کنید. گزارشهای پردازشگر پیام را بررسی کنید
/opt/apigee/var/log/edge-message-processor/logs/system.log
جستجو کنید تا ببینید آیا خطاهای
502
در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده است) یا آیا درخواست هایی وجود دارد که هنوز با502
ناموفق هستند. می توانید از رشته های جستجوی زیر استفاده کنید:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- خطوطی را از
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)
در طول فرآیند فشرده سازی، به محض اینکه پردازشگر پیام تشخیص داد که کل بایت های خوانده شده > 10 مگابایت است، متوقف می شود و خط زیر را چاپ می کند:
Message is too large. TotalRead 10489856 chunkCount 2571
به این معنی است که حجم بار پاسخگویی بیش از 10 مگابایت است و Apigee زمانی که اندازه شروع به تجاوز از حد مجاز 10 مگابایت با کد خطا به عنوان
protocol.http.TooBigBody
Apigee خطا را نشان میدهد.http.TooBigBody
- اگر ردی برای درخواست ناموفق ثبت کرده اید، به مراحل شرح داده شده در Trace و مراجعه کنید
قطعنامه
اندازه را ثابت کنید
گزینه شماره 1 [توصیه می شود]: برنامه سرور مورد نظر را اصلاح کنید تا اندازه بار بیش از حد Apigee ارسال نکند
- دلیل ارسال پاسخ / حجم محموله بیشتر از حد مجاز توسط سرور هدف خاص را که در Limits تعریف شده است، تجزیه و تحلیل کنید.
- اگر مطلوب نیست، برنامه سرور مورد نظر خود را طوری تغییر دهید که پاسخ / حجم بار کمتر از حد مجاز را ارسال کند.
- در صورت تمایل و تمایل به ارسال پاسخ/باری بیش از حد مجاز، به گزینه های بعدی بروید.
الگوی 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 مستند شده است ارسال نکند.
- اگر کاربر Public Cloud هستید، حداکثر محدودیت اندازه بار درخواست و پاسخ همانگونه است که برای
Request/response size
در Apigee Edge Limits مستند شده است. - اگر کاربر Private Cloud هستید، ممکن است حداکثر حد پیشفرض برای اندازه بار درخواست و پاسخ را تغییر داده باشید (حتی اگر این یک روش توصیهشده نیست). با دنبال کردن دستورالعملهای نحوه بررسی محدودیت فعلی، میتوانید حداکثر محدودیت اندازه بار درخواستی را تعیین کنید.
چگونه حد فعلی را بررسی کنیم؟
این بخش نحوه تأیید اینکه ویژگی HTTPResponse.body.buffer.limit
با یک مقدار جدید در پردازشگرهای پیام به روز شده است را توضیح می دهد.
در دستگاه Message Processor، ویژگی
HTTPResponse.body.buffer.limit
را در پوشه/opt/apigee/edge-message- processor/conf
جستجو کنید و بررسی کنید که چه مقداری مطابق شکل زیر تنظیم شده است:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
نتیجه نمونه دستور بالا به شرح زیر است:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
در خروجی مثال بالا، توجه کنید که ویژگی
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