404 چندین میزبان مجازی با نام مستعار میزبان یکسان

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP 404 را به همراه پیام Not Found و پیام خطای Unable to identify proxy for host: VIRTUAL_HOST and url: PATH به عنوان پاسخی به فراخوانی‌های API دریافت می‌کند.

این خطا به این معنی است که Edge نتوانسته پروکسی API را برای میزبان مجازی و مسیر مشخص شده پیدا کند.

پیام خطا

برنامه‌ی کلاینت کد پاسخ زیر را دریافت می‌کند:

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

مراحل تشخیص مشترک

گزارش‌های NGINX و Message Processor در عیب‌یابی خطای 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 برای API خاص دارید یا اینکه آیا شناسه پیام منحصر به فرد از مرحله 2 را برای درخواست API دارید یا خیر.

    نمونه پیام خطا از گزارش پردازشگر پیام

  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 برای هدایت ترافیک به پروکسی API صحیح استفاده می‌کنند. داشتن تعاریف مبهم مانند چندین میزبان مجازی با نام مستعار میزبان و شماره پورت یکسان، یک الگوی ضد الگو مستند است و می‌تواند منجر به رفتارهای غیرمنتظره شود. یکی از خطاهای رایجی که مشاهده خواهید کرد، خطای 404 با پیام Unable to identify proxy for host: VIRTUAL_HOST and url: PATH است.

معمولاً اگر چندین میزبان مجازی با نام مستعار میزبان یکسان وجود داشته باشد، خطاهای 404 متناوبی را مشاهده خواهید کرد. دلیل این امر این است که ممکن است API Proxy خاص طوری پیکربندی شده باشد که درخواست‌ها را فقط روی یکی از میزبان‌های مجازی بپذیرد. هنگامی که درخواست‌های API به میزبان مجازی خاصی که در API Proxy پیکربندی شده است، هدایت می‌شوند، پاسخ موفقیت‌آمیزی دریافت خواهید کرد. با این حال، هنگامی که درخواست‌های API به میزبان‌های مجازی دیگری که API Proxy برای پذیرش درخواست‌ها به آنها پیکربندی نشده است، هدایت می‌شوند، APIها با این خطاهای 404 از کار می‌افتند.

دستورالعمل‌های داده شده در 404 Unable to Identify proxy for host: <virtual host name> و url: <path> را دنبال کنید و این خطا را عیب‌یابی کنید. اگر هیچ یک از دلایل منجر به این خطا نشدند، از مراحل زیر برای تعیین اینکه آیا میزبان‌های مجازی با نام‌های مستعار میزبان تکراری باعث خطاهای 404 می‌شوند یا خیر، استفاده کنید.

تشخیص

برای تعیین اینکه آیا چندین میزبان مجازی با نام مستعار/پورت یکسان وجود دارند که منجر به خطای 404 می‌شود، از یکی از روش‌های زیر استفاده کنید:

  • رابط کاربری اج
  • API های مدیریتی

رابط کاربری اج

از این دستورالعمل‌ها برای تعیین اینکه آیا چندین میزبان مجازی با نام مستعار/پورت # یکسان با استفاده از رابط کاربری Edge وجود دارند یا خیر، استفاده کنید.

برای مثال، اگر خطای 404 را با آدرس http://example.com:9001/proxy1 مشاهده کردید، باید ببینید کدام میزبان‌های مجازی نام مستعار example.com و پورت 9001 را دارند.

  1. در فضای ابری عمومی و رابط کاربری جدید Edge در فضای ابری خصوصی :
    1. مدیر را انتخاب کنید.
    2. میزبان‌های مجازی را انتخاب کنید.
    3. برای هر محیط، از فیلتر جستجو برای تعیین میزبان‌های مجازی که با نام مستعار میزبان خاص که درخواست‌های API با آن فراخوانی شده‌اند، مطابقت دارند، استفاده کنید.
    4. اگر چندین میزبان مجازی را مشاهده کردید که از نام مستعار میزبان یکسانی استفاده می‌کنند، برای حل این مشکل به بخش Resolution مراجعه کنید.

    برای مثال:

  2. در رابط کاربری کلاسیک در فضای ابری خصوصی :
    1. برگه APIها را انتخاب کنید.
    2. پیکربندی محیط را انتخاب کنید.
    3. میزبان‌های مجازی را انتخاب کنید.
    4. برای هر محیط، لیست میزبان‌های مجازی را مشاهده کنید تا ببینید آیا با نام مستعار میزبان خاصی که درخواست‌های API با آن فراخوانی شده‌اند، مطابقت دارد یا خیر.
    5. اگر چندین میزبان مجازی با نام مستعار میزبان یکسان پیدا کردید، برای حل این مشکل به Resolution بروید.

    برای مثال:

API های مدیریتی

از این دستورالعمل‌ها برای تعیین اینکه آیا چندین میزبان مجازی با نام مستعار/شماره پورت یکسان با استفاده از APIهای مدیریتی وجود دارند یا خیر، استفاده کنید.

  1. تعریف هر یک از میزبان‌های مجازی را در هر یک از محیط‌های سازمان خود دریافت کنید تا ببینید کدام میزبان‌های مجازی نام مستعار میزبان و شماره پورت یکسانی دارند:

    برای مثال، اگر خطای 404 را با آدرس http://example.com:9001/proxy1 مشاهده کردید، باید ببینید کدام میزبان‌های مجازی نام مستعار example.com و پورت 9001 را دارند.

    1. دریافت لیست محیط‌ها

      کاربر ابر عمومی:

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

      کاربر ابر خصوصی:

      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. دریافت لیست میزبان‌های مجازی در یک محیط

      کاربر ابر عمومی:

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

      کاربر ابر خصوصی:

      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. تعریف هر یک از میزبان‌های مجازی در محیط را دریافت کنید.

      کاربر ابر عمومی:

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

      کاربر ابر خصوصی:

      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. اگر چندین میزبان مجازی با نام مستعار میزبان یکسان پیدا کردید، برای حل این مشکل به Resolution بروید.

وضوح تصویر

  1. اطمینان حاصل کنید که هر میزبان مجازی فقط شامل نام‌های مستعار میزبان و ترکیب پورت‌های منحصر به فرد است.
  2. اگر چندین میزبان مجازی با نام مستعار میزبان و ترکیب پورت یکسان شناسایی کرده‌اید، باید آنها را با یک نام مستعار میزبان منحصر به فرد به‌روزرسانی کنید.
  3. شما می‌توانید این موارد را با استفاده از رابط کاربری Edge یا رابط برنامه‌نویسی کاربردی مدیریت (Management API) به‌روزرسانی کنید، دستورالعمل‌ها را می‌توانید در بخش «اصلاح میزبان مجازی» بیابید.
  4. مطمئن شوید که هر نام مستعار میزبان، ورودی DNS مناسبی دارد.
  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. مطمئن شوید که نام مستعار میزبان جدید، ورودی DNS مشابهی با نام مستعار میزبان قبلی دارد.
      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. دوباره فراخوانی‌های API را به پروکسی انجام دهید و تأیید کنید که به طور مداوم پاسخ‌های موفقی دریافت می‌کنید:
    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 تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط
  • نام پروکسی API
  • دستور curl را برای بازتولید خطای 404 کامل کنید
  • اگر خطاهای 404 در حال حاضر رخ نمی‌دهند، دوره زمانی را به همراه اطلاعات منطقه زمانی که خطاهای 404 در گذشته رخ داده‌اند، ارائه دهید.

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل مشاهده شده برای درخواست‌های ناموفق
  • نام سازمان، محیط و نام پراکسی API که در آن خطای 404 مشاهده می‌کنید
  • بسته پروکسی API
  • گزارش‌های دسترسی 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 رخ داده است