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 melihat kemungkinan penyebab error ini, mari kita pahami arti Respons-Baris dan cara memeriksa ukurannya.
Memahami Baris Respons
Respons HTTP umumnya terdiri dari tiga bagian:
- Status-Line (Dirujuk sebagai Response-Line di Apigee)
- ( Kumpulan tajuk HTTP )
- [ Badan ]
Respons-Line terdiri dari tiga bagian: versi protokol yang diikuti dengan kode status numerik dan frasa tekstual terkait seperti yang ditunjukkan di bawah ini:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Jika respons HTTP dikirim oleh aplikasi server target/backend, baris pertama yang
dikirim merepresentasikan Response-Line seperti yang dijelaskan di atas. Hal ini diikuti oleh header dan isi/payload respons.Screenshot contoh berikut menunjukkan permintaan curl
standar, bagian Request, dan bagian Response (beserta Response-Line).
Memahami ukuran Baris Respons
Dalam contoh yang dibahas di atas, baris awal (baris pertama) dalam respons yang juga disebut sebagai Response-Line adalah sebagai berikut:
HTTP/1.1 200 OK
Baris Respons ini berukuran
~15 bytes
karena berisi15 ASCII characters
. Karena hal ini berada dalam batas yang diizinkan di Apigee Edge, respons akan dikirim kembali ke klien tanpa error apa pun oleh Apigee Edge.- Demikian pula, jika Anda melihat
faultstring
dalam 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 Baris Respons yang besar
Sesuai dengan definisi Status-Line (disebut Response-Line di sini) serta permintaan dan respons HTTP yang umum, ukurannya akan jauh lebih kecil daripada batas default yang ditentukan, yaitu 2 K di Apigee Edge, sehingga kita mungkin tidak mencapai batas. Namun, berikut ini beberapa kemungkinan skenario yang mungkin melebihi batas ini:
- Server target/backend bukan sistem HTTP. URL tersebut dapat merespons dengan respons non-HTTP.
- Server target/backend memiliki masalah dan mengirim Response-Line yang panjang sebagai bagian dari respons HTTP.
Baca selengkapnya tentang hal ini di Mendapatkan protokol error.http.TooBigLine, "ukuran baris respons melebihi 2.048.
Berikut kemungkinan penyebab error:
Penyebab | Deskripsi | Petunjuk pemecahan masalah yang berlaku untuk |
---|---|---|
Ukuran Respons-Line 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 dari batas yang diizinkan di Apigee Edge | 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:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Menyelidiki.
- Pilih jangka waktu spesifik saat Anda melihat error.
- Anda dapat memilih filter Proxy untuk mempersempit kode kesalahan.
- Tempatkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.TooBigLine
seperti yang ditunjukkan di bawah ini:Anda akan melihat informasi tentang kode kesalahan
protocol.http.TooBigLine
seperti yang ditunjukkan di bawah:Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
- Dari jendela Logs, perhatikan detail berikut:
- Kode Status:
502
- Sumber Kesalahan:
target
- Kode Kesalahan:
protocol.http.TooBigLine
.
- Kode Status:
- Jika Fault Source memiliki nilai
target
dan Fault Code memiliki nilaiprotocol.http.TooBigLine
, hal tersebut menunjukkan bahwa respons HTTP dari server target/ backend memiliki ukuran Response-Line yang lebih besar dari batas maksimum yang diizinkan di Apigee Edge.
Alat pelacak
- Aktifkan sesi perekaman aktivitas
dan:
- Tunggu hingga error
502 Bad Gateway
terjadi. atau - Jika Anda dapat merekonstruksi masalah, buat panggilan API dan rekonstruksi error
502 Bad Gateway
.
- Tunggu hingga error
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
Biasanya Anda akan menemukan error dalam Error
flowinfo
tepat setelah fase Permintaan dikirim ke server target seperti yang ditunjukkan di bawah ini:Catat 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) menampilkan error segera setelah menerima respons dari server backend karena ukuran Baris Respons melebihi batas yang diizinkan.
- error:
Anda akan melihat pesan error yang dikirim ke klien dalam fase Response Sent to Client seperti yang ditunjukkan di bawah ini:
- Catat nilai error dari trace:
- 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 (Analytics Data Recorded) di trace dan mengkliknya untuk melihat detail error.
( lihat gambar yang lebih besar)
Perhatikan nilai berikut:
Header permintaan Nilai X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
Konten 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
502
HTTP. 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.
- Telusuri untuk melihat apakah ada error
502
selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan502
. Jika Anda menemukan error
502
dengan X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.TooBigLine
, tentukan nilai dari X-Apigee-fault-source.Contoh entri 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.TooBigLine
X-Apigee-fault-source target
Penyebab: Ukuran Baris Respons lebih besar dari batas yang diizinkan
Diagnosis
- Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Fault Source memiliki nilai
target
, 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 Respons-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"
faultstring
di atas menunjukkan bahwa ukuran Respons-Line melampaui batas yang diizinkan, yaitu 2 KB.Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan yang sebenarnya:
Jika Anda memiliki akses ke permintaan aktual yang dibuat ke aplikasi server target/backend, lakukan langkah-langkah berikut:
- Memverifikasi ukuran Response-Line
- Jika Anda menemukan bahwa ukuran URI melebihi
batas yang diizinkan di Apigee Edge, maka itulah yang menyebabkan
masalah tersebut.
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,
HTTP/1.1 200 1111…<trimmed>...11111111
Response-Line lebih besar dari 2 KB, yaitu berisi lebih dari 2 karakter K ASCII.Jika menggunakan beberapa klien lain, Anda dapat meninjau log klien dan mencoba mengetahui ukuran Response-Line yang dikirim ke Apigee Edge.
Log Pemroses Pesan
Untuk memvalidasi menggunakan log Pemroses Pesan:
Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk memvalidasi apakah ukuran Baris Respons telah melampaui batas yang diizinkan di Apigee Edge.
- Tentukan ID pesan dari permintaan yang gagal menggunakan Pemantauan API, Alat Pelacakan, 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.log
Anda akan menemukan baris dari
system.log
yang 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,048
pada pesan error di atas menunjukkan bahwa ukuran Respons-Line lebih dari 2 KB. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status502
dengan kode kesalahanprotocol.http.TooBigline
ke aplikasi klien.
Resolusi
Ukuran tetap
Opsi #1 [Direkomendasikan]: Memperbaiki aplikasi server target/backend agar tidak mengirim Respons-Line yang berukuran lebih besar dari batas yang diizinkan
- Analisis alasan klien tertentu mengirim Baris Respons yang ukurannya melebihi batas yang diizinkan seperti yang ditentukan dalam Batas.
- Jika tidak diinginkan, ubah aplikasi server target/backend Anda agar mengirimkan Respons-Line dengan ukuran kurang dari batas yang diizinkan.
- Jika diinginkan dan Anda ingin mengirim Baris Respons yang ukurannya melebihi batas yang diizinkan, buka opsi berikutnya.
CwC
Opsi no. 2: Gunakan properti CwC untuk meningkatkan batas Baris Respons
Apigee menyediakan properti CwC yang memungkinkannya meningkatkan batas ukuran Response-Line. Untuk mengetahui detailnya, lihat Menetapkan batas Baris Respons di Pemroses Pesan.
Batas
Apigee memperkirakan aplikasi klien dan server backend tidak akan mengirim Request/Response-Lines yang ukurannya melebihi batas yang diizinkan seperti yang didokumentasikan untuk Request/Response Line Limit dalam Apigee Edge Limits.
- Jika Anda adalah pengguna Cloud Publik, batas maksimum untuk ukuran Baris Permintaan dan Respons adalah seperti yang didokumentasikan untuk ukuran Permintaan/Respons-Line di Batas Apigee Edge.
- Jika Anda adalah pengguna Private Cloud, Anda mungkin telah mengubah batas maksimum default untuk ukuran Permintaan dan Baris Respons (meskipun bukan praktik yang direkomendasikan). Anda dapat menentukan batas ukuran Respons-Line 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.
- Pada mesin Message Processor, telusuri properti
HTTPResponse.line.limit
dalam direktori/opt/apigee/edge-message-processor/conf
, lalu periksa untuk melihat nilai apa 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
Pada contoh output di atas, perhatikan bahwa properti
HTTPResponse.line.limit
telah ditetapkan dengan nilai2k
dihttp.properties
.Hal ini menunjukkan bahwa batas ukuran Respons-Line yang dikonfigurasi di Apigee untuk Private Cloud adalah 2 KB.
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
- Perintah curl lengkap 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 organisasi
- Nama lingkungan
- Paket Proxy API
- File rekaman aktivitas untuk permintaan API yang gagal
- Selesaikan perintah
curl
yang digunakan untuk mereproduksi error502
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