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 HARUS menghasilkan beberapa header
kolom dengan nama kolom yang sama dalam pesan, kecuali jika seluruh nilai kolom untuk pesan tersebut
bidang header didefinisikan sebagai daftar yang dipisahkan koma, [yaitu, #(values)] atau kolom header adalah
pengecualian yang umum digunakan. Jika Apigee Edge menemukan bahwa header tertentu yang sama, itu tidak diperbolehkan untuk
memiliki duplikat, akan dikirim lebih dari sekali dalam respons HTTP yang dikirim oleh
target/server backend,
maka akan merespons dengan 502 Bad Gateway
dan kode error
protocol.http.DuplicateHeader
Berikut adalah kemungkinan penyebab error ini:
Penyebab | Deskripsi | Petunjuk pemecahan masalah berlaku untuk |
---|---|---|
Duplikasi header dalam respons | Respons dari server backend berisi header duplikat. | Pengguna Edge Public dan Private Cloud |
Langkah-langkah diagnosis umum
Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:
Pemantauan API
Untuk mendiagnosis error menggunakan Pemantauan API:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.
- Buka Analyze > Pemantauan API > Investigasi.
- Pilih jangka waktu tertentu saat Anda melihat error.
- Pastikan filter Proxy disetel ke Semua.
- Gambarkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.DuplicateHeader
seperti yang ditunjukkan di bawah:Informasi tentang kode kesalahan
protocol.http.DuplicateHeader
ditampilkan seperti yang ditunjukkan di bawah:- Pastikan Kode Status adalah
502
seperti yang ditunjukkan di contoh di atas. - Klik View logs, lalu luaskan baris untuk permintaan yang gagal.
Dari jendela Logs, perhatikan detail berikut:
- Kode Status:
502
- Sumber Kesalahan:
target
- Kode Kesalahan:
protocol.http.DuplicateHeader
.
- Kode Status:
- Sumber Kesalahan adalah
target
, yang menunjukkan bahwa respons dari server backend berisi header duplikat.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi rekaman aktivitas dan
- Tunggu hingga error
502 Bad Gateway
terjadi atau - Jika Anda bisa mereproduksi masalah, lakukan panggilan API dan rekonstruksi
502 Bad Gateway
error
- Tunggu hingga error
Pastikan Tampilkan semua Info Alur diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
- Menavigasi melalui berbagai fase pelacakan dan menemukan tempat terjadinya kegagalan.
Anda akan menemukan error yang biasanya ada dalam alur setelah Permintaan dikirim ke target server seperti yang ditunjukkan di bawah ini:
Perhatikan nilai error dari trace.
Contoh rekaman aktivitas di atas menunjukkan error sebagai
Duplicate Header "Expires"
. Sejak error yang dimunculkan oleh Apigee setelah permintaan dikirim ke server backend, hal ini menunjukkan server backend mengirim headerExpires
lebih dari sekali.- Buka Fase AX (Data Analytics Dicatat) di rekaman aktivitas, lalu klik Fase tersebut.
Scroll ke bawah ke bagian Fase Details - Response Headers dan tentukan X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:
- Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source
sebagai
protocol.http.DuplicateHeader
dantarget
, yang menunjukkan bahwa kesalahan ini disebabkan karena {i>header <i}duplikat diteruskan oleh server backend untuk header responsExpires
.Header Respons Nilai X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Periksa apakah Anda menggunakan peranan proxy; Artinya, jika server target atau endpoint target memanggil proxy lain di Apigee.
Untuk menentukannya, kembalilah ke fase server Permintaan dikirim ke target. Klik Show Curl.
Jendela Curl for Request Sent to Target Server akan terbuka dan Anda dapat menentukan alias {i>host<i} server target.
- Jika alias host server target mengarah ke alias host virtual, berarti itu adalah proxy
perantaian. Dalam hal ini, Anda perlu mengulangi semua
langkah di atas untuk proxy berantai hingga
Anda dapat menentukan penyebab error
502 Bad Gateway
. - Jika alias {i>host server<i} target menunjuk ke server {i>backend <i}Anda, maka hal itu mengindikasikan bahwa server backend Anda mengirimkan header duplikat dalam respons terhadap Apigee.
NGINX
Untuk mendiagnosis error menggunakan log akses NGINX:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk
menentukan informasi penting tentang error
502
HTTP. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.
- Telusuri untuk mengetahui apakah terdapat error
502
selama durasi tertentu atau tidak (jika masalah terjadi di masa lalu) atau jika ada permintaan yang masih gagal dengan502
. Jika Anda menemukan error
502
dengan X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.DuplicateHeader
, lalu tentukan nilai X-Apigee-fault-source.Contoh error 502 dari log akses NGINX:
Contoh entri di atas dari log NGINX Access 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 dalam respons
Diagnosis
- Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Log akses pemantauan atau NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Fault Source memiliki nilai
target
, ini menunjukkan bahwa respons yang dikirim oleh server target berisi duplikasi {i>header<i}. Anda dapat menentukan header sebenarnya yang dikirim lebih dari sekali sebagai bagian dari respons menggunakan salah satu metode berikut:
Pesan error
Menggunakan pesan error:
Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, rujuk ke
faultstring
.faultstring
berisi nama header yang telah dikirim lebih dari sekali.Contoh pesan error:
"faultstring":"Duplicate Header \"Expires\""
- Dalam pesan error di atas, Anda dapat melihat bahwa header
Expires
dikirim lebih dari sekali seperti yang terlihat dalamfaultstring
.
Permintaan sebenarnya
Menggunakan permintaan yang sebenarnya:
- Jika Anda tidak memiliki akses ke permintaan sebenarnya
yang dibuat ke server target, maka
perintah
curl
yang sesuai dari Menggunakan alat Trace langkah 10.a dan langkah 10.b. Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke aplikasi server target, kemudian lakukan langkah-langkah berikut:
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
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 banyak satu kali. Oleh karena itu, permintaan ini gagal dengan502 Bad Gateway
dan kode error:protocol.http.DuplicateHeader
.Jika header yang namanya muncul di
faultstring
muncul lebih dari sekali dalam respons server backend, maka itulah penyebab {i>error<i}. Dalam kasus di atas, headerExpires
dikirim lebih dari sekali.
Resolusi
Memperbaiki duplikasi
Opsi #1 [Opsi yang Direkomendasikan] Memperbaiki server backend agar tidak menyertakan header duplikat
- Menganalisis alasan server backend tertentu mengirim header duplikat
Expires
dan verifikasi apakah proxy API boleh menerimanya. Di beberapa kebanyakan kasus, hal itu tidak diinginkan sesuai dengan spesifikasi HTTP RFC7230. - Jika tidak diinginkan, ubah aplikasi server target Anda agar tidak mengirimkan header duplikat.
Pada contoh yang dibahas di atas, terlihat bahwa header
Expires
dikirim dua kali dengan nilai yang sama, yang tidak diinginkan. Anda dapat memperbaiki masalah ini dengan memastikan bahwa server target hanya meneruskan headerExpires
satu kali. - Jika Anda menginginkannya dan Anda ingin mengizinkan header duplikat, buka Opsi #2 Menggunakan properti CwC.
CwC
Opsi no. 2 Menggunakan properti CwC
Apigee menyediakan properti CwC
HTTPHeader.<HeaderName>
,yang memungkinkan aplikasi klien dan target
server untuk mengirim header duplikat ke proxy API di Apigee Edge.
Properti CwC | Nilai |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Misalnya, properti berikut dapat ditetapkan di Pemroses Pesan untuk mengizinkan duplikat
dan beberapa nilai untuk header Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Jika Anda adalah pengguna Private Cloud, Anda dapat mengonfigurasi properti untuk mencegah Apigee
Edge agar tidak menampilkan error
502 Bad Gateway
, meskipun permintaan berisi {i>header <i}duplikat menggunakan Panduan cara mengonfigurasi Pemroses Pesan agar menggunakan header duplikat. - Jika Anda adalah pengguna Cloud Publik, hubungi Dukungan Apigee Edge untuk mengonfigurasi untuk organisasi Anda.
Spesifikasi
Apigee merespons dengan respons error 502 Bad Gateway
karena ia mengharapkan
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
- Menyelesaikan perintah
curl
yang digunakan untuk mereproduksi error502
- 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
Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.
- Log sistem Pemroses Pesan
/opt/apigee/var/log/edge-message-processor/logs/system.log