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.TooBigBody 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":"Body buffer overflow",
"detail":{
"errorcode":"protocol.http.TooBigBody"
}
}
}Kemungkinan penyebab
Error ini terjadi jika ukuran payload yang dikirim oleh server target/backend ke Apigee Edge sebagai bagian dari respons HTTP lebih besar daripada batas yang diizinkan di Apigee Edge.
Berikut kemungkinan penyebab error:
| Penyebab | Deskripsi | Petunjuk pemecahan masalah yang berlaku untuk |
|---|---|---|
| Ukuran payload respons lebih besar dari batas yang diizinkan | Ukuran payload yang dikirim oleh server target/backend sebagai bagian dari respons HTTP ke Apigee lebih besar daripada batas yang diizinkan di Apigee. | Pengguna Edge Public dan Private Cloud |
| Ukuran payload respons melebihi batas yang diizinkan setelah dekompresi | Ukuran payload yang dikirim dalam format terkompresi oleh server target/backend sebagai bagian dari respons HTTP ke Apigee lebih besar daripada batas yang diizinkan saat didekompresi oleh Apigee. | 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.TooBigBodyseperti ditunjukkan di bawah:
Anda akan melihat informasi tentang kode kesalahan
protocol.http.TooBigBodyseperti yang ditunjukkan di bawah:
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.TooBigBody.
- Kode Status:
- Jika Fault Source memiliki nilai
targetdan Fault Code memiliki nilaiprotocol.http.TooBigBody, maka hal ini menunjukkan bahwa respons HTTP dari target/ server backend memiliki ukuran payload respons yang lebih besar daripada batas yang diizinkan di Apigee Edge.
Trace
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi rekaman aktivitas dan salah satu opsi berikut:
- 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.
Buka fase Error tepat setelah fase Response received from target server seperti yang ditunjukkan di bawah:
Perhatikan nilai error dari rekaman aktivitas:
- error:
Body buffer overflow - 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 payload melebihi batas yang diizinkan.
- error:
Anda akan melihat kegagalan pada fase Response Sent to Client seperti yang ditunjukkan di bawah:
- Perhatikan nilai error dari rekaman aktivitas. Rekaman aktivitas contoh di atas menunjukkan:
- error:
502 Bad Gateway - Konten Error:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- error:
Buka fase Response Received from target server seperti yang ditunjukkan di bawah untuk berbagai skenario:
Tidak terkompresi
Skenario #1: Payload Respons dikirim dalam bentuk tidak dikompresi
Perhatikan nilai error dari rekaman aktivitas:
- Respons diterima dari server target:
200 OK - Content-Length (dari bagian Response Headers): ~11 MB
Terkompresi
Skenario #2: Payload Permintaan dikirim dalam bentuk terkompresi
Perhatikan nilai error dari rekaman aktivitas:
- Respons diterima dari server target:
200 OK - Content-Encoding: Jika Anda melihat header ini di bagian Response Headers, catat nilainya. Misalnya, dalam contoh ini, nilainya adalah
gzip.
- Respons diterima dari server target:
Perhatikan Body di bagian Response Content:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}Buka Fase AX (Data Analytics Direkam) dalam rekaman aktivitas, lalu klik untuk melihat detail terkait.
- Scroll ke bawah di Detail Fase ke bagian Variabel yang Dibaca dan tentukan
nilai
target.received.content.lengthyang menunjukkan:- Ukuran sebenarnya payload respons saat dikirim dalam format yang tidak dikompresi dan
- Ukuran payload respons setelah didekompresi oleh Apigee, saat payload dikirim dalam format terkompresi. Nilainya akan selalu sama dengan nilai batas yang diizinkan (10 MB) dalam skenario ini.
Tidak terkompresi
Skenario #1: Payload Respons dikirim dalam bentuk tidak dikompresi
Perhatikan nilai target.received.content.length:
Header permintaan Nilai target.received.content.length ~11 MB Terkompresi
Skenario #2: Payload Permintaan dikirim dalam bentuk terkompresi
Perhatikan nilai target.received.content.length:
Header Permintaan Nilai target.received.content.length ~10 MB Tabel berikut menjelaskan alasan error
502ditampilkan oleh Apigee dalam dua skenario berdasarkan nilai target.received.content.length:Skenario Nilai target.received.content.length Alasan kegagalan Payload Respons dalam format tidak dikompresi ~11 MB Ukuran > batas yang diizinkan sebesar 10 MB Payload Respons dalam format terkompresi ~10 MB Batas ukuran terlampaui saat dekompresi
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_log
Keterangan: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Cari untuk melihat apakah ada
502Error selama 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.TooBigBody, tentukan nilai X-Apigee-fault-source.Contoh error 502 dari log akses NGINX:
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.TooBigBodyX-Apigee-fault-source target
Penyebab: Ukuran Payload Respons lebih besar dari batas yang diizinkan
Diagnosis
- Tentukan Fault Code, Fault Source, dan Response Payload Size untuk error yang diamati menggunakan Pemantauan API, alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #1.
- Jika Sumber Kesalahan memiliki nilai
target, hal ini menunjukkan bahwa ukuran payload respons yang dikirim oleh server target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge. - Verifikasi Ukuran Payload Respons sebagaimana ditentukan dari langkah 1.
- Jika ukuran payload > batas yang diizinkan 10 MB, maka itulah penyebab error.
- Jika ukuran payload ~ batas yang diizinkan 10 MB, kemungkinan payload respons diteruskan dalam format terkompresi. Buka Penyebab: Ukuran payload respons melebihi batas yang diizinkan setelah dekompresi.
- Validasi bahwa ukuran payload respons memang > batas yang diizinkan 10 MB dengan memeriksa
respons sebenarnya menggunakan langkah-langkah berikut:
- Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, maka buka Penyelesaian.
- Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, maka
lakukan langkah-langkah berikut:
- Jika Anda adalah pengguna Cloud Publik/Cloud Pribadi, buat permintaan langsung ke server backend dari server backend itu sendiri atau mesin lain tempat Anda diizinkan untuk membuat permintaan ke server backend.
- Jika Anda adalah pengguna Private Cloud, Anda juga dapat membuat permintaan ke server backend dari salah satu Pemroses Pesan.
- Verifikasi ukuran payload yang diteruskan dalam respons dengan memeriksa header Content-Length.
- Jika Anda menemukan bahwa ukuran payload lebih besar dari batas yang diizinkan di Apigee Edge, maka itulah penyebab masalahnya.
Contoh Respons dari server backend:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
Dalam contoh di atas, Anda dapat melihat bahwa
Content-Length: 11534336 (which is ~11 MB)adalah penyebab error ini karena melebihi batas yang diizinkan di Apigee Edge.
Resolusi
Lihat Resolusi.
Penyebab: Ukuran Payload Respons melebihi batas yang diizinkan setelah dekompresi
Jika payload respons dikirim dalam format terkompresi dan header respons
Content-Encoding ditetapkan ke gzip, , Apigee akan mendekompresi payload
respons. Selama proses dekompresi, jika Apigee menemukan ukuran payload lebih besar
daripada batas yang diizinkan di Apigee Edge, maka dekompresi lebih lanjut akan dihentikan dan respons akan segera dikirim kembali
dengan 502 Bad Gateway dan kode error protocol.http.TooBigBody.
Diagnosis
- Tentukan Fault Code, Fault Source, dan Response Payload size untuk error yang diamati menggunakan Pemantauan API, Alat Pelacakan, atau log Akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #2.
- Jika Fault Source memiliki nilai
target, maka hal ini menunjukkan bahwa ukuran payload respons yang dikirim oleh aplikasi target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge. - Verifikasi Ukuran Payload Respons sebagaimana ditentukan dari langkah 1.
- Jika ukuran payload > batas yang diizinkan 10 MB, maka itulah penyebab error.
- Jika ukuran payload ~ batas yang diizinkan 10 MB, kemungkinan payload respons diteruskan dalam format terkompresi. Dalam hal ini, periksa ukuran yang tidak dikompresi dari payload respons yang dikompresi.
- Anda dapat memvalidasi apakah respons dari target/backend dikirim dalam format terkompresi dan
ukuran yang tidak dikompresi lebih besar dari batas yang diizinkan menggunakan salah satu
metode berikut:
Trace
Menggunakan alat Trace:
- Jika Anda telah merekam aktivitas permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam
Trace dan
- Tentukan nilai target.received.content.length
- Verifikasi apakah permintaan dari klien berisi header
Content-Encoding:
gzip
- Jika nilai target.received.content.length berkisar pada batas 10 MB yang diizinkan, dan header respons Content-Encoding:
gzip, maka itulah penyebab error ini.
Permintaan sebenarnya
Menggunakan permintaan sebenarnya:
- Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, lalu buka Penyelesaian.
- Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, maka
lakukan langkah-langkah berikut:
- Verifikasi ukuran payload yang diteruskan dalam respons beserta header
Content-Encodingyang dikirim dalam respons. - Jika Anda menemukan bahwa header respons
Content-Encodingdisetel kegzipdan ukuran payload yang tidak dikompresi lebih besar dari batas yang diizinkan di Apigee Edge, maka itulah penyebab error ini.Contoh respons yang diterima dari server backend:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
Dalam kasus di atas, header
Content-Encoding: gzipdikirim dan ukuran filetestzippedfile.gzdalam respons kurang dari batas, tetapi ukuran file yang tidak dikompresitestzippedfileadalah ~15 MB.
- Verifikasi ukuran payload yang diteruskan dalam respons beserta header
Log Message Processor
Menggunakan log Message Processor:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Message Processor untuk
menentukan informasi utama tentang error HTTP
502. Periksa log Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.logCari untuk melihat apakah ada error
502selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan502. Anda dapat menggunakan string penelusuran berikut:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Anda akan menemukan baris dari
system.logyang serupa dengan yang ditunjukkan di bawah (TotalReaddanchunkCountmungkin berbeda dalam kasus Anda):2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
Selama proses dekompresi, segera setelah Message Processor menentukan bahwa total byte yang dibaca adalah > 10 MB, proses akan berhenti dan mencetak baris berikut:
Message is too large. TotalRead 10489856 chunkCount 2571Hal ini menunjukkan bahwa Ukuran Payload Respons lebih dari 10 MB dan Apigee menampilkan error saat ukuran mulai melebihi batas 10 MB dengan kode error sebagai
protocol.http.TooBigBody
- Jika Anda telah merekam aktivitas permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam
Trace dan
Resolusi
Memperbaiki ukuran
Opsi #1 [Direkomendasikan]: Perbaiki aplikasi server target agar tidak mengirim ukuran payload yang melebihi batas Apigee
- Analisis alasan server target tertentu mengirim ukuran respons / payload lebih dari batas yang diizinkan seperti yang ditentukan dalam Limits.
- Jika tidak diinginkan, ubah aplikasi server target Anda sehingga mengirimkan ukuran respons / payload yang kurang dari batas yang diizinkan.
- Jika diinginkan dan Anda ingin mengirim respons/payload lebih dari batas yang diizinkan, buka opsi berikutnya.
Pola URL bertanda tangan
Opsi #2 [Direkomendasikan]: Menggunakan pola URL bertanda tangan dalam Apigee JavaCallout
Untuk payload yang lebih besar dari 10 MB, Apigee merekomendasikan penggunaan pola URL bertanda tangan dalam JavaCallout Apigee, yang diilustrasikan oleh contoh Edge Callout: Signed URL Generator di GitHub.
Streaming
Opsi #3: Menggunakan Streaming
Jika proxy API Anda perlu menangani permintaan dan/atau respons yang sangat besar, Anda dapat mengaktifkan streaming di Apigee.
CwC
Opsi #4: Menggunakan properti CwC untuk meningkatkan batas buffer
Opsi ini hanya boleh digunakan jika Anda tidak dapat menggunakan opsi yang direkomendasikan karena mungkin ada masalah performa jika ukuran default ditingkatkan.
Apigee menyediakan properti CwC yang memungkinkan peningkatan batas ukuran payload permintaan dan respons. Untuk mengetahui detailnya, lihat Menetapkan batas ukuran pesan di Router atau Pemroses Pesan.
Batas
Apigee mengharapkan aplikasi klien dan server backend tidak mengirim ukuran payload yang lebih besar dari
batas yang diizinkan seperti yang didokumentasikan untuk
Request/response size di
Batas Apigee Edge.
- Jika Anda adalah pengguna Public Cloud, batas maksimum untuk ukuran payload permintaan dan respons adalah seperti yang didokumentasikan untuk
Request/response sizedi Batas Apigee Edge. - Jika Anda adalah pengguna Private Cloud, Anda mungkin telah mengubah batas maksimum default untuk ukuran payload permintaan dan respons (meskipun tidak disarankan). Anda dapat menentukan batas ukuran payload permintaan maksimum dengan mengikuti petunjuk di Cara memeriksa batas saat ini.
Bagaimana cara memeriksa batas saat ini?
Bagian ini menjelaskan cara memverifikasi bahwa properti
HTTPResponse.body.buffer.limit telah diperbarui dengan nilai baru di Pemroses
Pesan.
Di komputer Message Processor, telusuri properti
HTTPResponse.body.buffer.limitdi direktori/opt/apigee/edge-message- processor/confdan periksa nilai yang telah ditetapkan seperti yang ditunjukkan di bawah:grep -ri "HTTPResponse.body.buffer.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.body.buffer.limit=10m
Dalam contoh output di atas, perhatikan bahwa properti
HTTPResponse.body.buffer.limittelah ditetapkan dengan nilai10mdihttp.properties.Hal ini menunjukkan bahwa batas ukuran payload permintaan yang dikonfigurasi di Apigee untuk Private Cloud adalah 10 MB.
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka 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 memunculkan kembali error
502 - File rekaman aktivitas untuk permintaan API
- Output lengkap respons dari server target/backend beserta ukuran payload
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 curl lengkap yang digunakan untuk memunculkan kembali error
502 - Output lengkap respons dari server target/backend beserta ukuran payload
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