شما در حال مشاهده اسناد 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 target
X-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 target
X-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.class
messaging.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
جمع آوری شده در پردازشگرهای پیام یا سرور باطن یا هر دو هنگام وقوع خطا