404 مضيف افتراضي متعدد باستخدام اسم المضيف المضيف نفسه

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

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP بقيمة 404 مع الرسالة Not Found ورسالة الخطأ Unable to identify proxy for host: VIRTUAL_HOST and url: PATH كردّ على طلبات البيانات من واجهة برمجة التطبيقات.

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

رسالة الخطأ

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

HTTP/1.1 404 Not Found

بالإضافة إلى ذلك، قد تظهر لك رسالة خطأ مشابهة للرسالة الموضّحة أدناه:

{
   "fault":{
      "faultstring":"Unable to identify proxy for host: default and url: \/oauth2\/token",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.ApplicationNotFound"
      }
   }
}

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

السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
مضيف افتراضي يتضمّن اسمًا مستعارًا مكرّرًا للمضيف تتضمّن مضيفات افتراضية متعددة الاسم المستعار للمضيف ورقم المنفذ نفسَيهما. مستخدِمو Edge Public Cloud وPrivate Cloud

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

ستكون سجلّات NGINX و"معالج الرسائل" مفيدة في تحديد مشاكل الخطأ 404 وحلّها. اتّبِع الخطوات التالية للاطّلاع على السجلّات:

  1. اطّلِع على سجلّات NGINX باستخدام الأمر التالي:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. ابحث عن الحقول التالية في إدخالات السجلّ:
    الحقل القيمة
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    دوِّن معرّف الرسالة من السجلّات.

  3. اطّلِع على سجلّات "معالج الرسائل" (/opt/apigee/var/log/edge-message-processor/logs/system.log) لمعرفة ما إذا كان لديك messaging.adaptors.http.flow.ApplicationNotFound لواجهة برمجة التطبيقات المحدّدة أو ما إذا كان لديك معرّف الرسالة الفريد من الخطوة 2 لطلب بيانات من واجهة برمجة التطبيقات.

    نموذج لرسالة الخطأ من سجلّ "معالج الرسائل"

  4. NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST,
    uri:/weather, message Id:null, exception:com.apigee.rest.framework.ResourceNotFoundException{
    code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for
    host: vh1 and url: /weather, associated contexts = []}, context:Context@342ea86b
    input=ClientInputChannel(SSLClientChannel[Accepted: Remote:10.123.123.123:8443
    Local:10.135.33.68:62092]@1206954 useCount=1 bytesRead=0 bytesWritten=0 age=1ms
    lastIO=0ms  isOpen=true)

    يعرض السجلّ أعلاه رمز الخطأ ورسالة الخطأ على النحو التالي:

    code = messaging.adaptors.http.flow.ApplicationNotFound,
    message = Unable to identify proxy for host: vh1 and url: /weather

السبب: مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف ورقم المنفذ نفسَيهما

يستخدم كلّ من أجهزة توجيه Apigee Edge و"معالجات الرسائل" كلاً من عنوان المضيف ورقم المنفذ ومسارات URI لتوجيه الزيارات إلى خادم وكيل واجهة برمجة التطبيقات الصحيح. إنّ استخدام تعريفات غامضة، مثل مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف ورقم المنفذ نفسَيهما، هو نمط غير مستحسن موثّق و يمكن أن يؤدي إلى سلوكيات غير متوقّعة. أحد الأخطاء الشائعة التي ستلاحظها هو الخطأ 404 مع الرسالة Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

عادةً، إذا كانت هناك مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف نفسَه، فستلاحظ أخطاء متقطّعة 404. يرجع ذلك إلى أنّه قد يتم ضبط خادم وكيل واجهة برمجة التطبيقات المحدّد لقبول الطلبات على أحد المضيفات الافتراضية فقط. عندما يتم توجيه طلبات واجهة برمجة التطبيقات إلى الـ مضيف الافتراضي المحدّد الذي تم ضبطه في خادم وكيل واجهة برمجة التطبيقات، ستتلقّى استجابة ناجحة. ومع ذلك، عندما يتم توجيه طلبات واجهة برمجة التطبيقات إلى المضيفات الافتراضية الأخرى التي لم يتم ضبط خادم وكيل واجهة برمجة التطبيقات لقبول الطلبات عليها، ستفشل واجهات برمجة التطبيقات مع ظهور أخطاء 404 هذه.

اتّبِع التعليمات الواردة في الخطأ 404: تعذّر تحديد خادم وكيل للمضيف: <اسم المضيف الافتراضي> وعنوان URL: <المسار> و حلّ هذا الخطأ. إذا لم يكن أي من الأسباب يؤدي إلى ظهور هذا الخطأ، استخدِم الخطوات التالية لتحديد ما إذا كانت المضيفات الافتراضية التي تتضمّن أسماء مستعارة مكرّرة للمضيف هي التي تسبّب أخطاء 404.

التشخيص

استخدِم إحدى الطريقتَين التاليتَين لتحديد ما إذا كانت هناك مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف/رقم المنفذ نفسَيهما ما يؤدي إلى ظهور أخطاء 404:

  • واجهة مستخدم Edge
  • واجهات برمجة التطبيقات للإدارة

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

استخدِم هذه التعليمات لتحديد ما إذا كانت هناك مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف/رقم المنفذ نفسَيهما باستخدام واجهة مستخدم Edge.

على سبيل المثال، إذا ظهر لك الخطأ 404 مع عنوان URL http://example.com:9001/proxy1، عليك العثور على المضيفات الافتراضية التي تتضمّن الاسم المستعار للمضيف example.com والمنفذ 9001.

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

    مثال:

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

    مثال:

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

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

  1. احصل على تعريف كل من المضيفات الافتراضية في كل بيئة من بيئات مؤسستك لمعرفة المضيفات الافتراضية التي تتضمّن الاسم المستعار للمضيف ورقم المنفذ نفسَيهما:

    على سبيل المثال، إذا ظهر لك الخطأ 404 مع عنوان URL http://example.com:9001/proxy1، عليك العثور على المضيفات الافتراضية التي تتضمّن الاسم المستعار للمضيف example.com والمنفذ 9001.

    1. الحصول على قائمة البيئات

      مستخدِم Public Cloud:

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

      مستخدِم Private Cloud:

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

      المكان:

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

      مثال:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
    2. الحصول على قائمة المضيفات الافتراضية في بيئة

      مستخدِم Public Cloud:

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

      مستخدِم Private Cloud:

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

      المكان:

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

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

      مثال:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
    3. الحصول على تعريف كل من المضيفات الافتراضية في البيئة

      مستخدِم Public Cloud:

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

      مستخدِم Private Cloud:

      curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
      

      المكان:

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

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

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

      مثال:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }
    4. كرِّر الخطوتَين أعلاه للبيئات الأخرى في مؤسستك.

      في هذا المثال، كرِّر الخطوات لبيئة dev:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts -u USERNAME
      
      [ "default" ]
      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }

      في هذا المثال، يمكنك ملاحظة أنّ المضيفَين الافتراضيَين default في بيئتَين مختلفتَين، test وdev، يتضمّنان الاسم المستعار للمضيف example.com ورقم المنفذ 9001 نفسَيهما. هذا هو سبب ظهور أخطاء 404.

    5. إذا عثرت على مضيفات افتراضية متعددة تطابق الاسم المستعار للمضيف نفسَه، انتقِل إلى قسم الحلّ لحلّ هذه المشكلة.

الدقة

  1. تأكَّد من أنّ كل مضيف افتراضي لا يحتوي إلا على مجموعات فريدة من الاسم المستعار للمضيف ورقم المنفذ.
  2. إذا حدّدت مضيفات افتراضية متعددة تتضمّن الاسم المستعار للمضيف ورقم المنفذ نفسَيهما، عليك تعديلها باستخدام اسم مستعار فريد للمضيف.
  3. يمكنك تعديل هذه المضيفات باستخدام واجهة مستخدم Edge أو واجهة برمجة التطبيقات للإدارة. يمكنك الاطّلاع على التعليمات ضِمن تعديل مضيف افتراضي.
  4. تأكَّد من أنّ كل اسم مستعار للمضيف يتضمّن إدخالًا مناسبًا في نظام أسماء النطاقات.
  5. في المثال الذي تمت مناقشته أعلاه، إذا كان الإعداد على النحو التالي:
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
    
    [ "prod", "test", "dev" ]
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    1. يمكنك تعديل المضيف الافتراضي غير الصحيح بحيث لا يتداخل مع المضيفات الأخرى.
    2. أي عدِّل الاسم المستعار للمضيف إلى example2.com.
    3. تأكَّد من أنّ الاسم المستعار الجديد للمضيف يتضمّن إدخالًا مشابهًا في نظام أسماء النطاقات للاسم المستعار السابق للمضيف.
      curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user -H 'Content-Type: application/json' -d '{
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }' -i
      
      HTTP/1.1 200 OK
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Type: application/json
      X-Apigee.user: user
      X-Apigee.organization: myorg
      X-Apigee.environment: dev
      X-Apigee.backends: management-server
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Length: 152
      
      {
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }
  6. أجرِ طلبات البيانات من واجهة برمجة التطبيقات مرة أخرى إلى الخادم الوكيل وتأكَّد من أنّك تتلقّى استجابات ناجحة باستمرار:
    curl http://example.com:9001/proxy1
    
    {
        "slideshow": {
    	    "author": "Yours Truly",
    		"date": "date of publication",
    		"slides": [
    		    {
    			    "title": "Wake up to WonderWidgets!",
    				"type:": "all"
    			},
    			{
    			    "items": [
    				    "Why WonderWidgets are great",
    					"Who buys WonderWidgets"
    				],
    				"title": "Overview",
    				"type": "all"
    			}
    		],
    		"title": "Sample Slide Show"
        }
    
    }
  7. إذا استمرت المشكلة، انتقِل إلى قسم يجب جمع معلومات التشخيص.

يجب جمع معلومات التشخيص

إذا استمرت المشكلة حتى بعد اتّباع التعليمات أعلاه، اجمع معلومات التشخيص التالية ، ثم تواصَل مع فريق دعم Apigee Edge:

إذا كنت مستخدِم Public Cloud، قدِّم المعلومات التالية:

  • اسم المؤسسة
  • اسم البيئة
  • اسم خادم وكيل واجهة برمجة التطبيقات
  • أمر curl الكامل لإعادة إنتاج الخطأ 404
  • إذا لم تظهر أخطاء 404 حاليًا، قدِّم الفترة الزمنية مع معلومات المنطقة الزمنية التي ظهرت فيها أخطاء 404 في الماضي.

إذا كنت مستخدِم Private Cloud، قدِّم المعلومات التالية:

  • رسالة الخطأ الكاملة التي تظهر للطلبات التي تعذّر تنفيذها
  • اسم المؤسسة والبيئة واسم خادم وكيل واجهة برمجة التطبيقات التي تظهر لك أخطاء 404 فيها
  • حزمة خادم وكيل واجهة برمجة التطبيقات
  • سجلّات الوصول إلى NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • سجلّات "معالج الرسائل"
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • الفترة الزمنية مع معلومات المنطقة الزمنية التي ظهرت فيها أخطاء 404