شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
علامت
برنامه سرویس گیرنده یک کد وضعیت HTTP 502 Bad Gateway
با protocol.http.TooBigLine
کد خطا دریافت می کند.http.TooBigLine به عنوان پاسخی برای تماس های API.
پیغام خطا
برنامه مشتری کد پاسخ زیر را دریافت می کند:
HTTP/1.1 502 Bad Gateway
علاوه بر این، ممکن است پیغام خطای زیر را مشاهده کنید:
{ "fault":{ "faultstring":"response line size exceeding 2,048", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
علل احتمالی
این خطا در صورتی رخ می دهد که اندازه Response-Line ارسال شده توسط سرور هدف/بکاند به Apigee Edge به عنوان بخشی از پاسخ HTTP از حداکثر حد مجاز در Apigee Edge بیشتر باشد.
قبل از اینکه به دلایل احتمالی این خطا نگاه کنیم، بیایید بفهمیم که Response-Line به چه معناست و چگونه اندازه آن را بررسی کنیم.
درک پاسخ-خط
یک پاسخ HTTP معمولی از سه بخش تشکیل شده است:
- خط وضعیت (به عنوان خط پاسخ در Apigee نامیده می شود)
- ( مجموعه ای از هدرهای HTTP )
- [بدن]
Response-Line از سه بخش تشکیل شده است: نسخه پروتکل و به دنبال آن یک کد وضعیت عددی و عبارت متنی مرتبط با آن همانطور که در زیر نشان داده شده است:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
هنگامی که یک پاسخ HTTP توسط برنامه سرور هدف/باطن ارسال می شود، اولین خطی که ارسال می شود نشان دهنده خط پاسخ است که در بالا توضیح داده شد. به دنبال آن سرصفحه ها و بدنه/بار پاسخ قرار می گیرند. نمونه تصویر زیر یک درخواست معمولی curl
، بخش Request و بخش Response (همراه با Response-Line) را نشان می دهد.
درک اندازه خط پاسخ
در نمونه ای که در بالا مورد بحث قرار گرفت، خط شروع (خط اول) در پاسخ که به آن پاسخ-خط نیز گفته می شود به شرح زیر است:
HTTP/1.1 200 OK
این Response-Line دارای اندازه
~15 bytes
است زیرا حاوی15 ASCII characters
است. از آنجایی که این در محدوده مجاز در Apigee Edge است، پاسخ بدون هیچ خطایی توسط Apigee Edge به مشتری ارسال می شود.- به طور مشابه، اگر به
faultstring
در پیام خطا نشان داده شده در بالا نگاه کنید، حاوی"response line size exceeding 2,048"
است. این نشان میدهد که Response-Line در پاسخ HTTP ارسال شده توسط سرور هدف/بکاند از 2048 بایت فراتر رفته است.
درک پاسخ بزرگ
طبق تعریف Status-Line (که در اینجا به آن Response-Line اشاره می شود) و درخواست ها و پاسخ های HTTP معمولی، اندازه آن بسیار کوچکتر از حد پیش فرض تعریف شده 2 K در Apigee Edge خواهد بود، بنابراین ممکن است به این حد نرسد. با این حال، در اینجا چند سناریو احتمالی وجود دارد که ممکن است از این حد تجاوز کنید:
- سرور هدف/باطن یک سیستم HTTP نیست. ممکن است با یک پاسخ غیر HTTP پاسخ دهد.
- سرور هدف/باطن دارای مشکلاتی است و یک پاسخ طولانی به عنوان بخشی از پاسخ HTTP ارسال می کند.
بیشتر در مورد این در دریافت پروتکل خطا بخوانید.http.TooBigLine، "اندازه خط پاسخ بیش از 2048 .
در اینجا دلایل احتمالی خطا وجود دارد:
علت | توضیحات | دستورالعمل های عیب یابی قابل اجرا برای |
---|---|---|
اندازه پاسخ-خط بزرگتر از حد مجاز است | اندازه Response-Line ارسال شده توسط سرور هدف/بکاند به عنوان بخشی از پاسخ HTTP به Apigee Edge از حد مجاز در Apigee Edge بیشتر است. | کاربران Edge Public و Private Cloud |
مراحل تشخیص رایج
برای تشخیص این خطا از یکی از ابزارها/تکنیک های زیر استفاده کنید:
مانیتورینگ API
برای تشخیص خطا با استفاده از API Monitoring:
- به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید در آن موضوع را بررسی کنید بروید.
- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کرده اید انتخاب کنید.
- میتوانید فیلتر Proxy را برای محدود کردن کد خطا انتخاب کنید.
- کد خطا را در برابر زمان ترسیم کنید.
سلولی را انتخاب کنید که دارای
protocol.http.TooBigLine
کد خطا باشد.http.TooBigLine مانند شکل زیر:اطلاعات مربوط به
protocol.http.TooBigLine
کد خطا را مشاهده خواهید کرد.http.TooBigLine مانند شکل زیر:روی View logs کلیک کنید و ردیف درخواست ناموفق را گسترش دهید.
- از پنجره Logs به جزئیات زیر توجه کنید:
- کد وضعیت:
502
- منبع خطا:
target
- کد خطا:
protocol.http.TooBigLine
.
- کد وضعیت:
- اگر منبع خطا دارای مقدار
target
باشد و کد خطا دارایprotocol.http.TooBigLine
مقدار باشد.http.TooBigLine، پس این نشان میدهد که پاسخ HTTP از سرور هدف/باطن دارای اندازه Response-Line بزرگتر از حداکثر حد مجاز در Apigee Edge است .
ابزار ردیابی
- جلسه ردیابی را فعال کنید و یا:
- منتظر بمانید تا خطای
502 Bad Gateway
رخ دهد. یا - اگر میتوانید مشکل را تکرار کنید، تماس API را برقرار کرده و خطای
502 Bad Gateway
را تکرار کنید.
- منتظر بمانید تا خطای
- یکی از درخواست های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
شما معمولاً همانگونه که در زیر نشان داده شده است، دقیقاً پس از ارسال درخواست به سرور هدف، خطا را در خطای
flowinfo
پیدا خواهید کرد:به مقادیر خطا از trace توجه کنید:
- خطا:
response line exceeding 2,048
- error.class :
com.apigee.errors.http.server.BadGateway
این نشان میدهد که Apigee Edge (کامپوننت پردازشگر پیام) به محض دریافت پاسخ از سرور باطن، به دلیل بزرگتر شدن اندازه Response-Line از حد مجاز، خطا را ایجاد میکند.
- خطا:
در مرحله Response Sent to Client پیغام خطای ارسال شده برای مشتری را مانند شکل زیر مشاهده خواهید کرد:
- به مقادیر خطا از trace توجه کنید:
- خطا:
502 Bad Gateway
. - محتوای خطا:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- خطا:
همچنین می توانید به مرحله AX (Analytics Data Recorded) در ردیابی بروید و روی آن کلیک کنید تا جزئیات خطا را ببینید.
به ارزش موارد زیر توجه کنید:
درخواست سرصفحه ها ارزش X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
محتوای خطا: بدنه {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
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.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 target
علت: اندازه پاسخ-خط بزرگتر از حد مجاز است
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
- اگر منبع خطا دارای مقدار
target
باشد، این نشان می دهد که اندازه پاسخ-خط ارسال شده توسط برنامه سرور هدف/پشتیبان به Apigee بیشتر از حد مجاز در Apigee Edge است. می توانید با استفاده از یکی از روش های زیر تأیید کنید که اندازه پاسخ-خط از حد مجاز 2 کیلوبایت فراتر رفته است:
پیغام خطا
برای تأیید اعتبار با استفاده از پیام خطا:
اگر به پیام خطای کامل دریافت شده از Apigee Edge دسترسی دارید، به
faultstring
مراجعه کنید.نمونه پیغام خطا:
"faultstring":"response line size exceeding 2,048"
faultstring
بالا نشان می دهد که اندازه Response-Line از حد مجاز ۲ کیلوبایت فراتر رفته است.درخواست واقعی
برای تأیید اعتبار با استفاده از درخواست واقعی:
اگر به درخواست واقعی ارسال شده به برنامه سرور هدف/بکاند دسترسی دارید، مراحل زیر را انجام دهید:
- اندازه Response-Line را بررسی کنید
- اگر متوجه شدید که اندازه URI بیش از حد مجاز در Apigee Edge است، دلیل این مشکل همین است.
نمونه پاسخ از سرور هدف/باطن:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
در مورد بالا، Response-Line
HTTP/1.1 200 1111…<trimmed>...11111111
بزرگتر از 2 کیلوبایت است، یعنی حاوی بیش از 2 K کاراکتر ASCII است.اگر از مشتری دیگری استفاده میکنید، میتوانید گزارشهای مشتری را بررسی کنید و سعی کنید اندازه پاسخ-خط ارسال شده به Apigee Edge را بیابید.
گزارشهای پردازشگر پیام
برای تأیید اعتبار با استفاده از گزارشهای پردازشگر پیام:
اگر کاربر Private Cloud هستید، میتوانید از گزارشهای پردازشگر پیام برای تأیید اینکه آیا اندازه Response-Line از حد مجاز در Apigee Edge فراتر رفته است استفاده کنید.
- شناسه پیام درخواست ناموفق را با استفاده از مانیتورینگ API، ابزار ردیابی یا گزارشهای دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
شناسه پیام را در گزارش پردازشگر پیام جستجو کنید:
/opt/apigee/var/log/edge-message-processor/logs/system.log
خطوطی را از
system.log
مشابه موارد زیر خواهید یافت:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
message = response line size exceeding 2,048
در پیام خطای بالا نشان می دهد که اندازه پاسخ-خط بیش از 2 کیلوبایت است. بنابراین، Apigee Edge استثنا را پرتاب میکند و یک کد وضعیت502
باprotocol.http.TooBigline
کد خطا.http.TooBigline را به برنامههای مشتری برمیگرداند.
قطعنامه
اندازه را ثابت کنید
گزینه شماره 1 [توصیه میشود]: برنامه سرور هدف/بکاند را اصلاح کنید تا خطوط پاسخی با اندازه بزرگتر از حد مجاز ارسال نشود.
- دلیل ارسال یک خط پاسخ به اندازه بیش از حد مجاز توسط مشتری خاص را که در Limits تعریف شده است، تجزیه و تحلیل کنید.
- اگر مطلوب نیست، برنامه سرور هدف/بکاند خود را طوری تغییر دهید که یک خط پاسخ با اندازه کمتر از حد مجاز ارسال کند.
- اگر مطلوب است و می خواهید یک Response-Line با اندازه بیش از حد مجاز ارسال کنید، به گزینه های بعدی بروید.
CwC
گزینه شماره 2: از ویژگی CwC برای افزایش محدودیت Response-Line استفاده کنید
Apigee یک ویژگی CwC را ارائه می دهد که به آن اجازه می دهد محدودیت اندازه پاسخ-خط را افزایش دهد. برای جزئیات، به تنظیم محدودیت خط پاسخ در پردازشگر پیام مراجعه کنید.
محدودیت ها
Apigee انتظار دارد که برنامه کلاینت و سرور باطن، خطوط درخواست/پاسخی را که اندازه آنها بزرگتر از حد مجاز است، همانطور که برای محدودیت خط درخواست/پاسخ در Apigee Edge Limits مستند شده است، ارسال نکند.
- اگر کاربر Public Cloud هستید، حداکثر محدودیت برای اندازه خط درخواست و پاسخ همانطور که برای اندازه درخواست/خط پاسخ در Apigee Edge Limits مستند شده است.
- اگر کاربر Private Cloud هستید، ممکن است حداکثر حد پیشفرض برای اندازه درخواست و پاسخ را تغییر داده باشید (حتی اگر این یک عمل توصیهشده نیست). شما می توانید حداکثر محدودیت اندازه پاسخ-خط را با دنبال کردن دستورالعمل ها در نحوه بررسی محدودیت فعلی تعیین کنید.
چگونه حد فعلی را بررسی کنیم؟
این بخش نحوه تأیید اینکه ویژگی HTTPResponse.line.limit
با یک مقدار جدید در پردازشگرهای پیام به روز شده است را توضیح می دهد.
- در دستگاه Message Processor، ویژگی
HTTPResponse.line.limit
را در پوشه/opt/apigee/edge-message-processor/conf
جستجو کنید و ببینید چه مقداری مطابق شکل زیر تنظیم شده است:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- نتیجه نمونه دستور بالا به شرح زیر است:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
در خروجی مثال بالا، توجه کنید که ویژگی
HTTPResponse.line.limit
با مقدار2k
درhttp.properties
تنظیم شده است.این نشان می دهد که محدودیت اندازه Response-Line پیکربندی شده در Apigee برای Private Cloud 2 کیلوبایت است.
اگر همچنان به کمک پشتیبانی 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