404 Beberapa host virtual dengan alias host yang sama

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 404 dengan pesan Not Found dan pesan error Unable to identify proxy for host: VIRTUAL_HOST and url: PATH sebagai respons terhadap panggilan API.

Error ini berarti bahwa Edge tidak dapat menemukan proxy API untuk host dan jalur virtual yang ditentukan.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 404 Not Found

Selain itu, Anda mungkin melihat pesan error yang mirip dengan yang ditampilkan di bawah ini:

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

Kemungkinan penyebab

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Host virtual dengan alias host duplikat Beberapa host virtual memiliki alias host dan nomor port yang sama. Pengguna Edge Publik dan Private Cloud

Langkah-langkah diagnosis umum

Log NGINX dan Pemroses Pesan akan membantu memecahkan masalah error 404. Gunakan langkah-langkah berikut untuk memeriksa log:

  1. Lihat log NGINX menggunakan perintah berikut:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Periksa kolom berikut dalam entri log:
    Kolom Nilai
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Catat ID pesan dari log.

  3. Periksa log Pemroses Pesan (/opt/apigee/var/log/edge-message-processor/logs/system.log) untuk melihat apakah Anda memiliki messaging.adaptors.http.flow.ApplicationNotFound untuk API tertentu atau apakah Anda memiliki ID pesan unik dari langkah 2 untuk permintaan API.

    Contoh pesan error dari log Message Processor

  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)
    

    Log di atas menunjukkan kode error dan pesan error adalah sebagai berikut:

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

Penyebab: Beberapa host virtual dengan alias host dan nomor port yang sama

Router Apigee Edge dan Pemroses Pesan menggunakan header host, nomor port, dan jalur URI untuk mengarahkan traffic ke proxy API yang benar. Definisi yang ambigu seperti beberapa host virtual dengan alias host dan nomor port yang sama merupakan anti-pola yang didokumentasikan dan dapat menyebabkan perilaku yang tidak diharapkan. Salah satu error umum yang akan Anda amati adalah error 404 dengan pesan Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Biasanya, jika ada beberapa host virtual dengan alias host yang sama, Anda akan melihat error 404 yang terputus-putus. Hal ini karena Proxy API tertentu dapat dikonfigurasi untuk menerima permintaan hanya pada salah satu host virtual. Saat permintaan API dirutekan ke host virtual tertentu yang dikonfigurasi dalam Proxy API, Anda akan menerima respons yang berhasil. Namun, jika permintaan API dirutekan ke host virtual lain yang tidak dikonfigurasi untuk menerima permintaan tersebut, API akan gagal dengan error 404 ini.

Ikuti petunjuk yang diberikan pada 404 Invisible for host: <virtual host name> and url: <path>, lalu pecahkan masalah error ini. Jika tidak ada penyebab yang menyebabkan error ini, gunakan langkah-langkah di bawah ini untuk menentukan apakah host virtual dengan alias host duplikat menyebabkan error 404.

Diagnosis

Gunakan salah satu metode berikut untuk menentukan apakah ada beberapa host virtual yang memiliki alias/port # host yang sama yang menyebabkan error 404:

  • UI Edge
  • API pengelolaan

UI Edge

Gunakan petunjuk ini untuk menentukan apakah ada beberapa host virtual yang memiliki alias/port # host yang sama menggunakan UI Edge.

Misalnya, jika Anda mengamati error 404 dengan URL http://example.com:9001/proxy1, Anda perlu menemukan host virtual mana yang memiliki alias host example.com dan port 9001.

  1. Di Public Cloud dan UI Edge baru di Private Cloud:
    1. Pilih Admin.
    2. Pilih Virtual Hosts.
    3. Untuk setiap Environment, gunakan filter penelusuran untuk menentukan Host Virtual yang cocok dengan Alias Host tertentu yang digunakan untuk memanggil permintaan API.
    4. Jika Anda menemukan beberapa Host Virtual yang menggunakan Alias Host yang sama, buka Resolution untuk menyelesaikan masalah ini.

    Contoh:

  2. Di UI Klasik di Private Cloud:
    1. Pilih tab APIs .
    2. Pilih Environment Configuration.
    3. Pilih Virtual Hosts.
    4. Untuk setiap Lingkungan, lihat daftar Host Virtual untuk melihat apakah ada kecocokan dengan Alias Host tertentu yang digunakan untuk memanggil permintaan API.
    5. Jika Anda menemukan beberapa Host Virtual yang cocok dengan Alias Host yang sama, buka Resolution untuk menyelesaikan masalah ini.

    Contoh:

API pengelolaan

Gunakan petunjuk ini untuk menentukan apakah ada beberapa host virtual yang memiliki alias/port # host yang sama menggunakan Management API.

  1. Dapatkan definisi dari setiap host virtual di setiap lingkungan dalam organisasi Anda untuk melihat host virtual mana yang memiliki alias host dan nomor port yang sama:

    Misalnya, jika Anda mengamati error 404 dengan URL http://example.com:9001/proxy1, Anda perlu menemukan host virtual mana yang memiliki alias host example.com dan port 9001.

    1. Mendapatkan daftar lingkungan

      Pengguna Cloud Publik:

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

      Pengguna Private Cloud:

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

      Dengan keterangan:

      ORGANIZATION_NAME adalah nama organisasi

      Contoh:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
      
    2. Mendapatkan daftar host virtual dalam lingkungan

      Pengguna Cloud Publik:

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

      Pengguna Private Cloud:

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

      Dengan keterangan:

      ORGANIZATION_NAME adalah nama organisasi

      ENVIRONMENT_NAME adalah nama lingkungannya

      Contoh:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
      
    3. Mendapatkan definisi setiap host virtual di lingkungan.

      Pengguna Cloud Publik:

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

      Pengguna Private Cloud:

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

      Dengan keterangan:

      ORGANIZATION_NAME adalah nama organisasi

      ENVIRONMENT_NAME adalah nama lingkungannya

      VIRTUAL_HOST_NAME adalah nama host virtual

      Contoh:

      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. Ulangi kedua langkah di atas untuk lingkungan lain di organisasi Anda.

      Dalam contoh ini, ulangi langkah-langkah untuk lingkungan 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" : [ ]
      }
      

      Dalam contoh ini, Anda dapat melihat bahwa dua host virtual default dalam dua lingkungan yang berbeda, test dan dev, memuat alias host example.com dan nomor port 9001 yang sama. Inilah penyebab error 404.

    5. Jika Anda menemukan beberapa Host Virtual yang cocok dengan Alias Host yang sama, buka Resolution untuk menyelesaikan masalah ini.

Resolusi

  1. Pastikan bahwa setiap host virtual hanya berisi kombinasi port dan alias host yang unik.
  2. Jika Anda telah mengidentifikasi beberapa host virtual dengan alias host dan kombinasi port yang sama, Anda harus memperbaruinya dengan alias host unik.
  3. Anda dapat mengupdatenya menggunakan UI Edge atau Management API, petunjuknya dapat ditemukan di bagian Memodifikasi a virtual host.
  4. Pastikan setiap alias host memiliki entri DNS yang benar.
  5. Pada contoh yang dibahas di atas, jika konfigurasi kita terlihat seperti ini:
    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. Anda dapat memperbarui host virtual yang salah sehingga tidak tumpang tindih.
    2. Langkah tersebut adalah memperbarui alias host sebagai example2.com.
    3. Pastikan alias host baru memiliki entri DNS yang serupa dengan alias host sebelumnya.
      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. Lakukan panggilan API lagi ke proxy dan pastikan Anda mendapatkan respons yang berhasil secara konsisten:
    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. Jika masalah masih berlanjut, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge:

Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

  • Nama organisasi
  • Nama lingkungan
  • Nama Proxy API
  • Selesaikan perintah curl untuk mereproduksi error 404
  • Jika error 404 tidak terjadi saat ini, berikan jangka waktu dengan informasi zona waktu saat error 404 terjadi di masa lalu.

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Organisasi, Nama Lingkungan, dan nama Proxy API yang Anda amati error 404-nya
  • Paket Proxy API
  • Log akses NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Log Pemroses Pesan
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Jangka waktu dengan informasi zona waktu saat error 404 terjadi