شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
برنامهی کلاینت، کد وضعیت HTTP 502 را به همراه پیام Bad Gateway به عنوان پاسخی برای فراخوانیهای API دریافت میکند.
کد وضعیت HTTP 502 به این معنی است که کلاینت پاسخ معتبری از سرورهای backend که باید درخواست را انجام دهند، دریافت نمیکند.
پیامهای خطا
برنامهی کلاینت کد پاسخ زیر را دریافت میکند:
HTTP/1.1 502 Bad Gateway
علاوه بر این، ممکن است پیام خطای زیر را مشاهده کنید:
{
"fault": {
"faultstring": "Unexpected EOF at target",
"detail": {
"errorcode": "messaging.adaptors.http.UnexpectedEOFAtTarget"
}
}
}علل احتمالی
یکی از دلایل معمول 502 Bad Gateway Error ، خطای Unexpected EOF است که میتواند به دلایل زیر ایجاد شود:
| علت | جزئیات | مراحل داده شده برای |
|---|---|---|
| سرور هدف به درستی پیکربندی نشده است | سرور هدف به درستی برای پشتیبانی از اتصالات TLS/SSL پیکربندی نشده است. | کاربران فضای ابری عمومی و خصوصی Edge |
| خطای EOFException از سرور بکاند | سرور backend ممکن است EOF را به طور ناگهانی ارسال کند. | فقط برای کاربران Edge Private Cloud |
| پیکربندی نادرست زمان انقضای keep-alive | وقفههای Keep alive در سرور Apigee و backend به طور نادرست پیکربندی شدهاند. | کاربران فضای ابری عمومی و خصوصی Edge |
مراحل تشخیص مشترک
برای تشخیص خطا، میتوانید از هر یک از روشهای زیر استفاده کنید:
نظارت بر API
برای تشخیص خطا با استفاده از مانیتورینگ API:
با استفاده از API Monitoring میتوانید خطاهای 502 را با دنبال کردن مراحلی که در بخش «بررسی مشکلات» توضیح داده شده است، بررسی کنید. یعنی:
- به داشبورد Investigate بروید.
- کد وضعیت (Status Code) را از منوی کشویی انتخاب کنید و مطمئن شوید که دوره زمانی مناسبی را برای وقوع خطاهای
502انتخاب کردهاید. - وقتی تعداد زیادی خطای
502میبینید، روی کادر موجود در ماتریس کلیک کنید. - در سمت راست، روی «مشاهده گزارشها» برای خطاهای
502کلیک کنید که چیزی شبیه به تصویر زیر خواهد بود: - منبع خطا
targetاست - کد خطا
messaging.adaptors.http.UnexpectedEOFAtTargetاست.

در اینجا میتوانیم اطلاعات زیر را ببینیم:
این نشان میدهد که خطای 502 به دلیل EOF غیرمنتظره توسط هدف ایجاد شده است.
علاوه بر این، Request Message ID مربوط به خطای 502 را برای بررسی بیشتر یادداشت کنید.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و فراخوانی API را برای تولید مجدد مشکل
502 Bad Gatewayانجام دهید. - یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خطا را پیدا کنید.
شما باید پس از ارسال درخواست به سرور هدف، خطایی را مطابق شکل زیر مشاهده کنید:


مقدار X-Apigee.fault-source و X-Apigee.fault-code را در فاز AX (دادههای تحلیلی ثبتشده) در ردیابی تعیین کنید.
اگر مقادیر X-Apigee.fault-source و X-Apigee.fault-code با مقادیر نشان داده شده در جدول زیر مطابقت داشته باشند، میتوانید تأیید کنید که خطای
502از سرور هدف میآید:هدرهای پاسخ ارزش منبع گسل X-Apigee targetکد خطا X-Apigee messaging.adaptors.http.flow.UnexpectedEOFAtTargetعلاوه بر این، برای بررسی بیشتر
X-Apigee.Message-IDمربوط به خطای502را یادداشت کنید.
گزارشهای دسترسی NGINX
برای تشخیص خطا با استفاده از NGINX:
همچنین میتوانید برای تعیین علت کد وضعیت 502 به گزارشهای دسترسی NGINX مراجعه کنید. این امر به ویژه در صورتی مفید است که مشکل در گذشته رخ داده باشد یا اگر مشکل به صورت متناوب رخ میدهد و شما قادر به ثبت رد آن در رابط کاربری نیستید. برای تعیین این اطلاعات از گزارشهای دسترسی NGINX، از مراحل زیر استفاده کنید:
- لاگهای دسترسی NGINX را بررسی کنید.
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log - جستجوی هرگونه خطای
502برای پروکسی API خاص در یک دوره زمانی خاص (اگر مشکل در گذشته رخ داده است) یا برای هرگونه درخواستی که هنوز با خطای502با شکست مواجه میشود. - اگر هرگونه خطای
502وجود دارد، بررسی کنید که آیا خطا ناشی از ارسال یکUnexpected EOFتوسط هدف است یا خیر. اگر مقادیر X-Apigee.fault-source و X-Apigee.fault-code با مقادیر نشان داده شده در جدول زیر مطابقت داشته باشند، خطای502ناشی از قطع غیرمنتظره اتصال توسط هدف است:هدرهای پاسخ ارزش منبع گسل X-Apigee targetکد خطا X-Apigee messaging.adaptors.http.flow.UnexpectedEOFAtTargetدر اینجا یک نمونه ورودی وجود دارد که خطای
502ایجاد شده توسط سرور هدف را نشان میدهد:
علاوه بر این، شناسههای پیام مربوط به خطاهای 502 را برای بررسی بیشتر یادداشت کنید.
علت: سرور هدف به درستی پیکربندی نشده است
سرور هدف به درستی برای پشتیبانی از اتصالات TLS/SSL پیکربندی نشده است.
تشخیص
- برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
502، از API Monitoring ، ابزار Trace یا گزارشهای دسترسی NGINX استفاده کنید. - ردیابی را در رابط کاربری برای API آسیبدیده فعال کنید.
- اگر ردیابی درخواست ناموفق API موارد زیر را نشان دهد:
- خطای
502 Bad Gatewayبه محض شروع درخواست جریان هدف مشاهده میشود. - کلاس
error.classmessaging.adaptors.http.UnexpectedEOF.پس به احتمال زیاد این مشکل ناشی از پیکربندی نادرست سرور هدف است.
- خطای
- تعریف سرور هدف را با استفاده از فراخوانی API مدیریت Edge دریافت کنید:
- اگر کاربر فضای ابری عمومی هستید، از این API استفاده کنید:
curl -v https://api.enterprise.apigee.com/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
- اگر کاربر Private Cloud هستید، از این API استفاده کنید:
curl -v http://<management-server-host>:<port #>/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
نمونه تعریف معیوب
TargetServer:<TargetServer name="target1"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer >
- اگر کاربر فضای ابری عمومی هستید، از این API استفاده کنید:
تعریف نشان داده شده
TargetServerنمونهای از یکی از پیکربندیهای نادرست معمول است که به شرح زیر توضیح داده شده است:فرض کنید سرور هدف
mocktarget.apigee.netطوری پیکربندی شده است که اتصالات امن (HTTPS) را روی پورت443بپذیرد. با این حال، اگر به تعریف سرور هدف نگاه کنید، هیچ ویژگی/پرچم دیگری وجود ندارد که نشان دهد برای اتصالات امن در نظر گرفته شده است. این باعث میشود Edge درخواستهای API که به سرور هدف خاص میروند را به عنوان درخواستهای HTTP (غیر امن) در نظر بگیرد. بنابراین Edge فرآیند SSL Handshake را با این سرور هدف آغاز نخواهد کرد.از آنجایی که سرور هدف طوری پیکربندی شده است که فقط درخواستهای HTTPS (SSL) را در
443بپذیرد، درخواست Edge را رد میکند یا اتصال را میبندد. در نتیجه، خطایUnexpectedEOFAtTargetدر پردازنده پیام دریافت میکنید. پردازنده پیام،502 Bad Gatewayبه عنوان پاسخ به کلاینت ارسال میکند.
وضوح تصویر
همیشه مطمئن شوید که سرور هدف به درستی مطابق با نیازهای شما پیکربندی شده است.
برای مثال نشان داده شده در بالا، اگر میخواهید درخواستهایی را به یک سرور هدف امن (HTTPS/SSL) ارسال کنید، باید ویژگیهای SSLInfo را با پرچم enabled flag) که روی true تنظیم شده است، وارد کنید. اگرچه اضافه کردن ویژگیهای SSLInfo برای یک سرور هدف در تعریف خود نقطه پایانی هدف مجاز است، اما توصیه میشود ویژگیهای SSLInfo را به عنوان بخشی از تعریف سرور هدف اضافه کنید تا از هرگونه سردرگمی جلوگیری شود.
- اگر سرویس backend به ارتباط SSL یک طرفه نیاز دارد، آنگاه:
- شما باید TLS/SSL را در تعریف
TargetServerبا اضافه کردن ویژگیهایSSLInfoکه در آن پرچمenabledروی true تنظیم شده است، فعال کنید، همانطور که در زیر نشان داده شده است:<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer> - اگر میخواهید گواهی سرور هدف را در Edge اعتبارسنجی کنید، باید truststore (حاوی گواهی سرور هدف) را نیز مطابق شکل زیر وارد کنیم:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Ciphers/> <ClientAuthEnabled>false</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <Protocols/> <TrustStore>mocktarget-truststore</TrustStore> </SSLInfo> </TargetServer>
- شما باید TLS/SSL را در تعریف
- اگر سرویس backend به ارتباط SSL دو طرفه نیاز دارد، آنگاه:
- شما باید ویژگیهای
SSLInfoرا با پرچمهایClientAuthEnabled،Keystore،KeyAliasوTruststoreبه طور مناسب تنظیم کنید، همانطور که در زیر نشان داده شده است:<TargetServer name="mocktarget"> <IsEnabled>true</IsEnabled> <Host>www.example.com</Host> <Port>443</Port> <SSLInfo> <Ciphers/> <ClientAuthEnabled>true</ClientAuthEnabled> <Enabled>true</Enabled> <IgnoreValidationErrors>false</IgnoreValidationErrors> <KeyAlias>keystore-alias</KeyAlias> <KeyStore>keystore-name</KeyStore> <Protocols/> <TrustStore>truststore-name</TrustStore> </SSLInfo> </TargetServer >
- شما باید ویژگیهای
منابع
متعادلسازی بار در سرورهای بکاند
علت: خطای EOFException از سرور backend
سرور backend ممکن است به طور ناگهانی EOF (پایان فایل) را ارسال کند.
تشخیص
- برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
502، از API Monitoring ، ابزار Trace یا گزارشهای دسترسی NGINX استفاده کنید. - لاگهای پردازشگر پیام (
/opt/apigee/var/log/edge-message-processor/logs/system.log) را بررسی کنید و جستجو کنید تا ببینید آیا برای API خاصeof unexpectedدارید یا اگرmessageidمنحصر به فردی برای درخواست API دارید، میتوانید آن را جستجو کنید.نمونه ردیابی پشته استثنا از گزارش پردازشگر پیام
"message": "org:myorg env:test api:api-v1 rev:10 messageid:rrt-1-14707-63403485-19 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : SSLClientChannel[C:193.35.250.192:8443 Remote host:0.0.0.0:50100]@459069 useCount=6 bytesRead=0 bytesWritten=755 age=40107ms lastIO=12832ms .onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) ~[nio-1.0.0.jar:na] at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) ~[nio-1.0.0.jar:na] at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:79) ~[http-1.0.0.jar:na] at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) [nio-1.0.0.jar:na] at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:123) [nio-1.0.0.jar:na]"
در مثال بالا، میتوانید ببینید که خطای
java.io.EOFException: eof unexpectedدر حالی رخ داده است که پردازندهی پیام (Message Processor) در تلاش برای خواندن پاسخی از سرور backend است. این خطا نشان میدهد که فایل (EOF) به پایان رسیده است، یا به طور غیرمنتظرهای به پایان جریان (stream) رسیده است.یعنی، پردازنده پیام، درخواست API را به سرور backend ارسال کرده و منتظر یا در حال خواندن پاسخ بوده است. با این حال، سرور backend قبل از اینکه پردازنده پیام پاسخ را دریافت کند یا بتواند پاسخ کامل را بخواند، اتصال را به طور ناگهانی قطع کرده است.
- لاگهای سرور بکاند خود را بررسی کنید و ببینید آیا خطا یا اطلاعاتی وجود دارد که بتواند باعث شود سرور بکاند اتصال را به طور ناگهانی قطع کند. اگر هرگونه خطا/اطلاعاتی پیدا کردید، به بخش حل مشکل بروید و مشکل را به طور مناسب در سرور بکاند خود برطرف کنید.
- اگر هیچ خطا یا اطلاعاتی در سرور backend خود پیدا نکردید، خروجی
tcpdumpرا در Message Processors جمعآوری کنید:- اگر میزبان سرور backend شما یک آدرس IP واحد دارد، از دستور زیر استفاده کنید:
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
- اگر میزبان سرور backend شما چندین آدرس IP دارد، از دستور زیر استفاده کنید:
tcpdump -i any -s 0 host HOSTNAME -w FILE_NAME
معمولاً این خطا به این دلیل ایجاد میشود که سرور backend به محض ارسال درخواست به سرور backend توسط پردازنده پیام، با
[FIN,ACK]پاسخ میدهد.
- اگر میزبان سرور backend شما یک آدرس IP واحد دارد، از دستور زیر استفاده کنید:
مثال
tcpdumpزیر را در نظر بگیرید.نمونه
tcpdumpگرفته شده هنگام وقوع502 Bad Gateway Error(UnexpectedEOFAtTarget)
- از خروجی TCPDump ، توالی رویدادهای زیر را مشاهده میکنید:
- در بسته
985، پردازنده پیام، درخواست API را به سرور backend ارسال میکند. - در بسته
986، سرور backend بلافاصله با[FIN,ACK]پاسخ میدهد. - در بسته
987، پردازنده پیام با[FIN,ACK]به سرور backend پاسخ میدهد. - در نهایت، اتصالات با
[ACK]و[RST]از هر دو طرف بسته میشوند. - از آنجایی که سرور backend
[FIN,ACK]را ارسال میکند، خطایjava.io.EOFException: eof unexpectedexception در پردازنده پیام رخ میدهد.
- در بسته
- این اتفاق میتواند در صورت وجود مشکل شبکه در سرور backend رخ دهد. تیم عملیات شبکه خود را برای بررسی بیشتر این مشکل استخدام کنید.
وضوح تصویر
مشکل را در سرور backend به طور مناسب برطرف کنید.
اگر مشکل همچنان ادامه داشت و برای عیبیابی 502 Bad Gateway Error به کمک نیاز داشتید یا گمان میکنید که مشکل از داخل Edge است، با پشتیبانی Apigee Edge تماس بگیرید.
علت: پیکربندی نادرست زمان انقضای keep-alive
قبل از اینکه تشخیص دهید آیا این دلیل خطاهای 502 است یا خیر، لطفاً مفاهیم زیر را مطالعه کنید.
اتصالات پایدار در Apigee
Apigee به طور پیشفرض (و مطابق با استاندارد HTTP/1.1) هنگام برقراری ارتباط با سرور backend هدف از اتصالات پایدار استفاده میکند. اتصالات پایدار میتوانند با امکان استفاده مجدد از یک اتصال TCP و (در صورت وجود) TLS/SSL که از قبل برقرار شده است، عملکرد را افزایش دهند، که باعث کاهش سربار تأخیر میشود. مدت زمانی که یک اتصال باید پایدار باشد از طریق ویژگی keep alive timeout ( keepalive.timeout.millis ) کنترل میشود.
هم سرور backend و هم پردازشگر پیام Apigee از وقفههای keep alive برای باز نگه داشتن ارتباط با یکدیگر استفاده میکنند. زمانی که هیچ دادهای در مدت زمان وقفه keep alive دریافت نشود، سرور backend یا پردازشگر پیام میتوانند ارتباط با یکدیگر را ببندند.
پروکسیهای API که در یک پردازشگر پیام در Apigee مستقر میشوند، به طور پیشفرض، دارای زمان انتظار keep alive هستند که روی 60s تنظیم شده است، مگر اینکه لغو شود. به محض اینکه هیچ دادهای به مدت 60s دریافت نشود، Apigee ارتباط با سرور backend را قطع میکند. سرور backend نیز یک زمان انتظار keep alive را حفظ میکند و به محض انقضای این زمان، سرور backend ارتباط با پردازشگر پیام را قطع میکند.
پیامد پیکربندی نادرست زمانبندی keep-alive
اگر Apigee یا سرور backend با زمانبندیهای keep-alive نادرست پیکربندی شده باشند، منجر به شرایط رقابتی میشود که باعث میشود سرور backend در پاسخ به درخواست یک منبع، یک End Of File (FIN) غیرمنتظره ارسال کند.
برای مثال، اگر زمان انتظار keep alive در پروکسی API یا پردازشگر پیام با مقداری بزرگتر یا مساوی زمان انتظار سرور backend بالادست پیکربندی شده باشد، شرایط رقابتی زیر ممکن است رخ دهد. به این معنی که اگر پردازشگر پیام تا زمانی که خیلی نزدیک به آستانهی زمان انتظار keep alive سرور backend نباشد، هیچ دادهای دریافت نکند، درخواستی از طریق اتصال موجود به سرور backend ارسال میشود. این میتواند منجر به خطای 502 Bad Gateway به دلیل خطای EOF غیرمنتظره شود، همانطور که در زیر توضیح داده شده است:
- فرض کنید زمان انتظار keep alive که هم روی پردازشگر پیام و هم روی سرور backend تنظیم شده، ۶۰ ثانیه است و هیچ درخواست جدیدی تا ۵۹ ثانیه پس از ارائه درخواست قبلی توسط پردازشگر پیام خاص، ارسال نشده است.
- پردازشگر پیام (Message Processor) با استفاده از اتصال موجود (از آنجایی که مهلت Keep Alive هنوز تمام نشده است) درخواستی را که در ثانیه ۵۹ رسیده است، پردازش میکند و درخواست را به سرور backend ارسال میکند.
- با این حال، قبل از اینکه درخواست به سرور backend برسد، آستانهی مهلت keep-alive در سرور backend از آن زمان فراتر رفته است.
- درخواست پردازنده پیام برای دریافت منبع در حال انجام است، اما سرور پشتیبان با ارسال یک بسته
FINبه پردازنده پیام، سعی در قطع اتصال دارد. - در حالی که پردازنده پیام منتظر دریافت دادهها است، در عوض
FINغیرمنتظره را دریافت میکند و اتصال خاتمه مییابد. - این منجر به یک
Unexpected EOFمیشود و متعاقباً یک502توسط پردازنده پیام به کلاینت بازگردانده میشود.
در این مورد، مشاهده کردیم که خطای 502 به این دلیل رخ داده است که مقدار زمان انتظار keep alive در هر دو سمت پردازشگر پیام و سرور backend یکسان و برابر با ۶۰ ثانیه تنظیم شده است. به طور مشابه، اگر مقدار زمان انتظار keep alive در پردازشگر پیام بالاتر از سرور backend باشد، این مشکل میتواند رخ دهد.
تشخیص
- اگر شما یک کاربر فضای ابری عمومی هستید:
- از ابزار API Monitoring یا Trace (همانطور که در مراحل تشخیص مشترک توضیح داده شده است) استفاده کنید و تأیید کنید که هر دو تنظیمات زیر را دارید:
- کد خطا:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget - منبع خطا:
target
- کد خطا:
- برای بررسی بیشتر به بخش استفاده از tcpdump مراجعه کنید.
- از ابزار API Monitoring یا Trace (همانطور که در مراحل تشخیص مشترک توضیح داده شده است) استفاده کنید و تأیید کنید که هر دو تنظیمات زیر را دارید:
- اگر شما یک کاربر فضای ابری خصوصی هستید:
- از ابزار Trace یا لاگهای دسترسی NGINX برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
502استفاده کنید. - شناسه پیام را در گزارش پردازشگر پیام جستجو کنید
(/opt/apigee/var/log/edge-message-processor/logs/system.log). - همانطور که در زیر نشان داده شده است، خطای
java.io.EOFEXception: eof unexpectedرا مشاهده خواهید کرد:2020-11-22 14:42:39,917 org:myorg env:prod api:myproxy rev:1 messageid:myorg-opdk-dc1-node2-17812-56001-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:51.254.225.9:80 Local:10.154.0.61:35326]@12972 useCount=7 bytesRead=0 bytesWritten=159 age=7872ms lastIO=479ms isOpen=true.onExceptionRead exception: {} java.io.EOFException: eof unexpected at com.apigee.nio.channels.PatternInputChannel.doRead(PatternInputChannel.java:45) at com.apigee.nio.channels.InputChannel.read(InputChannel.java:103) at com.apigee.protocol.http.io.MessageReader.onRead(MessageReader.java:80) at com.apigee.nio.channels.DefaultNIOSupport$DefaultIOChannelHandler.onIO(NIOSupport.java:51) at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:220)
- خطای
java.io.EOFException: eof unexpectedنشان میدهد که پردازنده پیام، در حالی که هنوز منتظر خواندن پاسخی از سرور backend بوده، یکEOFدریافت کرده است. - ویژگی
useCount=7در پیام خطای بالا نشان میدهد که پردازنده پیام حدود هفت بار از این اتصال استفاده مجدد کرده است و ویژگیbytesWritten=159نشان میدهد که پردازنده پیام درخواست159بایتی را به سرور backend ارسال کرده است. با این حال، هنگام وقوعEOFغیرمنتظره، صفر بایت دریافت کرده است. این نشان میدهد که پردازنده پیام چندین بار از همان اتصال استفاده کرده است و در این مورد داده ارسال کرده اما کمی بعد، قبل از دریافت هرگونه داده، یک
EOFدریافت کرده است. این بدان معناست که احتمال زیادی وجود دارد که زمان انتظار Keep Alive سرور backend کوتاهتر یا مساوی با مقدار تنظیم شده در پروکسی API باشد.شما میتوانید با کمک
tcpdumpهمانطور که در زیر توضیح داده شده است، تحقیقات بیشتری انجام دهید.
- از ابزار Trace یا لاگهای دسترسی NGINX برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
استفاده از tcpdump
- با دستور زیر، یک
tcpdumpروی سرور backend ضبط کنید:tcpdump -i any -s 0 host MP_IP_Address -w File_Name
-
tcpdumpضبط شده را تجزیه و تحلیل کنید:این هم یک نمونه خروجی tcpdump:

در نمونه
tcpdumpبالا، میتوانید موارد زیر را مشاهده کنید:- در بستهی
5992,سرور backend یک درخواستGETدریافت کرد. - در بسته
6064، با200 OK. - در بستهی
6084، سرور backend درخواستGETدیگری دریافت کرد. - در بستهی
6154، با200 OKپاسخ میدهد. - در بستهی
6228، سرور backend درخواستGETسومی را دریافت کرد. - این بار، سرور backend یک
FIN, ACKبه پردازنده پیام (بسته6285) برمیگرداند که باعث آغاز بسته شدن اتصال میشود.
در این مثال، همان اتصال دو بار با موفقیت دوباره استفاده شد، اما در درخواست سوم، سرور backend شروع به بستن اتصال میکند، در حالی که پردازنده پیام منتظر دادهها از سرور backend است. این نشان میدهد که زمان انتظار keep alive سرور backend به احتمال زیاد کوتاهتر یا مساوی مقدار تعیین شده در پروکسی API است. برای تأیید این موضوع، به مقایسه زمان انتظار keep alive در Apigee و سرور backend مراجعه کنید.
- در بستهی
مقایسه زمان انتظار Keep Alive در سرور Apigee و سرور backend
- به طور پیشفرض، Apigee از مقدار ۶۰ ثانیه برای ویژگی keep alive timeout استفاده میکند.
با این حال، ممکن است مقدار پیشفرض را در API Proxy تغییر داده باشید. میتوانید با بررسی تعریف خاص
TargetEndpointدر API Proxy که خطای502میدهد، این موضوع را تأیید کنید.نمونه پیکربندی TargetEndpoint:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="keepalive.timeout.millis">30000</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>در مثال بالا، ویژگی keep alive timeout با مقدار 30 ثانیه (
30000میلی ثانیه) بازنویسی شده است.- در مرحله بعد، ویژگی keep alive timeout که در سرور backend شما پیکربندی شده است را بررسی کنید. فرض کنید سرور backend شما با مقدار
25 secondsپیکربندی شده است. - اگر مانند مثال بالا تشخیص دهید که مقدار ویژگی keep alive timeout در Apigee بیشتر از مقدار ویژگی keep alive timeout در سرور backend است، در این صورت دلیل خطای
502همین است.
وضوح تصویر
مطمئن شوید که مقدار زمان انتظار keep alive در Apigee (در کامپوننتهای API Proxy و Message Processor) همیشه کمتر از مقدار آن در سرور backend باشد.
- مقدار تعیین شده برای زمان انتظار keep alive در سرور backend را تعیین کنید.
- با استفاده از مراحل شرح داده شده در پیکربندی keep alive timeout در پردازندههای پیام، مقدار مناسبی را برای ویژگی keep alive timeout در پروکسی API یا پردازنده پیام پیکربندی کنید، به طوری که ویژگی keep alive timeout کمتر از مقدار تعیین شده در سرور backend باشد.
اگر مشکل همچنان ادامه داشت، به «باید اطلاعات تشخیصی جمعآوری شود» بروید.
بهترین روش
اکیداً توصیه میشود که اجزای پاییندستی همیشه آستانهی زمان انتظار برای زنده ماندن (keep alive timeout) کمتری نسبت به سرورهای بالادستی داشته باشند تا از این نوع شرایط رقابتی و خطاهای 502 جلوگیری شود. هر گام پاییندستی باید پایینتر از هر گام بالادستی باشد. در Apigee Edge، استفاده از دستورالعملهای زیر روش خوبی است:
- زمان انتظار Keep Alive کلاینت باید کمتر از زمان انتظار Keep Alive روتر لبهای باشد.
- زمان انتظار برای keep-alive روتر لبه باید کمتر از زمان انتظار keep-alive پردازنده پیام باشد.
- زمان انتظار keep alive در پردازشگر پیام باید کمتر از زمان انتظار keep alive در سرور هدف باشد.
- اگر هر هاپ دیگری در جلو یا پشت Apigee دارید، همین قانون باید اعمال شود. شما همیشه باید مسئولیت قطع ارتباط با آپاستریم را به کلاینت پاییندست بسپارید.
باید اطلاعات تشخیصی جمعآوری کند
اگر مشکل حتی پس از پیروی از دستورالعملهای بالا ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlرا برای بازتولید خطای502کامل کنید - فایل ردیابی حاوی درخواستهایی با خطای
502 Bad Gateway - Unexpected EOF - اگر خطاهای
502در حال حاضر رخ نمیدهند، دوره زمانی را به همراه اطلاعات منطقه زمانی که خطاهای502در گذشته رخ دادهاند، ارائه دهید.
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شده برای درخواستهای ناموفق
- نام سازمان، محیط و نام پروکسی API که در آن خطای
502مشاهده میکنید - بسته پروکسی API
- فایل ردیابی حاوی درخواستهایی با خطای
502 Bad Gateway - Unexpected EOF - گزارشهای دسترسی NGINX
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log - گزارشهای پردازنده پیام
/opt/apigee/var/log/edge-message-processor/logs/system.log - دوره زمانی با اطلاعات منطقه زمانی که خطاهای
502رخ داده است -
Tcpdumpsهنگام بروز خطا روی پردازندههای پیام یا سرور backend یا هر دو جمعآوری شدهاند