502 Bad Gateway - DuplicateHeader

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

Gejala

Aplikasi klien mendapatkan kode status HTTP 502 Bad Gateway dengan kode error protocol.http.DuplicateHeader sebagai respons untuk panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Kemungkinan Penyebab

Error ini terjadi jika header HTTP tertentu yang tidak diizinkan memiliki duplikat di Apigee Edge, muncul lebih dari sekali dengan nilai yang sama atau berbeda, sebagai bagian dari respons HTTP yang dikirim oleh server backend ke Apigee Edge.

Sesuai dengan RFC 7230, bagian 3.2.2: Urutan Kolom, pengirim TIDAK BOLEH membuat beberapa kolom header dengan nama kolom yang sama dalam pesan, kecuali jika seluruh nilai kolom untuk kolom header tersebut ditetapkan sebagai daftar yang dipisahkan koma, [yaitu, #(values)] atau kolom header adalah pengecualian yang umum digunakan. Jika Apigee Edge menemukan bahwa header yang sama, yang tidak boleh memiliki duplikat, dikirim lebih dari sekali dalam respons HTTP yang dikirim oleh server target/backend, kemudian akan merespons dengan 502 Bad Gateway dan kode error protocol.http.DuplicateHeader

Berikut kemungkinan penyebab error ini:

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Header duplikat dalam respons Respons dari server backend berisi header duplikat. Pengguna Edge Publik dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

Pemantauan API

Untuk mendiagnosis error menggunakan API Monitoring:

  1. Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.

  3. Buka halaman Analyze > API Monitoring > Menyelidiki.
  4. Pilih jangka waktu spesifik saat Anda melihat error.
  5. Pastikan filter Proxy disetel ke Semua.
  6. Tempatkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan protocol.http.DuplicateHeader seperti yang ditunjukkan di bawah ini:

    (lihat gambar yang lebih besar)

  8. Informasi tentang kode kesalahan protocol.http.DuplicateHeader ditampilkan seperti yang ditunjukkan di bawah ini:

    (lihat gambar yang lebih besar)

  9. Pastikan Kode Status adalah 502 seperti yang ditunjukkan pada contoh di atas.
  10. Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
  11. Dari jendela Log, perhatikan detail berikut:

    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.DuplicateHeader.
  12. Fault Source adalah target, yang menunjukkan bahwa respons dari server backend berisi header duplikat.

Alat pelacak

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi perekaman aktivitas dan
    1. Tunggu hingga error 502 Bad Gateway terjadi atau
    2. Jika Anda dapat merekonstruksi masalah, lakukan panggilan API dan rekonstruksi error 502 Bad Gateway
  2. Pastikan Tampilkan semua Info Alur diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  4. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  5. Anda akan menemukan error biasanya dalam flow setelah fase Request sent to target server seperti yang ditunjukkan di bawah ini:

    (lihat gambar yang lebih besar)

  6. Catat nilai error dari rekaman aktivitas.

    Rekaman aktivitas contoh di atas menampilkan error sebagai Duplicate Header "Expires". Karena error ini dipicu oleh Apigee setelah permintaan dikirim ke server backend, hal ini menunjukkan bahwa server backend mengirim header Expires lebih dari sekali.

  7. Buka Fase AX (Data Analytics Dicatat) di trace, lalu klik Fase tersebut.
  8. Scroll ke bawah ke bagian Phase Details - Response Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:

    (lihat gambar yang lebih besar)

  9. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagai protocol.http.DuplicateHeader dan target, yang menunjukkan bahwa error ini disebabkan karena header duplikat diteruskan oleh server backend untuk header respons Expires.
    Header Respons Nilai
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Periksa apakah Anda menggunakan proxy chaining; yaitu, jika server target atau endpoint target memanggil proxy lain di Apigee.

    1. Untuk menentukan hal ini, buka kembali fase server Permintaan dikirim ke target. Klik Show Curl.

    2. Jendela Curl for Request Sent to Target Server akan terbuka dan Anda dapat menentukan alias host server target.

    3. Jika alias host server target mengarah ke alias host virtual, alias itu adalah perantaian proxy. Dalam hal ini, Anda perlu mengulangi semua langkah di atas untuk proxy berantai sampai Anda menentukan penyebab error 502 Bad Gateway.
    4. Jika alias host server target menunjuk ke server backend, berarti server backend Anda mengirimkan header duplikat sebagai respons terhadap Apigee.

NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi utama tentang error 502 HTTP.
  2. Periksa log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  3. Telusuri untuk melihat apakah ada error 502 selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan 502.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code yang cocok dengan nilai protocol.http.DuplicateHeader, tentukan nilai dari X-Apigee-fault-source.

    Contoh error 502 dari log akses NGINX:

    Contoh entri dari log Akses NGINX di atas memiliki nilai berikut untuk X- Apigee-fault-code dan X-Apigee-fault-source:

    Header Respons Nilai
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Penyebab: Header Duplikat sebagai respons

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Monitoring atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Source memiliki nilai target, ini menunjukkan bahwa respons yang dikirim oleh server target berisi header duplikat.
  3. Anda dapat menentukan header sebenarnya yang dikirim lebih dari sekali sebagai bagian dari respons menggunakan salah satu metode berikut:

    Pesan error

    Menggunakan pesan error:

    1. Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat faultstring. faultstring berisi nama header yang telah dikirim lebih dari sekali.

      Contoh pesan error:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Dalam pesan error di atas, Anda dapat melihat bahwa header Expires dikirim lebih dari sekali seperti yang terlihat dalam faultstring.

    Permintaan sebenarnya

    Menggunakan permintaan aktual:

    1. Jika Anda tidak memiliki akses ke permintaan aktual yang dibuat ke server target, dapatkan perintah curl yang sesuai dari Menggunakan alat Trace langkah 10.a dan langkah 10.b.
    2. Jika Anda memiliki akses ke permintaan aktual yang dibuat ke aplikasi server target, lakukan langkah-langkah berikut:

      1. Lakukan panggilan ke server target.

        Contoh Permintaan untuk server target yang digunakan dalam contoh ini:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. Verifikasi daftar header yang terlihat dalam respons.

        Contoh Respons dari server target yang digunakan dalam contoh ini:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        Dalam contoh permintaan di atas, header Expires dikirim lebih dari sekali. Oleh karena itu, permintaan ini gagal dengan error 502 Bad Gateway dan kode error: protocol.http.DuplicateHeader.

      3. Jika header yang namanya muncul di faultstring muncul lebih dari sekali dalam respons server backend, berarti itulah penyebab error ini. Dalam kasus di atas, header Expires dikirim lebih dari sekali.

Resolusi

Memperbaiki duplikasi

Opsi #1 [Opsi yang Direkomendasikan] Memperbaiki server backend agar tidak menyertakan header duplikat

  1. Analisis alasan server backend tertentu mengirim header duplikat Expires dan verifikasi apakah proxy API dapat menerimanya. Dalam sebagian besar kasus, URL ini tidak diinginkan sesuai dengan spesifikasi HTTP RFC7230.
  2. Jika tidak diinginkan, ubah aplikasi server target agar tidak mengirim header duplikat. Pada contoh yang dibahas di atas, terlihat bahwa header Expires dikirim dua kali dengan nilai yang sama, dan hal ini tidak diinginkan. Anda dapat memperbaiki masalah ini dengan memastikan bahwa server target meneruskan header Expires hanya sekali.
  3. Jika diinginkan dan Anda ingin mengizinkan header duplikat, buka Opsi #2 Menggunakan properti CwC.

CwC

Opsi #2 Menggunakan properti CwC

Apigee menyediakan properti CwC HTTPHeader.<HeaderName> ,yang memungkinkan aplikasi klien dan server target mengirim header duplikat ke proxy API di Apigee Edge.

Properti CwC Nilai
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Misalnya, properti berikut dapat ditetapkan pada Message Processors untuk mengizinkan duplikat dan beberapa nilai untuk header Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Jika Anda adalah pengguna Private Cloud, Anda dapat mengonfigurasi properti ini agar Apigee Edge tidak memunculkan error 502 Bad Gateway, meskipun permintaan tersebut berisi header duplikat menggunakan panduan cara kerja Mengonfigurasi Prosesor Pesan untuk menggunakan header duplikat.
  2. Jika Anda adalah pengguna Cloud Publik, hubungi Dukungan Apigee Edge untuk mengonfigurasi properti ini bagi organisasi Anda.

Spesifikasi

Apigee merespons dengan respons error 502 Bad Gateway karena mengharapkan bahwa server backend akan berperilaku sesuai dengan spesifikasi RFC berikut:

Spesifikasi
RFC 7230, bagian 3.2.2: Urutan Kolom
RFC 7230, bagian 3.2: Kolom Header

Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

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 yang digunakan untuk mereproduksi error 502
  • File rekaman aktivitas untuk permintaan API

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Nama lingkungan
  • Paket proxy API
  • File rekaman aktivitas untuk permintaan API
  • Log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message-processor/logs/system.log