يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات
Apigee X. المعلومات
المشكلة
يحصل تطبيق العميل على رمز حالة HTTP لـ 502
مع الرسالة Bad Gateway
كاستجابة لطلبات واجهة برمجة التطبيقات.
يشير رمز حالة 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)/طبقة المقابس الآمنة. | مستخدمو Edge العام والخاص على السحابة الإلكترونية |
EOFException من خادم الخلفية | قد يرسل خادم الخلفية EOF بشكل مفاجئ. | مستخدمو Edge Private Cloud فقط |
مهلة البقاء على قيد الحياة التي تم ضبطها بشكل غير صحيح | الاحتفاظ بالمهلات النشطة التي تم ضبطها بشكل غير صحيح على Apigee وخادم الخلفية. | مستخدمو Edge العام والخاص على السحابة الإلكترونية |
خطوات التشخيص الشائعة
لتشخيص الخطأ، يمكنك استخدام أي من الطرق التالية:
مراقبة واجهة برمجة التطبيقات
لتشخيص الخطأ باستخدام مراقبة واجهة برمجة التطبيقات:
باستخدام مراقبة واجهة برمجة التطبيقات، يمكنك التحقيق في
أخطاء 502
، من خلال اتّباع الخطوات كما هو موضّح في
التحقيق في المشاكل. والمقصود:
- انتقِل إلى لوحة بيانات التحقيق.
- اختَر رمز الحالة في القائمة المنسدلة وتأكَّد من اختيار الفترة الزمنية المناسبة عند حدوث أخطاء
502
. - انقر على المربع في المصفوفة عندما يظهر لك عدد كبير من أخطاء
502
. - على يسار الصفحة، انقر على عرض السجلّات للاطّلاع على أخطاء
502
التي قد تظهر على النحو التالي: - مصدر الخطأ:
target
- رمز الخطأ هو
messaging.adaptors.http.UnexpectedEOFAtTarget
يمكننا الاطّلاع في ما يلي على المعلومات التالية:
يشير هذا إلى أنّ خطأ 502
حدث بسبب الهدف بسبب عملية EOF غير متوقعة.
بالإضافة إلى ذلك، يمكنك تدوين Request Message ID
للخطأ 502
لإجراء مزيد من التحقيق.
أداة التتبُّع
لتشخيص الخطأ باستخدام أداة التتبُّع:
- فعِّل
جلسة التتبُّع، ونفِّذ طلب بيانات من واجهة برمجة التطبيقات لإعادة إظهار المشكلة
502 Bad Gateway
. - اختَر أحد الطلبات التي تعذّر تنفيذها وافحص بيانات التتبّع.
- تنقّل خلال المراحل المختلفة لعملية التتبّع وحدِّد مكان حدوث العطل.
-
من المفترض أن يظهر لك الخطأ بعد إرسال الطلب إلى الخادم الهدف كما هو موضَّح أدناه:
-
حدِّد قيمة السمتَين X-Apigee.error-source وX-Apigee.REPORT-code في مرحلة AX (بيانات "إحصاءات Google" المسجّلة) في عملية التتبّع.
إذا كانت قيمتا X-Apigee.header-source وX-Apigee.fulfillment-code تتطابق مع القيم المعروضة في الجدول التالي، يمكنك التأكد من أنّ الخطأ
502
صادر من الخادم الهدف:عناوين الاستجابة القيمة مصدر X-Apigee.error-source target
رمز X-Apigee.Error-code messaging.adaptors.http.flow.UnexpectedEOFAtTarget
بالإضافة إلى ذلك، يمكنك تدوين
X-Apigee.Message-ID
للخطأ502
لإجراء مزيد من التحقيق.
سجلات وصول NGINX
لتشخيص الخطأ باستخدام NGINX:
يمكنك أيضًا الرجوع إلى سجلات وصول NGINX لتحديد سبب ظهور رمز الحالة 502
. ويكون هذا الإجراء مفيدًا على وجه الخصوص إذا كانت المشكلة قد حدثت في السابق أو إذا كانت
تحدث بشكل متقطّع ويتعذّر عليك تسجيل بيانات التتبّع في واجهة المستخدم. اتّبِع الخطوات التالية لتحديد هذه المعلومات من سجلات الوصول إلى NGINX:
- تحقَّق من سجلات وصول NGINX.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- ابحث عن أي أخطاء
502
في الخادم الوكيل المحدَّد لواجهة برمجة التطبيقات خلال مدة محدّدة (إذا حدثت المشكلة في السابق) أو عن أي طلبات لا تزال يتعذّر تنفيذها من خلال502
. - في حال حدوث أي أخطاء
502
، تحقَّق مما إذا كان السبب في الخطأ الذي أرسله الهدفUnexpected EOF
. إذا كانت قِيم X-Apigee.error-source وX- Apigee.REPORT-code تتطابق مع القيم الموضّحة في الجدول أدناه، حدث خطأ502
بسبب إغلاق الهدف للاتصال بشكل غير متوقّع:عناوين الاستجابة القيمة مصدر X-Apigee.error-source target
رمز X-Apigee.Error-code messaging.adaptors.http.flow.UnexpectedEOFAtTarget
في ما يلي إدخال نموذجي يعرض الخطأ
502
الذي حدث بسبب الخادم الهدف:
بالإضافة إلى ذلك، يمكنك تدوين أرقام تعريف الرسائل لأخطاء 502
لإجراء المزيد من التحقيق.
السبب: تم ضبط الخادم الهدف بشكلٍ غير صحيح
لم يتم إعداد الخادم الهدف بشكل صحيح لدعم اتصالات بروتوكول أمان طبقة النقل (TLS)/طبقة المقابس الآمنة.
التشخيص
- استخدِم مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو
سجلات الوصول إلى NGINX لتحديد رقم تعريف الرسالة
ورمز الخطأ ومصدر الخطأ للخطأ
502
. - تفعيل التتبّع في واجهة المستخدم لواجهة برمجة التطبيقات المتأثرة
- إذا كان تتبُّع طلب البيانات من واجهة برمجة التطبيقات الذي تعذّر تنفيذه يعرض ما يلي:
- يظهر الخطأ
502 Bad Gateway
فور بدء طلب التدفق المستهدف. - تعرض
error.class
شاشةmessaging.adaptors.http.UnexpectedEOF.
.فمن المرجّح جدًا أن تكون هذه المشكلة ناتجة عن إعدادات غير صحيحة للخادم الهدف.
- يظهر الخطأ
- احصل على تعريف الخادم الهدف باستخدام طلب بيانات من واجهة برمجة التطبيقات لإدارة Edge:
- إذا كنت مستخدمًا عامًا للسحابة الإلكترونية، يمكنك استخدام واجهة برمجة التطبيقات هذه:
curl -v https://api.enterprise.apigee.com/v1/organizations/<orgname>/environments/<envname>/targetservers/<targetservername> -u <username>
- إذا كنت مستخدِمًا خاصًا على السحابة الإلكترونية، يمكنك استخدام واجهة برمجة التطبيقات هذه:
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 >
- إذا كنت مستخدمًا عامًا للسحابة الإلكترونية، يمكنك استخدام واجهة برمجة التطبيقات هذه:
-
تعريف
TargetServer
الموضّح هو مثال على إحدى عمليات الضبط الخاطئة المعتادة، كما هو موضّح على النحو التالي:ولنفترض أنّه تم ضبط الخادم الهدف
mocktarget.apigee.net
لقبول اتصالات (HTTPS) الآمنة على المنفذ443
. ومع ذلك، إذا نظرت إلى تعريف الخادم الهدف، فلا توجد سمات/علامات أخرى تشير إلى أن المقصود منه هو الاتصالات الآمنة. ويؤدي ذلك إلى معالجة Edge لطلبات واجهة برمجة التطبيقات التي يتم إرسالها إلى الخادم الهدف المحدّد على أنّها طلبات HTTP (غير آمنة). لذا، لن يبدأ Edge عملية تأكيد اتصال طبقة المقابس الآمنة (SSL) مع هذا الخادم المستهدف.بما أنّه تم ضبط الخادم الهدف لقبول طلبات HTTPS (طبقة المقابس الآمنة) فقط على
443
، سيتم رفض الطلب من Edge أو إغلاق الاتصال. ونتيجةً لذلك، تظهر لك رسالة الخطأUnexpectedEOFAtTarget
في معالج الرسائل. سيرسل معالج الرسائل502 Bad Gateway
كرد على العميل.
درجة الدقّة
تأكّد دائمًا من ضبط الخادم الهدف بشكلٍ صحيح وفقًا لمتطلباتك.
في المثال الموضّح أعلاه، إذا أردت إرسال طلبات إلى خادم مستهدف آمن (HTTPS/طبقة المقابس الآمنة)، عليك تضمين سمات SSLInfo
مع ضبط العلامة enabled
على true
. مع أنّه يُسمح بإضافة سمات SSLInfo
لخادم هدف في تعريف نقطة النهاية المستهدفة نفسه، نقترح إضافة سمات SSLInfo
كجزء من تعريف الخادم المستهدف لتجنُّب أي التباس.
- إذا كانت الخدمة الخلفية تتطلب اتصالاً أحادي الاتجاه باستخدام طبقة المقابس الآمنة، سيحدث ما يلي:
- يجب تفعيل بروتوكول أمان طبقة النقل أو طبقة المقابس الآمنة في تعريف
TargetServer
من خلال تضمين سماتSSLInfo
حيث يتم ضبط العلامةenabled
على "صحيح" كما هو موضّح أدناه:<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>
- يجب تفعيل بروتوكول أمان طبقة النقل أو طبقة المقابس الآمنة في تعريف
- إذا كانت الخدمة الخلفية تتطلب اتصالاً ثنائيًا بطبقة المقابس الآمنة، سيتم إجراء ما يلي:
- يجب ضبط سمات
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 من خادم الخلفية
قد يرسل خادم الخلفية EOF (نهاية الملف) بشكل مفاجئ.
التشخيص
- استخدِم مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو
سجلات الوصول إلى NGINX لتحديد رقم تعريف الرسالة
ورمز الخطأ ومصدر الخطأ للخطأ
502
. - راجِع سجلّات معالج الرسائل (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) وابحث لمعرفة ما إذا كان لديكeof unexpected
لواجهة برمجة التطبيقات المحددة أو إذا كان لديكmessageid
الفريد لطلب واجهة برمجة التطبيقات، يمكنك عندئذٍ البحث عنه.نموذج تتبُّع تسلسل استدعاء الدوال البرمجية لاستثناءات الرسائل من سجلّ "معالج الرسائل"
"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)، أو قد تم الوصول إلى نهاية البث بشكل غير متوقّع.ويعني ذلك أنّ معالج الرسائل أرسل طلب البيانات من واجهة برمجة التطبيقات إلى الخادم الخلفي وكان ينتظر الاستجابة أو يقرأها. ومع ذلك، أنهى خادم الخلفية الاتصال بشكل مفاجئ قبل أن يتلقّى معالج الرسائل الاستجابة أو يتمكن من قراءة الرد كاملاً.
- تحقَّق من سجلّات الخادم الخلفية لمعرفة ما إذا كانت هناك أي أخطاء أو معلومات من الممكن أن تؤدي إلى إنهاء الاتصال على نحو مفاجئ في خادم الخلفية. إذا عثرت على أي أخطاء أو معلومات، انتقِل إلى الحل وأصلِح المشكلة بشكل مناسب في خادم الخلفية.
- إذا لم تجد أي أخطاء أو معلومات في خادم الخلفية، اجمع إخراج
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
، يرسل "معالج الرسائل" طلب البيانات من واجهة برمجة التطبيقات إلى خادم الخلفية. - في الحزمة
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)/طبقة المقابس الآمنة (TLS) الذي سبق إنشاؤه، ما يقلّل من أعباء وقت الاستجابة. ويتم التحكّم في المدة التي يجب استمرار الاتصال خلالها
من خلال الموقع مهلة البقاء على اتصال بالإنترنت (keepalive.timeout.millis
).
يستخدم كل من خادم الخلفية ومعالج رسائل Apigee المهلات النشطة للحفاظ على الاتصالات مفتوحة في ما بينها. وعند عدم تلقي أي بيانات خلال مدة مهلة الاحتفاظ بالبيانات، يمكن لخادم الخلفية أو معالج الرسائل إغلاق الاتصال بخادم الخلفية أو معالج الرسائل.
يتم تلقائيًا ضبط مهلة الاحتفاظ بالبيانات في الخوادم الوكيلة لواجهة برمجة التطبيقات المنشورة في معالج الرسائل في Apigee على
60s
ما لم يتم تجاوزها. في حال عدم تلقّي أي بيانات بشأن 60s
، ستغلق Apigee الاتصال بخادم الخلفية. سيحتفظ خادم الخلفية أيضًا بمهلة البقاء على قيد الحياة، وبعد انتهاء هذه المهلة، سيغلق خادم الخلفية الاتصال بمعالج الرسائل.
دلالات على الإعدادات غير الصحيحة لمهلة البقاء على قيد الحياة
في حال ضبط خادم Apigee أو خادم الخلفية باستخدام مهلات غير صحيحة للاحتفاظ بالمستخدمين، ينتج عن ذلك حالة سباق تؤدي إلى إرسال خادم الخلفية رمز End Of File
(FIN)
غير متوقّع استجابةً لطلب أحد الموارد.
على سبيل المثال، إذا تم ضبط مهلة الاحتفاظ بالبيانات في الخادم الوكيل لواجهة برمجة التطبيقات أو في "معالج الرسائل" بقيمة أكبر من أو تساوي مهلة الخادم الخلفية، يمكن أن يحدث
حالة السباق التالية. وهذا يعني أنّه إذا لم يتلقَّ معالج الرسائل أي بيانات حتى اقتراب وقت انتهاء مهلة الإبقاء على خادم الخلفية، يتم إرسال طلب وإرساله إلى الخادم الخلفي باستخدام الاتصال الحالي. يمكن أن يؤدي ذلك إلى
502 Bad Gateway
بسبب خطأ "ملف EOF" غير متوقَّع كما هو موضّح أدناه:
- لنفترض أن مهلة الاحتفاظ بالبيانات مُفعَّلة على كل من معالج الرسائل وخادم الخلفية تبلغ 60 ثانية ولم يصلنا أي طلب جديد إلا بعد مرور 59 ثانية من عرض الطلب السابق بواسطة معالج الرسائل المحدد.
- يتولّى معالج الرسائل معالجة الطلب الذي وصل في الثانية والخمسين من خلال استخدام الاتصال الحالي (لأنّه لم تنتهِ مهلة الاحتفاظ بالبيانات حتى الآن) ويرسل الطلب إلى الخادم الخلفي.
- ومع ذلك، قبل وصول الطلب إلى خادم الخلفية، تم تجاوز مهلة الإبقاء على الحالة السابقة على خادم الخلفية.
- طلب "معالج الرسائل" لمورد معيّن يتم تنفيذه، لكنّ خادم الخلفية يحاول إغلاق الاتصال عن طريق إرسال حزمة
FIN
إلى معالج الرسائل. - وأثناء انتظار "معالج الرسائل" لتلقّي البيانات، فإنّه يتلقّى بدلاً من ذلك رمز الاستجابة
FIN
غير المتوقّع، ويتم إنهاء الاتصال. - وينتج عن ذلك
Unexpected EOF
، وبعد ذلك يتم عرض502
إلى العميل من خلال معالج الرسائل.
في هذه الحالة، لاحظنا حدوث الخطأ 502
بسبب ضبط القيمة نفسها لمهلة البقاء على قيد الحياة، وهي 60 ثانية، على كل من معالج الرسائل وخادم الخلفية. وبالمثل، يمكن أن تحدث هذه المشكلة أيضًا إذا تم ضبط قيمة أعلى للحفاظ على مهلة البقاء على قيد الحياة في "معالج الرسائل" مقارنةً بالقيمة في الخادم الخلفية.
التشخيص
- إذا كنت مستخدمًا عامًا في السحابة الإلكترونية:
- استخدِم أداة التتبُّع أو التتبُّع في واجهة برمجة التطبيقات (كما هو موضّح في
خطوات التشخيص الشائعة) وتأكّد من أنّ لديك كلا الإعدادَين
التاليَين:
- رمز الخطأ:
messaging.adaptors.http.flow.UnexpectedEOFAtTarget
- مصدر الخطأ:
target
- رمز الخطأ:
- يُرجى الانتقال إلى استخدام tcpdump لمزيد من التحقيق.
- استخدِم أداة التتبُّع أو التتبُّع في واجهة برمجة التطبيقات (كما هو موضّح في
خطوات التشخيص الشائعة) وتأكّد من أنّ لديك كلا الإعدادَين
التاليَين:
- إذا كنت مستخدمًا خاصًا في السحابة الإلكترونية:
- استخدِم أداة التتبُّع أو
سجلات الوصول إلى 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
في رسالة الخطأ أعلاه إلى أنّ معالج الرسائل قد أعاد استخدام هذا الاتصال سبع مرات تقريبًا، وتشير السمةbytesWritten=159
إلى أنّ معالج الرسائل قد أرسل حمولة الطلب البالغة159
بايت إلى خادم الخلفية. ومع ذلك، لم يتلقَّ الجهاز أي بايت عند حدوث خطأEOF
غير متوقّع. -
يوضّح هذا أنّ "معالج الرسائل" قد أعاد استخدام الاتصال نفسه عدة مرات، وفي هذه المناسبة أرسل بيانات، ولكنه تلقّى بعد ذلك بفترة قصيرة
EOF
قبل تلقّي أي بيانات. وهذا يعني أنّ هناك احتمالاً كبيرًا أن تكون مهلة الإبقاء على خادم الخلفية أقصر أو مساوية للمهلة المحدّدة في الخادم الوكيل لواجهة برمجة التطبيقات.يمكنك إجراء المزيد من التحقيق بمساعدة
tcpdump
كما هو موضّح أدناه.
- استخدِم أداة التتبُّع أو
سجلات الوصول إلى 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
) الذي يبدأ في إغلاق الاتصال.
تمت إعادة استخدام الاتصال نفسه مرتين بنجاح في هذا المثال، ولكن في الطلب الثالث، يبدأ الخادم الخلفي في إغلاق الاتصال، بينما ينتظر "معالج الرسائل" البيانات من الخادم الخلفي. يشير هذا إلى أنّ مهلة الاحتفاظ بالبيانات في الخادم الخلفية قد تكون أقصر أو مساوية للقيمة التي تم ضبطها في الخادم الوكيل لواجهة برمجة التطبيقات. للتحقّق من ذلك، يُرجى الاطّلاع على مقارنة مهلة البقاء على قيد الحياة على Apigee وخادم الخلفية.
- في الحزمة
مقارنة مهلة البقاء على قيد الحياة على Apigee وخادم الخلفية
- بشكل تلقائي، تستخدم Apigee قيمة 60 ثانية لخاصية مهلة الحفاظ على قيد الحياة.
-
ومع ذلك، من المحتمل أنّك قد تجاوزت القيمة التلقائية في الخادم الوكيل لواجهة برمجة التطبيقات. يمكنك التحقّق من ذلك من خلال التحقّق من تعريف
TargetEndpoint
المحدّد في الخادم الوكيل لواجهة برمجة التطبيقات الذي يتعذّر عرضه والذي يعرض أخطاء502
.نموذج ضبط نقطة النهاية:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="keepalive.timeout.millis">30000</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>
في المثال أعلاه، تم إلغاء خاصية مهلة "إبقاء المستخدم على قيد الحياة" بقيمة 30 ثانية (
30000
ملي ثانية). - بعد ذلك، تحقق من خاصية مهلة البقاء على قيد الحياة التي تم ضبطها على خادم الخلفية. ولنفترض أنّه تم ضبط خادم الخلفية بقيمة
25 seconds
. - إذا وجدت أنّ قيمة خاصية مهلة "إبقاء الحالة على قيد الحياة" في Apigee أعلى
من قيمة خاصية مهلة "إبقاء الحالة" على خادم الخلفية، كما في المثال الوارد أعلاه،
يكون هذا هو سبب أخطاء
502
.
درجة الدقّة
عليك التأكّد من أنّ سمة مهلة "إبقاء الحالة" تكون أقل دائمًا على Apigee (في الخادم الوكيل لواجهة برمجة التطبيقات ومكوِّن معالج الرسائل) مقارنةً بها على الخادم الخلفي.
- تحديد القيمة المضبوطة لمهلة البقاء على قيد الحياة على خادم الخلفية.
- اضبط قيمة مناسبة لخاصية مهلة الاحتفاظ بالبيانات في الخادم الوكيل لواجهة برمجة التطبيقات أو معالج الرسائل، بحيث تكون خاصية مهلة الإبقاء على حالة نشطة أقل من القيمة التي تم ضبطها على الخادم الخلفي، وذلك باتّباع الخطوات الموضحة في ضبط مهلة الإبقاء على حالة نشطة في معالِجات الرسائل.
في حال استمرار المشكلة، انتقِل إلى ضرورة جمع معلومات التشخيص.
أفضل الممارسات
ننصح بشدة بأن تكون دائمًا مكونات المراحل المتقدمة في عملية التسويق أقلّ من الحدّ الأدنى لمهلة الاحتفاظ بالبيانات
مقارنةً بالخوادم التي تم ضبطها على الخوادم الرئيسية لتجنّب حدوث هذه الأنواع من شروط السباقات وأخطاء 502
. يجب أن تكون كل قفزة عند البث أقل من كل قفزة عند البث المباشر. في Apigee
Edge، من الممارسات الجيدة استخدام الإرشادات التالية:
- يجب أن تكون مهلة البقاء على قيد الحياة للعميل أقل من مهلة الحفاظ على الحياة في جهاز Edge Router.
- يجب أن تكون مهلة الإبقاء على اتصال جهاز Edge على قيد الحياة أقل من مهلة البقاء على قيد الحياة في معالج الرسائل.
- يجب أن تكون مهلة الإبقاء على قيد الحياة لمعالج الرسائل أقل من مهلة الإبقاء على اتصال الخادم الهدف.
- إذا كان لديك أي قفزات أخرى أمام Apigee أو خلفها، يجب تطبيق نفس القاعدة. يجب أن تترك على عاتق العميل دائمًا مسؤولية إغلاق الاتصال مع مصدر البيانات.
ضرورة جمع معلومات التشخيص
في حال استمرار المشكلة حتى بعد اتّباع التعليمات الواردة أعلاه، يمكنك جمع معلومات التشخيص التالية، ثم التواصل مع فريق دعم Apigee Edge.
إذا كنت من مستخدمي Cloud Cloud، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم الخادم الوكيل لواجهة برمجة التطبيقات
- أكمِل الأمر
curl
لإعادة إظهار الخطأ502
. - تتبُّع ملف التتبُّع الذي يحتوي على الطلبات التي تتضمّن خطأ واحد (
502 Bad Gateway - Unexpected EOF
) - إذا لم تكن أخطاء
502
تحدث حاليًا، يمكنك توفير معلومات عن المنطقة الزمنية خلال الفترة الزمنية التي حدثت فيها أخطاء502
في الماضي.
إذا كنت مستخدم Cloud خاصًا، يُرجى تقديم المعلومات التالية:
- رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
- اسم المؤسسة واسم البيئة واسم الخادم الوكيل لواجهة برمجة التطبيقات التي تراقب أخطاء
502
الخاصة بها - حزمة الخادم الوكيل لواجهة برمجة التطبيقات
- تتبُّع ملف التتبُّع الذي يحتوي على الطلبات التي تتضمّن خطأ واحد (
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
في معالجات الرسائل أو خادم الخلفية، أو كليهما عند حدوث الخطأ