504 مهلة البوابة - انتهت مهلة جهاز التوجيه

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP لـ 504 مع الرسالة Gateway Timeout ردًا على طلبات البيانات من واجهة برمجة التطبيقات.

يشير استجابة الخطأ هذا إلى أنّ العميل لم يتلقَّ ردًا في الوقت المناسب من Apigee Edge أو خادم الخلفية أثناء تنفيذ طلب البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

يتلقى تطبيق العميل رمز الاستجابة التالي:

HTTP/1.1 504 Gateway Time-out

عند طلب هذا الخادم الوكيل باستخدام cURL أو متصفّح ويب، قد يظهر لك الخطأ التالي:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

ما أسباب انتهاء المهلة؟

المسار النموذجي لطلب واجهة برمجة التطبيقات عبر نظام Edge الأساسي هو العميل > جهاز التوجيه > معالج الرسائل > خادم الخلفية كما هو موضح في الشكل التالي:

يتم إعداد جميع المكوّنات في مسار تشغيل Apigee Edge، بما في ذلك البرامج وأجهزة التوجيه ومعالجات الرسائل وخوادم الخلفية، باستخدام قيم مهلة تلقائية مناسبة لضمان عدم استغراق طلبات البيانات من واجهة برمجة التطبيقات وقتًا طويلاً جدًا. إذا لم تحصل أي مكونات في التدفق على استجابة من المكوِّن الرئيسي خلال الفترة الزمنية المحددة في إعداد المهلة، ستنتهي المهلة المحددة للمكوِّن المحدد وسيظهر عادةً خطأ 504 Gateway Timeout.

يوضّح هذا الدليل الإرشادي كيفية تحديد وحلّ مشكلة خطأ 504 التي تحدث عند انتهاء مهلة جهاز التوجيه.

انتهت مهلة جهاز التوجيه.

المهلة التلقائية التي تم ضبطها على أجهزة التوجيه في Apigee Edge هي 57 ثانية. هذا هو الحد الأقصى لمقدار تنفيذ الخادم الوكيل لواجهة برمجة التطبيقات من وقت استلام طلب واجهة برمجة التطبيقات على Edge حتى يتم الرد على الاستجابة، بما في ذلك استجابة الخلفية وجميع السياسات التي يتم تنفيذها. يمكن إلغاء المهلة التلقائية على أجهزة التوجيه/الأجهزة المضيفة الافتراضية كما هو موضّح في ضبط مهلة وحدات الإدخال والإخراج على أجهزة التوجيه.

الأسباب المحتملة

في شبكة Edge، تشمل الأسباب النموذجية لخطأ 504 Gateway Timeout الذي يحدث بسبب انتهاء مهلة جهاز التوجيه ما يلي:

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
ضبط المهلة على جهاز التوجيه غير صحيح ويحدث ذلك في حال ضبط جهاز التوجيه على فترة مهلة إدخال/إخراج غير صحيحة. مستخدمو Edge العام والخاص على السحابة الإلكترونية

خطوات التشخيص الشائعة

استخدِم إحدى الأدوات/الأساليب التالية لتشخيص هذا الخطأ:

  • مراقبة واجهة برمجة التطبيقات
  • سجلات وصول NGINX

مراقبة واجهة برمجة التطبيقات

لتشخيص الخطأ باستخدام مراقبة واجهة برمجة التطبيقات:

  1. انتقل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  2. فلتِر البيانات بحثًا عن 5xx خطأ واختَر الإطار الزمني.
  3. ارسم رمز الحالة مقابل الوقت.
  4. انقر على الخلية المحدّدة التي تعرض أخطاء 504 للاطّلاع على مزيد من التفاصيل وعرض السجلات المتعلقة بهذه الأخطاء كما هو موضّح أدناه:

    مثال يعرض أخطاء 504

  5. في الجزء الأيسر، انقر على عرض السجلات.

    من نافذة سجلّات حركة المرور، اطّلِع على التفاصيل التالية لبعض أخطاء 504:

    • الطلب: يوفّر هذا الحقل طريقة الطلب ومعرّف الموارد المنتظم (URI) المستخدَم لإجراء المكالمات.
    • مدة الاستجابة: تقدِّم إجمالي الوقت المنقضي في الطلب.

    في المثال أعلاه،

    • يشير الطلب إلى GET /test-timeout.
    • مدة الاستجابة 57.001 ثانية. يشير هذا إلى انتهاء مهلة جهاز التوجيه قبل أن يتمكن معالج الرسائل من الاستجابة لأن القيمة قريبة جدًا من مهلة الإدخال/الإخراج التلقائية التي تم ضبطها على جهاز التوجيه، وهي 57 ثانية.

    ويمكنك أيضًا الحصول على جميع السجلات باستخدام واجهة برمجة التطبيقات الخاصة بمراقبة واجهة برمجة التطبيقات GET log (سجلات GET). على سبيل المثال، من خلال تنفيذ طلبات بحث في سجلّات org وenv وtimeRange وstatus، ستتمكّن من تنزيل جميع السجلّات الخاصة بالمعاملات التي انتهت مهلة العميل فيها.

    بما أنّ ميزة "مراقبة واجهة برمجة التطبيقات" تضبط الخادم الوكيل على - (غير محدّد) لأخطاء 504 هذه، يمكنك استخدام واجهة برمجة التطبيقات (واجهة برمجة التطبيقات للسجلات) للحصول على الخادم الوكيل المرتبط للمضيف والمسار الافتراضيَين.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. راجِع مدة الاستجابة لأخطاء 504 الإضافية وتحقَّق ممّا إذا كان وقت الاستجابة ثابتًا (تم ضبط قيمة مهلة الإدخال والإخراج على جهاز التوجيه والتي تبلغ 57 ثانية) في جميع أخطاء 504.

سجلات وصول NGINX

لتشخيص الخطأ باستخدام سجلات الوصول إلى NGINX:

  1. تحقَّق من سجلات وصول NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. ابحث عن أي أخطاء 504 خلال مدة معيّنة (إذا كانت المشكلة قد حدثت في الماضي) أو إذا كانت هناك أي طلبات لا تزال يتعذّر معالجتها من خلال 504.
  3. اطّلِع على المعلومات التالية حول بعض أخطاء 504:
    • مدة الاستجابة
    • عنوان URI للطلب

    في هذا المثال، نرى المعلومات التالية:

    • وقت الطلب: 57.001 ثانية ويشير ذلك إلى انتهاء مهلة جهاز التوجيه بعد 57.001 ثانية.

    • الطلب: GET /test-timeout
    • الاسم المستعار للمضيف: myorg-test.apigee.net
  4. تحقَّق لمعرفة ما إذا كان وقت الطلب هو نفسه مهلة وحدات الإدخال والإخراج التي تم ضبطها على جهاز التوجيه/المضيف الافتراضي. إذا كانت الإجابة "نعم"، هذا يعني انتهاء مهلة جهاز التوجيه قبل عدم استجابة معالج الرسائل خلال هذه الفترة.

    في المثال على إدخال سجل وصول NGINX المبيّن أعلاه، يكون وقت الطلب البالغ 57.001 ثانية قريبًا جدًا من مهلة وحدات الإدخال والإخراج التلقائية التي تم ضبطها على جهاز التوجيه. ويشير ذلك بوضوح إلى انتهاء مهلة جهاز التوجيه قبل أن يتمكن معالج الرسائل من الاستجابة.

  5. حدِّد الخادم الوكيل لواجهة برمجة التطبيقات الذي تم تقديم الطلب من أجله باستخدام المسار الأساسي في حقل الطلب .

السبب: إعدادات غير صحيحة للمهلة على جهاز التوجيه

التشخيص

  1. حدِّد ما إذا كانت أخطاء 504 ناتجة عن انتهاء مهلة جهاز التوجيه قبل أن يتمكن معالج الرسائل من الاستجابة. يمكنك إجراء ذلك من خلال التحقّق ممّا إذا كان وقت الاستجابة في رصد واجهة برمجة التطبيقات/وقت الطلب في جهاز التوجيه (يمثّل كلا الحقلين المعلومات نفسها، ولكن يطلق عليهما أسماء مختلفة) وهو الوقت نفسه لمهلة إدخال/إخراج التي تم ضبطها على جهاز التوجيه/المضيف الافتراضي والحقول مصدر الخطأ والخادم الوكيل للخطأ والخادم الوكيل للخطأ ورمز الخطأ الشائع تم ضبطهما على - باستخدام خطوات تشخيص واجهة برمجة التطبيقات أو بيانات تشخيص NG.
  2. تحقَّق لمعرفة ما إذا كانت قيمة مهلة وحدات الإدخال والإخراج التي تم ضبطها على جهاز التوجيه أو مضيف افتراضي محدَّد أقل مقارنةً بالقيمة التي تم ضبطها في "معالج الرسائل" أو الخادم الوكيل المحدَّد لواجهة برمجة التطبيقات.

    ويمكنك إجراء ذلك من خلال اتّباع الخطوات الواردة في هذا القسم.

التحقق من مهلة وحدات الإدخال والإخراج على الأجهزة المضيفة الافتراضية

واجهة مستخدم Edge

للتحقق من مهلة المضيف الظاهري باستخدام واجهة مستخدم Edge، قم بما يلي:

  1. سجِّل الدخول إلى واجهة مستخدم Edge.
  2. انتقِل إلى المشرف > المضيفون الافتراضيون.
  3. اختَر بيئة معيّنة تواجه فيها مشكلة انتهاء المهلة.
  4. اختر المضيف الظاهري المحدد الذي تريد التحقق من قيمة مهلة الإدخال/الإخراج له.
  5. ضمن الخصائص، اعرض قيمة مهلة قراءة الخادم الوكيل بالثواني.

    في المثال أعلاه، تم ضبط مهلة قراءة الخادم الوكيل على القيمة 120. وهذا يعني أنّ مهلة وحدات الإدخال والإخراج التي تم ضبطها على هذا المضيف الافتراضي هي 120 ثانية.

واجهات برمجة التطبيقات للإدارة

يمكنك أيضًا التحقق من مهلة قراءة الخادم الوكيل باستخدام واجهات برمجة التطبيقات للإدارة التالية:

  1. نفِّذ واجهة برمجة تطبيقات الحصول على مضيف افتراضي للحصول على إعدادات virtualhost كما هو موضّح أدناه:

    مستخدم Google Cloud العام

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    مستخدم Cloud خاص

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    المكان:

    ORGANIZATION_NAME هو اسم المؤسسة

    ENVIRONMENT_NAME هو اسم البيئة.

    VIRTUALHOST_NAME هو اسم المضيف الافتراضي

  2. التحقّق من القيمة التي تم ضبطها للموقع proxy_read_timeout

    نموذج تعريف المضيف الافتراضي

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }
    

    في المثال أعلاه، تم ضبط proxy_read_timeout بقيمة 120. وهذا يعني أنّ مهلة وحدات الإدخال والإخراج التي تم ضبطها على هذا المضيف الافتراضي تبلغ 120 ثانية.

التحقق من مهلة إدخال/إخراج (I/O) في ملفrouter.properties

  1. سجِّل الدخول إلى جهاز توجيه.
  2. ابحث عن السمة proxy_read_timeout في دليل /opt/nginx/conf.d وتحقّق من ضبطها باستخدام القيمة الجديدة على النحو التالي:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. تحقَّق من القيمة التي تم ضبطها للسمة proxy_read_timeout في ملف إعداد المضيف الافتراضي المحدّد.

    نموذج نتيجة من الأمر grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
    

    في مثال الإخراج أعلاه، لاحظ أنّه تم ضبط السمة proxy_read_timeout باستخدام القيمة الجديدة 57 في 0-default.conf، وهي ملف الإعداد للمضيف الافتراضي التلقائي. ويشير هذا إلى ضبط مهلة وحدات الإدخال والإخراج على 57 ثانية على جهاز التوجيه للمضيف الافتراضي التلقائي. إذا كان لديك عدة مضيفين افتراضيين، ستظهر لك هذه المعلومات لكل مضيف. يمكنك الحصول على قيمة proxy_read_timeout للمضيف الافتراضي المحدّد الذي استخدمته لإجراء طلبات البيانات من واجهة برمجة التطبيقات التي تعذّر تنفيذها مع حدوث أخطاء 504.

التحقق من مهلة وحدات الإدخال والإخراج في الخادم الوكيل لواجهة برمجة التطبيقات

يمكنك الاطّلاع على مهلة وحدات الإدخال والإخراج في ما يلي:

  • نقطة النهاية المستهدفة للخادم الوكيل لواجهة برمجة التطبيقات
  • سياسة ServiceCallout للخادم الوكيل لواجهة برمجة التطبيقات
عرض مهلة وحدات الإدخال والإخراج في نقطة النهاية المستهدفة للخادم الوكيل لواجهة برمجة التطبيقات
  1. في واجهة مستخدم Edge، اختَر الخادم الوكيل لواجهة برمجة التطبيقات الذي تريد عرض قيمة مهلة وحدات الإدخال والإخراج فيه.
  2. اختَر نقطة النهاية المستهدَفة المحددة التي تريد التحقّق منها.
  3. اطّلِع على السمة io.timeout.millis باستخدام قيمة مناسبة ضمن العنصر <HTTPTargetConnection> في إعدادات TargetEndpoint.

    على سبيل المثال، تم ضبط مهلة وحدات الإدخال والإخراج في الرمز التالي على 120 ثانية:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
عرض مهلة إدخال/إخراج في سياسة ServiceCallout للخادم الوكيل لواجهة برمجة التطبيقات
  1. في واجهة مستخدم Edge، اختَر الخادم الوكيل لواجهة برمجة التطبيقات المحدد الذي تريد من خلاله عرض قيمة مهلة وحدات الإدخال والإخراج الجديدة لسياسة ServiceCallout.
  2. اختَر سياسة ServiceCallout التي تريد التحقّق منها.
  3. اطّلِع على العنصر <Timeout> ذا القيمة المناسبة ضمن إعدادات <ServiceCallout>.

    على سبيل المثال، ستكون مهلة وحدات الإدخال والإخراج للرمز التالي 120 ثانية:

    <Timeout>120000</Timeout>
    

التحقق من مهلة وحدات الإدخال والإخراج في معالجات الرسائل

  1. سجِّل الدخول إلى جهاز "معالج الرسائل".
  2. ابحث عن السمة HTTPTransport.io.timeout.millis في دليل /opt/apigee/edge-message-processor/conf باستخدام الأمر التالي:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    نموذج المخرجات

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
    
  3. في مثال الإخراج أعلاه، لاحظ أنّه تم ضبط السمة HTTPTransport.io.timeout.millis على القيمة 55000 في http.properties. ويشير هذا إلى أنّه تم ضبط مهلة وحدات الإدخال والإخراج بنجاح على 55 ثانية في معالج الرسائل.

بعد تحديد المهلة التي تم ضبطها على جهاز التوجيه ومعالج الرسائل، تحقق مما إذا كان قد تم ضبط جهاز التوجيه/المضيف الافتراضي بقيمة مهلة أقل مقارنةً بالقيمة في الخادم الوكيل لواجهة برمجة التطبيقات أو معالج الرسائل.

دوّن القيم التي تم تعيينها في جميع الطبقات كما هو موضح في الجدول التالي:

المهلة الزمنية على جهاز التوجيه (بالثواني) مهلة على المضيف الظاهري (بالثواني) المهلة المحددة في معالج الرسائل (بالثواني) مهلة على الخادم الوكيل لواجهة برمجة التطبيقات (بالثواني)
57 - 55 120

في هذا المثال:

  • يتم ضبط القيمة التلقائية التي تبلغ 57 ثانية على جهاز التوجيه.
  • لم يتم ضبط قيمة المهلة على المضيف الظاهري المحدد. وهذا يعني أنّه سيستخدم القيمة التلقائية التي تبلغ 57 ثانية تم ضبطها على جهاز التوجيه نفسه.
  • في معالج الرسائل، يتم ضبط قيمة تلقائية تبلغ 55 ثانية.
  • ومع ذلك، يتم ضبط قيمة 120 ثانية في الخادم الوكيل لواجهة برمجة التطبيقات المحدّد.

تجدر الإشارة إلى أنّه يتم ضبط قيمة المهلة الأعلى على الخادم الوكيل لواجهة برمجة التطبيقات فقط، ولكن لا يزال جهاز التوجيه مهيأًا لمدة 57 ثانية. وبالتالي، تنتهي مهلة جهاز التوجيه عند الثانية 57 بينما يكون معالج الرسائل/الخلفية قيد معالجة طلبك. ويؤدي ذلك إلى استجابة جهاز التوجيه لتطبيق العميل مع عرض الخطأ 504 Gateway Timeout.

درجة الدقّة

يمكنك تنفيذ الخطوات التالية لضبط المهلة الصحيحة لإدخال/إخراج على جهاز التوجيه ومعالج الرسائل من أجل حلّ هذه المشكلة.

  1. يمكنك الاطّلاع على أفضل الممارسات لضبط مهلة وحدات الإدخال والإخراج لمعرفة قيم المهلة التي يجب ضبطها على المكوّنات المختلفة المضمَّنة في تدفق طلبات واجهة برمجة التطبيقات من خلال Apigee Edge.
  2. في المثال أعلاه، إذا تأكّدت من وجوب ضبط قيمة مهلة أعلى لأنّ الخادم الخلفي يتطلب وقتًا أطول، وزادت قيمة مهلة معالج الرسائل إلى 120 ثانية، اضبط قيمة مهلة أعلى على سبيل المثال: 123 seconds على جهاز التوجيه. لتجنُّب التأثير في جميع الخوادم الوكيلة لواجهة برمجة التطبيقات بسبب قيمة المهلة الجديدة، اضبط قيمة 123 seconds على المضيف الظاهري المحدّد فقط المستخدَم في الخادم الوكيل المحدَّد لواجهة برمجة التطبيقات.
  3. اتّبِع التعليمات الواردة في ضبط مهلة وحدات الإدخال والإخراج على أجهزة التوجيه لضبط المهلة على المضيف الافتراضي.