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.TooBigLine 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 berikut:
{
"fault":{
"faultstring":"response line size exceeding 2,048",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}Kemungkinan penyebab
Error ini terjadi jika ukuran Response-Line yang dikirim oleh server target/backend ke Apigee Edge sebagai bagian dari respons HTTP lebih besar daripada batas maksimum yang diizinkan di Apigee Edge.
Sebelum kita melihat kemungkinan penyebab error ini, mari kita pahami apa yang dimaksud dengan Response-Line dan cara memeriksa ukurannya.
Memahami Response-Line
Respons HTTP biasanya terdiri dari tiga bagian:
- Status-Line (Disebut sebagai Response-Line di Apigee)
- ( Set header HTTP )
- [ Body ]
Baris Respons terdiri dari tiga bagian: versi protokol yang diikuti dengan kode status numerik dan frasa tekstual terkait seperti yang ditunjukkan di bawah:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Saat respons HTTP dikirim oleh aplikasi server target/backend, baris pertama yang dikirimkan mewakili Response-Line seperti yang dijelaskan di atas. Ini diikuti dengan
header dan isi/payload respons.Screenshot contoh berikut menunjukkan permintaan
curl yang umum, bagian Request, dan bagian Response (bersama dengan
Response-Line).
Memahami ukuran Response-Line
Dalam contoh yang dibahas di atas, baris start (baris pertama) dalam respons yang juga disebut sebagai Response-Line adalah sebagai berikut:
HTTP/1.1 200 OK
Garis Respons ini memiliki ukuran
~15 byteskarena berisi15 ASCII characters. Karena masih dalam batas yang diizinkan di Apigee Edge, respons dikirim kembali ke klien tanpa error apa pun oleh Apigee Edge.- Demikian pula, jika Anda melihat
faultstringdi Pesan error yang ditampilkan di atas, pesan tersebut berisi"response line size exceeding 2,048". Hal ini menunjukkan bahwa Response-Line dalam respons HTTP yang dikirim oleh server target/backend melebihi 2.048 byte.
Memahami Response-Line besar
Sesuai dengan definisi Status-Line (disebut sebagai Response-Line di sini) dan permintaan serta respons HTTP umum, ukurannya akan jauh lebih kecil daripada batas default 2 K yang ditentukan di Apigee Edge, sehingga kita mungkin tidak mencapai batas tersebut. Namun, berikut beberapa kemungkinan skenario saat Anda dapat melampaui batas ini:
- Server target/backend bukan sistem HTTP. Aplikasi dapat merespons dengan respons non-HTTP.
- Server target/backend mengalami masalah dan mengirimkan Baris-Respons yang panjang sebagai bagian dari respons HTTP.
Baca selengkapnya tentang hal ini di Mendapatkan error protocol.http.TooBigLine, "ukuran baris respons melebihi 2.048.
Berikut kemungkinan penyebab error:
| Penyebab | Deskripsi | Petunjuk pemecahan masalah yang berlaku untuk |
|---|---|---|
| Ukuran baris respons lebih besar dari batas yang diizinkan | Ukuran Response-Line yang dikirim oleh server target/backend sebagai bagian dari respons HTTP ke Apigee Edge lebih besar daripada batas yang diizinkan di Apigee Edge | 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.
Beralih ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Investigate.
- Pilih jangka waktu tertentu saat Anda mengamati error.
- Anda dapat memilih filter Proxy untuk mempersempit kode kesalahan.
- Petakan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.TooBigLineseperti yang ditunjukkan di bawah:( lihat gambar yang lebih besar)
Anda akan melihat informasi tentang kode kesalahan
protocol.http.TooBigLineseperti yang ditunjukkan di bawah:( lihat gambar yang lebih besar)
Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
- Dari jendela Logs, catat detail berikut:
- Kode Status:
502 - Sumber Kesalahan:
target - Kode Kesalahan:
protocol.http.TooBigLine.
- Kode Status:
- Jika Fault Source memiliki nilai
targetdan Fault Code memiliki nilaiprotocol.http.TooBigLine, maka hal ini menunjukkan bahwa respons HTTP dari target/ server backend memiliki ukuran Response-Line yang lebih besar dari batas maksimum yang diizinkan di Apigee Edge.
Alat rekaman aktivitas
- Aktifkan sesi rekaman aktivitas
dan salah satu dari:
- Tunggu hingga terjadi error
502 Bad Gateway. atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan reproduksi error
502 Bad Gateway.
- Tunggu hingga terjadi error
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Telusuri berbagai fase rekaman aktivitas dan temukan tempat terjadinya kegagalan.
Biasanya, Anda akan menemukan error di
flowinfoError tepat setelah fase Permintaan dikirim ke server target seperti yang ditunjukkan di bawah:
Perhatikan nilai error dari rekaman aktivitas:
- error:
response line exceeding 2,048 - error.class:
com.apigee.errors.http.server.BadGateway
Hal ini menunjukkan bahwa Apigee Edge (komponen Message Processor) memunculkan error segera setelah menerima respons dari server backend karena ukuran Response-Line melebihi batas yang diizinkan.
- error:
Anda akan melihat pesan error yang dikirim ke klien pada fase Respons Dikirim ke Klien seperti yang ditunjukkan di bawah:
( lihat gambar yang lebih besar)
- Perhatikan nilai error dari rekaman aktivitas:
- Error:
502 Bad Gateway. - Konten Error:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Error:
Anda juga dapat membuka fase AX (Data Analytics Direkam) di rekaman aktivitas dan mengkliknya untuk melihat detail error.
( lihat gambar yang lebih besar)
Perhatikan nilai berikut:
Header permintaan Nilai X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetKonten Error : Isi {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
Untuk mendiagnosis error menggunakan log akses NGINX:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk
menentukan informasi utama tentang error HTTP
502. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logKeterangan: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Cari untuk melihat apakah ada error
502selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan502. Jika Anda menemukan error
502dengan X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.TooBigLine, tentukan nilai X-Apigee-fault-source.
Entri contoh di atas dari log akses NGINX memiliki nilai berikut untuk X- Apigee-fault-code dan X-Apigee-fault-source:
Header Respons Nilai X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source target
Penyebab: Ukuran Response-Line lebih besar dari batas yang diizinkan
Diagnosis
- Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Fault Source memiliki nilai
target, maka hal ini menunjukkan bahwa ukuran Response-Line yang dikirim oleh aplikasi server target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge. Anda dapat memvalidasi bahwa ukuran Response-Line telah melampaui batas yang diizinkan sebesar 2 KB menggunakan salah satu metode berikut:
Pesan error
Untuk memvalidasi menggunakan pesan error:
Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat
faultstring.Contoh pesan error:
"faultstring":"response line size exceeding 2,048"
faultstringdi atas menunjukkan bahwa ukuran Response-Line melebihi batas yang diizinkan, yaitu 2 KB.Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan sebenarnya:
Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke aplikasi server target/backend, lakukan langkah-langkah berikut:
- Verifikasi ukuran Baris-Respons
- Jika Anda menemukan bahwa ukuran URI lebih besar dari
batas yang diizinkan di Apigee Edge, maka itulah penyebab
masalahnya.
Contoh respons dari server target/backend:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
Dalam kasus di atas, Response-Line
HTTP/1.1 200 1111…<trimmed>...11111111lebih besar dari 2 KB, yaitu berisi lebih dari 2 K karakter ASCII.Jika Anda menggunakan klien lain, Anda dapat meninjau log klien dan mencoba mengetahui ukuran Response-Line yang dikirim ke Apigee Edge.
Log Message Processor
Untuk memvalidasi menggunakan log Message Processor:
Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Message Processor untuk memvalidasi apakah ukuran Response-Line telah melampaui batas yang diizinkan di Apigee Edge.
- Tentukan ID pesan permintaan yang gagal menggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
Telusuri ID pesan di log Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.logAnda akan menemukan baris dari
system.logyang mirip dengan berikut ini:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
Teks
message = response line size exceeding 2,048dalam pesan error di atas menunjukkan bahwa ukuran Response-Line lebih dari 2 KB. Oleh karena itu, Apigee Edge akan memunculkan pengecualian dan menampilkan kode status502dengan kode kesalahanprotocol.http.TooBiglineke aplikasi klien.
Resolusi
Memperbaiki ukuran
Opsi #1 [Direkomendasikan]: Perbaiki aplikasi server target/backend agar tidak mengirim Baris-Respons dengan ukuran yang lebih besar dari batas yang diizinkan
- Analisis alasan klien tertentu mengirimkan Response-Line berukuran lebih besar dari batas yang diizinkan sebagaimana ditentukan dalam Limits.
- Jika tidak diinginkan, ubah aplikasi server target/backend Anda sehingga mengirimkan Response-Line dengan ukuran kurang dari batas yang diizinkan.
- Jika diinginkan dan Anda ingin mengirimkan Baris Respons berukuran lebih dari batas yang diizinkan, lanjutkan ke opsi berikutnya.
CwC
Opsi #2: Menggunakan properti CwC untuk meningkatkan batas Baris Respons
Apigee menyediakan properti CwC yang memungkinkannya meningkatkan batas ukuran Response-Line. Untuk mengetahui detailnya, lihat Menetapkan batas Response-Line di Message Processor.
Batas
Apigee mengharapkan aplikasi klien dan server backend tidak mengirimkan Baris Permintaan/Respons yang ukurannya lebih besar dari batas yang diizinkan seperti yang didokumentasikan untuk Batas Baris Permintaan/Respons di Batas Apigee Edge.
- Jika Anda adalah pengguna Public Cloud, batas maksimum untuk ukuran Baris Permintaan dan Respons adalah seperti yang didokumentasikan untuk ukuran Baris Permintaan/Respons di Batas Apigee Edge.
- Jika Anda adalah pengguna Private Cloud, Anda mungkin telah mengubah batas maksimum default untuk ukuran Baris Permintaan dan Respons (meskipun bukan praktik yang direkomendasikan). Anda dapat menentukan batas ukuran Baris-Respons maksimum dengan mengikuti petunjuk di Cara memeriksa batas saat ini.
Bagaimana cara memeriksa batas saat ini?
Bagian ini menjelaskan cara memverifikasi bahwa properti HTTPResponse.line.limit telah diperbarui dengan nilai baru di Pemroses Pesan.
- Di mesin Message Processor, telusuri properti
HTTPResponse.line.limitdi direktori/opt/apigee/edge-message-processor/confdan periksa untuk melihat nilai yang telah ditetapkan seperti yang ditunjukkan di bawah:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- Contoh hasil dari perintah di atas adalah sebagai berikut:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
Dalam contoh output di atas, perhatikan bahwa properti
HTTPResponse.line.limittelah ditetapkan dengan nilai2kdihttp.properties.Hal ini menunjukkan bahwa batas ukuran Response-Line yang dikonfigurasi di Apigee untuk Private Cloud adalah 2 KB.
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Must gather diagnostic information.
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
- Perintah curl lengkap yang digunakan untuk memunculkan kembali 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 organisasi
- Nama lingkungan
- Paket Proxy API
- File rekaman aktivitas untuk permintaan API yang gagal
- Perintah
curllengkap yang digunakan untuk memunculkan kembali error502 Log akses NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logTempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Log sistem Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log