502 Gateway Buruk - TooBigBody

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 respons HTTP lebih besar dari batas yang diizinkan di Apigee Edge.

Berikut adalah kemungkinan penyebab error:

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Ukuran payload respons melebihi batas yang diizinkan Ukuran payload yang dikirim oleh server target/backend sebagai bagian dari respons HTTP ke Apigee adalah melebihi 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 HTTP respons terhadap Apigee lebih dari batas yang diizinkan jika 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:

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

  3. Buka Analyze > Pemantauan API > Investigasi.
  4. Pilih jangka waktu tertentu saat Anda melihat error.
  5. Anda dapat memilih filter Proxy untuk mempersempit kode kesalahan.
  6. Gambarkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan protocol.http.TooBigBody sebagai yang ditampilkan di bawah ini:

  8. Anda akan melihat informasi tentang kode kesalahan protocol.http.TooBigBody seperti yang ditunjukkan di bawah ini:

  9. Klik View logs, lalu luaskan baris untuk permintaan yang gagal.

  10. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.TooBigBody.
  11. Jika Sumber Kesalahan memiliki nilai target dan Kode Kesalahan memiliki nilai protocol.http.TooBigBody, maka itu menunjukkan bahwa permintaan respons dari server target/ backend memiliki ukuran payload respons lebih besar dari batas yang diizinkan di Apigee Edge.

Trace

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi rekaman aktivitas dan:
    • Tunggu hingga error 502 Bad Gateway terjadi, atau
    • Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan rekonstruksi 502 Bad Gateway error.
  2. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
  3. Menavigasi melalui berbagai fase pelacakan dan menemukan tempat terjadinya kegagalan.
  4. Buka fase Error tepat setelah Respons diterima dari target server seperti yang ditunjukkan di bawah ini:

    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 Prosesor Pesan) menampilkan error segera setelah server menerima respons dari server backend karena ukuran payload yang melebihi batas batas tersebut.

  5. Anda akan melihat kegagalan dalam fase Respons Dikirim ke Klien seperti yang ditunjukkan di bawah ini:

  6. Perhatikan nilai error dari rekaman aktivitas. Contoh rekaman aktivitas di atas menunjukkan:
    • error: 502 Bad Gateway
    • Konten Error: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. Buka fase Respons Diterima dari server target seperti yang ditunjukkan di bawah untuk berbagai skenario:

    Tidak terkompresi

    Skenario #1: Payload Respons yang dikirim dalam bentuk tidak terkompresi

    Perhatikan nilai error dari rekaman aktivitas:

    • Respons diterima dari server target: 200 OK
    • Durasi Konten (dari bagian Header Respons): ~11 MB

    Terkompresi

    Skenario #2: Meminta Payload yang 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 Header Respons perhatikan nilainya. Misalnya, dalam contoh ini nilainya adalah gzip.
  8. Catat Isi di bagian Konten Respons:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. Buka Fase AX (Data Analytics Dicatat) di trace, lalu klik Fase tersebut untuk melihat detail terkait.

  10. Scroll ke bawah di Detail Fase ke bagian Pembacaan Variabel, lalu tentukan nilai target.received.content.length yang menunjukkan:
    • Ukuran sebenarnya dari payload respons saat dikirim dalam format yang tidak terkompresi dan
    • Ukuran payload respons setelah dekompresi oleh Apigee, saat payload dikirim dalam format terkompresi. Ini akan selalu sama dengan nilai parameter yang diizinkan maksimum (10 MB) dalam skenario ini.

    Tidak terkompresi

    Skenario #1: Payload Respons yang dikirim dalam bentuk tidak terkompresi

    Perhatikan nilai target.received.content.length:

    Header permintaan Nilai
    target.received.content.length ~11 MB

    Terkompresi

    Skenario #2: Meminta Payload yang dikirim dalam bentuk terkompresi

    Perhatikan nilai target.received.content.length:

    Header Permintaan Nilai
    target.received.content.length ~10 MB
  11. Tabel berikut menjelaskan mengapa error 502 ditampilkan oleh Apigee dalam dua skenario berdasarkan nilai target.received.content.length:

    Skenario Nilai target.received.content.length Alasan kegagalan
    Payload Respons dalam format tidak terkompresi ~11 MB Ukuran > batas yang diizinkan sebesar 10 MB
    Payload Respons dalam format terkompresi ~10 MB

    Batas ukuran terlampaui setelah dekompresi

NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi penting tentang error 502 HTTP.
  2. 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 sebenarnya.

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

    Contoh error 502 dari log akses NGINX:

    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.TooBigBody
    X-Apigee-fault-source target

Penyebab: Ukuran Payload Respons lebih besar dari batas yang diizinkan

Diagnosis

  1. Tentukan Fault Code, Fault Source, dan Response Payload Size untuk error yang diamati menggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #1.
  2. Jika Fault Source memiliki nilai target, ini menunjukkan bahwa respons ukuran payload yang dikirim server target/backend ke Apigee lebih besar dari batas yang diizinkan di Apigee Edge.
  3. Periksa Respons Payload Size seperti yang ditentukan di langkah 1.
  4. Validasi bahwa ukuran payload respons memang > Batas maksimum 10 MB dengan memeriksa respons aktual menggunakan langkah-langkah berikut:
    1. Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, lalu buka Resolution.
    2. Jika Anda memiliki akses ke permintaan sebenarnya yang dilakukan ke server target/backend, maka lakukan langkah-langkah berikut:
      1. Jika Anda adalah pengguna Public Cloud/Private Cloud, buat permintaan langsung ke server backend dari server backend itu sendiri atau komputer lain dari tempat Anda diizinkan membuat permintaan ke server backend.
      2. Jika Anda adalah pengguna Private Cloud, Anda juga dapat membuat permintaan ke server backend dari salah satu Pemroses Pesan.
      3. Verifikasi ukuran payload yang diteruskan dalam respons dengan memeriksa Header Content-Length.
      4. Jika Anda menemukan bahwa ukuran payload lebih besar dari batas yang diizinkan di Apigee Edge, maka itulah penyebab masalah performa.

    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) yang merupakan 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 disetel ke gzip, Apigee mendekompresi respons payload. Selama proses dekompresi, jika Apigee mendapati ukuran payload lebih besar daripada batas yang diizinkan di Apigee Edge., maka akan berhenti lebih jauh dekompresi dan segera merespons kembali dengan 502 Bad Gateway dan kode error protocol.http.TooBigBody.

Diagnosis

  1. Tentukan Kode Kesalahan, Sumber Kesalahan, dan Ukuran Payload Respons untuk error yang diamati menggunakan log Pemantauan API, Alat Pelacak, atau Akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #2.
  2. Jika Fault Source memiliki nilai target, ini menunjukkan bahwa ukuran payload respons yang dikirim aplikasi target/backend ke Apigee lebih besar dari batas yang diizinkan di Apigee Edge.
  3. Periksa Respons Payload Size seperti yang ditentukan di langkah 1.
    • Jika ukuran payload > Batas 10 MB yang diizinkan, maka itulah penyebab error.
    • Jika ukuran {i>payload<i} ~ 10 MB merupakan batas yang diizinkan, maka ada kemungkinan bahwa payload respons diteruskan dalam format terkompresi. Dalam hal ini, periksa ukuran file yang tidak dikompresi payload respons.
  4. 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:

    Trace

    Menggunakan alat Trace:

    1. Jika Anda telah merekam pelacakan permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam Trace dan
      1. Tentukan nilai target.received.content.length
      2. Verifikasi apakah permintaan dari klien berisi Header Content-Encoding: gzip
    2. Jika nilai target.received.content.length sekitar 10 MB yang diizinkan dan header respons Content-Encoding: gzip, maka akan menjadi penyebab kesalahan ini.

    Permintaan sebenarnya

    Menggunakan permintaan yang sebenarnya:

    1. Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, lalu buka Resolution.
    2. Jika Anda memiliki akses ke permintaan sebenarnya yang dilakukan ke server target/backend, maka lakukan langkah-langkah berikut:
      1. Verifikasi ukuran payload yang diteruskan dalam respons beserta Header Content-Encoding yang dikirim dalam respons.
      2. Jika Anda mendapati bahwa header respons Content-Encoding disetel ke gzip dan ukuran payload yang tidak dikompresi lebih dari batas yang diizinkan di Apigee Edge, maka itulah penyebab {i>error<i} 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: gzip dikirim dan ukuran file testzippedfile.gz dalam respons kurang dari batasnya, namun ukuran file testzippedfile yang tidak dikompresi ~15 MB.

    Log Pemroses Pesan

    Menggunakan log Pemroses Pesan:

    1. Jika Anda pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk menentukan informasi penting tentang error 502 HTTP.
    2. Memeriksa log Pemroses Pesan

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 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 dengan 502. Anda dapat menggunakan string penelusuran berikut:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Anda akan menemukan baris dari system.log yang mirip seperti yang ditunjukkan di bawah ini (TotalRead dan chunkCount dapat 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)
      
    5. Selama proses dekompresi, segera setelah Pemroses Pesan menentukan total byte baca adalah > 10 MB, akan menghentikan dan mencetak baris berikut:

      Message is too large. TotalRead 10489856 chunkCount 2571

      Ini menyiratkan bahwa Response Payload Size lebih dari 10 MB dan Apigee menampilkan error saat ukuran mulai melebihi batas 10 MB dengan kode kesalahan sebagai protocol.http.TooBigBody

Resolusi

Perbaiki ukuran

Opsi #1 [Direkomendasikan]: Perbaiki aplikasi server target agar tidak mengirim ukuran payload yang melebihi batas Apigee

  1. Menganalisis alasan server target tertentu mengirim ukuran respons / payload melebihi batas yang diizinkan sebagaimana ditetapkan dalam Batas.
  2. Jika tidak diinginkan, modifikasi aplikasi server target Anda agar mengirim ukuran respons / payload kurang dari batas yang diizinkan.
  3. Jika Anda menginginkannya dan Anda ingin mengirimkan respons/payload lebih dari yang diizinkan membatasi, lanjutkan ke opsi berikutnya.

Pola URL yang ditandatangani

Opsi #2 [Direkomendasikan]: Gunakan pola URL yang ditandatangani dalam JavaInfo Apigee

Untuk payload yang lebih besar dari 10 MB, Apigee merekomendasikan penggunaan pola URL yang ditandatangani dalam Info Java Apigee, yang diilustrasikan oleh Edge Keterangan: Contoh Generator URL Bertanda Tangan di GitHub.

Streaming

Opsi no. 3: Gunakan Streaming

Jika proxy API perlu menangani permintaan dan/atau respons yang sangat besar, Anda dapat aktifkan streaming di Apigee.

CwC

Opsi #4: Gunakan properti CwC untuk meningkatkan batas buffer

Opsi ini harus digunakan hanya ketika Anda tidak dapat menggunakan opsi yang direkomendasikan sebagai mungkin ada masalah performa jika ukuran default diperbesar.

Apigee menyediakan CwC yang memungkinkannya meningkatkan ukuran payload permintaan dan respons batas tersebut. 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 lebih besar dari batas yang diizinkan seperti yang didokumentasikan untuk Request/response size di Batas Edge Apigee.

  1. Jika Anda adalah pengguna Cloud Publik, batas maksimum untuk permintaan dan respons ukuran payload seperti yang didokumentasikan untuk Request/response size di Batasan Edge Apigee.
  2. Jika Anda adalah pengguna Private Cloud , Anda mungkin telah mengubah ukuran maksimum default batas ukuran payload permintaan dan respons (meskipun bukan praktik yang direkomendasikan). 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 Pesan Prosesor.

  1. Di mesin Pemroses Pesan, telusuri properti HTTPResponse.body.buffer.limit di direktori /opt/apigee/edge-message- processor/conf dan periksa untuk melihat nilai yang telah ditetapkan seperti yang ditunjukkan di bawah ini:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. Contoh hasil dari perintah di atas adalah sebagai berikut:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. Pada contoh {i>output<i} di atas, perhatikan bahwa properti HTTPResponse.body.buffer.limit telah ditetapkan dengan nilai 10m di http.properties.

    Hal ini menunjukkan bahwa batas ukuran payload permintaan yang dikonfigurasi di Apigee untuk Private Cloud berukuran 10 MB.

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 error 502
  • File rekaman aktivitas untuk permintaan API
  • Lengkapi output 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 pelacakan untuk permintaan API yang gagal
  • Menyelesaikan perintah curl yang digunakan untuk mereproduksi error 502
  • Lengkapi output respons dari server target/backend beserta ukuran payload
  • 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