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

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

المشكلة

يتلقّى تطبيق العميل رمز حالة 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 Public Cloud وEdge Private Cloud

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

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

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

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

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

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

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

  5. في اللوحة اليسرى، انقر على عرض السجلات.

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

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

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

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

    يمكنك أيضًا الحصول على جميع السجلات باستخدام واجهة برمجة التطبيقات GET logs في &quot;مراقبة واجهة برمجة التطبيقات&quot;. على سبيل المثال، من خلال طلب البحث في السجلّات عن 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 ناتجة عن انتهاء مهلة &quot;الموجّه&quot; قبل أن يتمكّن &quot;معالج الرسائل&quot; من الرد. يمكنك إجراء ذلك من خلال التحقّق مما إذا كان وقت الاستجابة في "مراقبة واجهة برمجة التطبيقات" أو وقت الطلب في جهاز التوجيه (يمثّل كلا الحقلين المعلومات نفسها، ولكن يتم تسميتهما بأسماء مختلفة) هو نفسه مهلة الإدخال/الإخراج التي تم ضبطها على جهاز التوجيه/المضيف الافتراضي، وتم ضبط الحقول مصدر الخطأ وخادم وكيل الخطأ ورمز الخطأ على - باستخدام "مراقبة واجهة برمجة التطبيقات" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. تحقَّق مما إذا كانت قيمة المهلة المحدّدة للإدخال/الإخراج التي تم ضبطها على جهاز التوجيه أو المضيف الافتراضي المحدّد أقل من القيمة التي تم ضبطها على "معالج الرسائل" أو خادم وكيل واجهة برمجة التطبيقات المحدّد.

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

التحقّق من مهلة الإدخال/الإخراج على المضيفات الافتراضية

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

للتأكّد من انتهاء مهلة المضيف الافتراضي باستخدام واجهة مستخدم Edge، اتّبِع الخطوات التالية:

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

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

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

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

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

    مستخدم السحابة الإلكترونية العامة

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

    مستخدم Private 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 ثانية.

التحقّق من مهلة الإدخال/الإخراج في ملف 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.

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

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

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

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

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
عرض مهلة الإدخال/الإخراج في سياسة ServiceCallout الخاصة بخادم وكيل API
  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 ثانية في "معالج الرسائل".

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

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

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

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

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

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

الدقة

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

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