شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
علامت
برنامه مشتری کد وضعیت HTTP 502 را با پیام Bad Gateway به عنوان پاسخی برای تماس های API دریافت می کند.
کد وضعیت HTTP 502 به این معنی است که مشتری پاسخ معتبری از سرورهای باطن دریافت نمی کند که در واقع باید درخواست را برآورده کند.
پیام های خطا
برنامه مشتری کد پاسخ زیر را دریافت می کند:
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 Public و Private Cloud |
| EOFE استثنا از سرور Backend | سرور باطن ممکن است EOF را به طور ناگهانی ارسال کند. | فقط کاربران Edge Private Cloud |
| پیکربندی نادرست در مهلت زمانی باقی ماندن زنده است | زنده نگه دارید تایم اوت ها به اشتباه در سرور Apigee و باطن پیکربندی شده باشند. | کاربران Edge Public و Private Cloud |
مراحل تشخیص رایج
برای تشخیص خطا می توانید از یکی از روش های زیر استفاده کنید:
مانیتورینگ API
برای تشخیص خطا با استفاده از API Monitoring:
با استفاده از API Monitoring میتوانید با دنبال کردن مراحلی که در بررسی مسائل توضیح داده شده است، خطاهای 502 را بررسی کنید. یعنی:
- به داشبورد بررسی بروید.
- کد وضعیت را در منوی کشویی انتخاب کنید و اطمینان حاصل کنید که دوره زمانی مناسب هنگام رخ دادن خطاهای
502انتخاب شده است. - هنگامی که تعداد خطاهای
502را مشاهده می کنید، روی کادر موجود در ماتریس کلیک کنید. - در سمت راست، روی View Logs برای خطاهای
502کلیک کنید که چیزی شبیه به زیر است: - منبع خطا
targetاست - کد خطا
messaging.adaptors.http.UnexpectedEOFAtTargetاست

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


مقدار X-Apigee.fault-source و X-Apigee.fault-code را در فاز AX (Analytics Data Recorded) در ردیابی تعیین کنید.
اگر مقادیر X-Apigee.fault-source و X-Apigee.fault-code با مقادیر نشان داده شده در جدول زیر مطابقت داشته باشند، می توانید تأیید کنید که خطای
502از سرور هدف می آید:سرصفحه های پاسخ ارزش X-Apigee.fault-source targetX-Apigee.fault-code 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.fault-source targetX-Apigee.fault-code messaging.adaptors.http.flow.UnexpectedEOFAtTargetدر اینجا یک ورودی نمونه وجود دارد که خطای
502ناشی از سرور مورد نظر را نشان می دهد:
علاوه بر این، شناسه پیام خطاهای 502 را برای بررسی بیشتر یادداشت کنید.
علت: پیکربندی نادرست سرور هدف
سرور هدف برای پشتیبانی از اتصالات TLS/SSL به درستی پیکربندی نشده است.
تشخیص
- برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
502از API Monitoring ، Trace tool یا گزارش های دسترسی NGINX استفاده کنید. - ردیابی را در UI برای API آسیب دیده فعال کنید.
- اگر ردیابی درخواست API ناموفق موارد زیر را نشان دهد:
- خطای
502 Bad Gatewayبه محض شروع درخواست جریان هدف مشاهده می شود. -
error.classmessaging.adaptors.http.UnexpectedEOF.سپس به احتمال زیاد این مشکل به دلیل پیکربندی نادرست سرور هدف ایجاد شده است.
- خطای
- با استفاده از فراخوانی API مدیریت Edge، تعریف سرور مورد نظر را دریافت کنید:
- اگر کاربر Public Cloud هستید، از این 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 >
- اگر کاربر Public Cloud هستید، از این 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 تنظیم شده روی true وارد کنید. در حالی که مجاز است ویژگیهای SSLInfo برای یک سرور هدف در خود تعریف نقطه پایانی هدف اضافه کند، توصیه میشود برای جلوگیری از هرگونه سردرگمی، ویژگیهای SSLInfo را به عنوان بخشی از تعریف سرور هدف اضافه کنید.
- اگر سرویس باطن به ارتباط 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 را در تعریف
- اگر سرویس پشتیبان به ارتباط دو طرفه 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 >
- شما باید ویژگیهای
مراجع
علت: EOFE استثنا از سرور باطن
سرور Backend ممکن است EOF (پایان فایل) را به طور ناگهانی ارسال کند.
تشخیص
- برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
502از API Monitoring ، Trace tool یا گزارش های دسترسی NGINX استفاده کنید. - گزارشهای پردازشگر پیام (
/opt/apigee/var/log/edge-message-processor/logs/system.log) را بررسی کنید و جستجو کنید تا ببینید آیا شماeof unexpectedبرای API خاص دارید یا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در حالی رخ داده است که پردازشگر پیام در تلاش برای خواندن پاسخی از سرور باطن است. این استثنا نشان می دهد که پایان فایل (EOF)، یا پایان جریان به طور غیرمنتظره ای رسیده است.یعنی پردازشگر پیام درخواست API را به سرور باطن ارسال کرد و منتظر بود یا پاسخ را می خواند. با این حال، سرور باطن قبل از اینکه پردازشگر پیام پاسخ را دریافت کند یا بتواند پاسخ کامل را بخواند، اتصال را به طور ناگهانی قطع کرد.
- گزارشهای سرور بکاند خود را بررسی کنید و ببینید آیا خطا یا اطلاعاتی وجود دارد که میتواند منجر به قطع ناگهانی اتصال سرور باطن شود. اگر خطا/اطلاعاتی پیدا کردید، به Resolution بروید و مشکل را به طور مناسب در سرور باطن خود برطرف کنید.
- اگر هیچ خطا یا اطلاعاتی در سرور باطن خود پیدا نکردید، خروجی
tcpdumpرا در پردازشگرهای پیام جمع آوری کنید:- اگر میزبان سرور باطن شما یک آدرس IP واحد دارد، از دستور زیر استفاده کنید:
tcpdump -i any -s 0 host IP_ADDRESS -w FILE_NAME
- اگر میزبان سرور باطن شما چندین آدرس IP دارد، از دستور زیر استفاده کنید:
tcpdump -i any -s 0 host HOSTNAME -w FILE_NAME
به طور معمول، این خطا به این دلیل ایجاد می شود که به محض اینکه پردازشگر پیام درخواست را به سرور باطن ارسال می کند، با
[FIN,ACK]پاسخ می دهد.
- اگر میزبان سرور باطن شما یک آدرس IP واحد دارد، از دستور زیر استفاده کنید:
مثال
tcpdumpزیر را در نظر بگیرید.نمونه
tcpdumpزمانی که502 Bad Gateway Error(UnexpectedEOFAtTarget) رخ داد گرفته شد
- از خروجی TCPDump ، دنباله ای از رویدادها را متوجه می شوید:
- در بسته
985، پردازشگر پیام درخواست API را به سرور باطن ارسال می کند. - در بسته
986، سرور پشتیبان بلافاصله با[FIN,ACK]پاسخ می دهد. - در بسته
987، پردازشگر پیام با[FIN,ACK]به سرور پشتیبان پاسخ می دهد. - در نهایت اتصالات با
[ACK]و[RST]از هر دو طرف بسته می شوند. - از آنجایی که سرور باطن
[FIN,ACK]را می فرستد، شما استثناjava.io.EOFException: eof unexpectedدر پردازشگر پیام دریافت می کنید.
- در بسته
- اگر مشکلی در شبکه در سرور پشتیبان وجود داشته باشد، ممکن است این اتفاق بیفتد. تیم عملیات شبکه خود را برای بررسی بیشتر این موضوع درگیر کنید.
قطعنامه
مشکل را در سرور باطن به طور مناسب برطرف کنید.
اگر مشکل همچنان ادامه دارد و برای عیبیابی 502 Bad Gateway Error به کمک نیاز دارید یا مشکوک هستید که مشکلی در Edge است، با پشتیبانی Apigee Edge تماس بگیرید.
علت: پیکربندی نادرست، مهلت زمانی ماندن زنده است
قبل از اینکه تشخیص دهید آیا این دلیل خطاهای 502 است، لطفاً مفاهیم زیر را بخوانید.
اتصالات مداوم در Apigee
Apigee بهطور پیشفرض (و به دنبال استاندارد HTTP/1.1) هنگام برقراری ارتباط با سرور باطن هدف، از اتصالات دائمی استفاده میکند. اتصالات دائمی می توانند با اجازه دادن به استفاده مجدد از اتصال TCP از قبل ایجاد شده و (در صورت وجود) TLS/SSL، کارایی را افزایش دهند، که سربار تأخیر را کاهش می دهد. مدت زمانی که یک اتصال باید ادامه داشته باشد از طریق ویژگی keep alive timeout کنترل می شود ( keepalive.timeout.millis ).
هر دو سرور Backend و Apigee Message Processor از وقفه های زمانی استفاده می کنند تا اتصالات را با یکدیگر باز نگه دارند. هنگامی که هیچ داده ای در مدت زمان باز ماندن زنده دریافت نشد، سرور پشتیبان یا پردازشگر پیام می تواند ارتباط را با دیگری ببندد.
پروکسیهای API مستقر در یک پردازشگر پیام در Apigee، بهطور پیشفرض، دارای بازه زمانی ماندن زنده روی 60s هستند، مگر اینکه لغو شوند. هنگامی که هیچ داده ای برای 60s دریافت نشد، Apigee اتصال با سرور باطن را می بندد. سرور بکاند نیز یک بازه زمانی نگهداشتن زنده را حفظ میکند، و پس از انقضای آن، سرور باطن ارتباط را با پردازشگر پیام میبندد.
مفهوم پیکربندی نادرست زمان توقف زنده نگه داشتن زنده
اگر Apigee یا سرور بکاند با وقفههای نگه داشتن زنده نادرست پیکربندی شده باشند، منجر به یک شرایط مسابقه میشود که باعث میشود سرور باطن در پاسخ به درخواست منبع، یک End Of File (FIN) ارسال کند.
به عنوان مثال، اگر مهلت زمانی نگه داشتن زنده در پروکسی API یا پردازشگر پیام با مقداری بزرگتر یا مساوی با زمان پایان سرور باطن بالا پیکربندی شده باشد، شرایط مسابقه زیر می تواند رخ دهد. یعنی اگر پردازشگر پیام هیچ داده ای را تا زمانی که خیلی نزدیک به آستانه سرور باطن زنده نگه دارد دریافت نکند، آنگاه یک درخواست ارسال می شود و با استفاده از اتصال موجود به سرور باطن ارسال می شود. این می تواند به دلیل خطای EOF غیرمنتظره منجر به 502 Bad Gateway شود که در زیر توضیح داده شده است:
- فرض کنید بازه زمانی نگه داشتن زنده روی هر دو پردازشگر پیام و سرور باطن 60 ثانیه است و هیچ درخواست جدیدی تا 59 ثانیه پس از ارائه درخواست قبلی توسط پردازشگر پیام خاص ارائه نشده است.
- پردازشگر پیام ادامه میدهد و درخواستی را که در ثانیه ۵۹ وارد شده است با استفاده از اتصال موجود پردازش میکند (زیرا بازه زمانی نگه داشتن زنده هنوز سپری نشده است) و درخواست را به سرور باطن ارسال میکند.
- با این حال، قبل از رسیدن درخواست به سرور باطن، از آستانه باز ماندن زنده در سرور باطن فراتر رفته است.
- درخواست پردازشگر پیام برای یک منبع در حین پرواز است، اما سرور باطن تلاش می کند با ارسال یک بسته
FINبه پردازشگر پیام، اتصال را ببندد. - در حالی که پردازشگر پیام منتظر دریافت داده است، در عوض
FINغیرمنتظره را دریافت می کند و اتصال قطع می شود. - این منجر به یک
Unexpected EOFمی شود و متعاقباً یک502توسط پردازشگر پیام به مشتری بازگردانده می شود.
در این مورد، ما مشاهده کردیم که خطای 502 رخ داده است زیرا همان مقدار بازه زمانی 60 ثانیه ای حفظ زنده روی هر دو پردازشگر پیام و سرور باطن پیکربندی شده بود. به طور مشابه، اگر مقدار بالاتری برای زمان ماندن زنده در پردازشگر پیام نسبت به سرور باطن پیکربندی شده باشد، این مشکل ممکن است رخ دهد.
تشخیص
- اگر کاربر Public Cloud هستید:
- از ابزار مانیتورینگ یا ردیابی API (همانطور که در مراحل تشخیص رایج توضیح داده شده است) استفاده کنید و بررسی کنید که هر دو تنظیمات زیر را دارید:
- کد خطا:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget - منبع خطا:
target
- کد خطا:
- برای بررسی بیشتر به استفاده از tcpdump بروید.
- از ابزار مانیتورینگ یا ردیابی API (همانطور که در مراحل تشخیص رایج توضیح داده شده است) استفاده کنید و بررسی کنید که هر دو تنظیمات زیر را دارید:
- اگر کاربر خصوصی Cloud هستید:
- از ابزار 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نشان می دهد که پردازشگر پیام یکEOFدریافت کرده در حالی که هنوز منتظر خواندن پاسخ از سرور باطن بود. - مشخصه
useCount=7در پیغام خطای بالا نشان می دهد که Message Processor حدود هفت بار از این اتصال مجدد استفاده کرده است و ویژگیbytesWritten=159نشان می دهد که Message Processor بار درخواستی159بایتی را به سرور backend ارسال کرده است. با این حال، هنگامی کهEOFغیرمنتظره رخ داد، صفر بایت را دریافت کرد. این نشان میدهد که پردازشگر پیام چندین بار از یک اتصال مشابه استفاده کرده است و در این مورد دادهها را ارسال میکند اما کمی بعد قبل از دریافت هر گونه داده، یک
EOFدریافت میکند. این به این معنی است که احتمال زیادی وجود دارد که مهلت زمانی زنده نگه داشتن سرور باطن کمتر یا برابر با تنظیم شده در پراکسی API باشد.همانطور که در زیر توضیح داده شده است می توانید با کمک
tcpdumpبیشتر بررسی کنید.
- از ابزار Trace یا گزارش های دسترسی NGINX برای تعیین شناسه پیام، کد خطا و منبع خطا برای خطای
با استفاده از tcpdump
- با دستور زیر یک
tcpdumpدر سرور باطن ضبط کنید:tcpdump -i any -s 0 host MP_IP_Address -w File_Name
-
tcpdumpگرفته شده را تجزیه و تحلیل کنید:در اینجا یک نمونه خروجی tcpdump آمده است:

در نمونه
tcpdumpبالا، می توانید موارد زیر را مشاهده کنید:- در بسته
5992,سرور باطن یک درخواستGETدریافت کرد. - در بسته
6064با200 OK. - در بسته
6084، سرور باطن درخواستGETدیگری دریافت کرد. - در بسته
6154با200 OKپاسخ می دهد. - در بسته
6228، سرور پشتیبان سومین درخواستGETرا دریافت کرد. - این بار، سرور باطن یک
FIN, ACKبه پردازشگر پیام (بسته6285) باز میگرداند و بسته شدن اتصال را آغاز میکند.
در این مثال از همان اتصال مجدداً دو بار با موفقیت استفاده شد، اما در درخواست سوم، سرور باطن شروع به بسته شدن اتصال میکند، در حالی که پردازشگر پیام منتظر دادههای سرور باطن است. این نشان می دهد که مهلت زمانی زنده نگه داشتن سرور باطن به احتمال زیاد کوتاه تر یا برابر با مقدار تنظیم شده در پراکسی API است. برای تأیید این موضوع، به Compare keep alive timeout در Apigee و سرور باطن مراجعه کنید.
- در بسته
زمان ماندن زنده را در سرور Apigee و باطن مقایسه کنید
- بهطور پیشفرض، Apigee از مقدار 60 ثانیه برای ویژگی timeout keep alive استفاده میکند.
با این حال، ممکن است شما مقدار پیش فرض را در API Proxy لغو کرده باشید. شما می توانید این را با بررسی تعریف
TargetEndpointخاص در پروکسی API ناموفق که خطاهای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 پیکربندی شده در سرور باطن خود را بررسی کنید. فرض کنید سرور باطن شما با مقدار
25 secondsپیکربندی شده است. - اگر تعیین کنید که مقدار ویژگی keep alive timeout در Apigee از مقدار ویژگی keep alive timeout در سرور باطن مانند مثال بالا بالاتر است، آنگاه این دلیل خطاهای
502است.
قطعنامه
اطمینان حاصل کنید که ویژگی keep alive timeout همیشه در Apigee (در جزء API Proxy و Message Processor) در مقایسه با سرور backend کمتر است.
- مقدار تنظیم شده برای بازه زمانی نگه داشتن زنده در سرور باطن را تعیین کنید.
- با استفاده از مراحل تشریح شده در Configuring keep alive timeout در پردازشگر پیام، مقدار مناسبی را برای ویژگی keep alive timeout در پروکسی API یا پردازشگر پیام پیکربندی کنید، به گونهای که خاصیت timeout نگهداشتن زنده کمتر از مقدار تنظیمشده در سرور backend باشد.
اگر مشکل همچنان ادامه داشت، به اطلاعات تشخیصی باید جمعآوری شود بروید.
بهترین تمرین
اکیداً توصیه میشود که مؤلفههای پاییندست همیشه آستانهای کمتر از زمانی که در سرورهای بالادست پیکربندی شدهاند، داشته باشند تا از این نوع شرایط مسابقه و خطاهای 502 جلوگیری شود. هر جهش پایین دست باید کمتر از هر پرش بالادست باشد. در Apigee Edge، استفاده از دستورالعمل های زیر تمرین خوبی است:
- مهلت زمانی نگه داشتن زنده کلاینت باید کمتر از مهلت زمانی Edge Router keep alive باشد.
- مهلت زمانی Edge Router keep alive باید کمتر از Message Processor keep alive timeout باشد.
- مهلت زمانی نگه داشتن زنده پردازشگر پیام باید کمتر از مهلت زمانی حفظ زنده بودن سرور مورد نظر باشد.
- اگر جهش دیگری در جلو یا پشت Apigee دارید، همان قانون باید اعمال شود. همیشه باید آن را به عهده مشتری پایین دستی بگذارید تا ارتباط با بالادست را ببندید.
باید اطلاعات تشخیصی را جمع آوری کرد
اگر حتی پس از پیروی از دستورالعملهای بالا، مشکل همچنان ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط زیست
- نام پروکسی API
- برای بازتولید خطای
502دستورcurlرا کامل کنید - فایل ردیابی حاوی درخواستهای دارای
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جمع آوری شده در پردازشگرهای پیام یا سرور باطن یا هر دو هنگام وقوع خطا