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

Berikut kemungkinan penyebab error:

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Ukuran payload respons melebihi batas yang diizinkan Ukuran payload yang dikirim oleh server target/backend sebagai bagian dari respons HTTP ke Apigee melebihi batas yang diizinkan di Apigee. Pengguna Edge Publik 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 terhadap Apigee melebihi batas yang diizinkan saat didekompresi oleh Apigee. 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:

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

  3. Buka halaman Analyze > API Monitoring > Menyelidiki.
  4. Pilih jangka waktu spesifik saat Anda melihat error.
  5. Anda dapat memilih filter Proxy untuk mempersempit kode kesalahan.
  6. Tempatkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan protocol.http.TooBigBody seperti yang ditunjukkan di bawah ini:

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

  9. Klik Lihat log dan luaskan baris untuk permintaan yang gagal.

  10. Dari jendela Log, perhatikan detail berikut:
    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.TooBigBody.
  11. Jika Fault Source memiliki nilai target dan Fault Code memiliki nilai protocol.http.TooBigBody, hal tersebut menunjukkan bahwa respons HTTP dari server target/ backend memiliki ukuran payload respons yang lebih besar daripada batas yang diizinkan di Apigee Edge.

Rekaman aktivitas

Untuk mendiagnosis error menggunakan alat Trace:

  1. 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.
  2. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  3. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  4. Buka fase Error tepat setelah fase Respons diterima dari server target, seperti yang ditunjukkan di bawah ini:

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

  5. Anda akan melihat kegagalan dalam fase Response Sent to Client seperti yang ditunjukkan di bawah ini:

  6. Catat 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 ini untuk berbagai skenario:

    Tidak terkompresi

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

    Catat nilai error dari rekaman aktivitas:

    • Respons yang diterima dari server target: 200 OK
    • Content-Length (dari bagian Header Respons): ~11 MB

    Terkompresi

    Skenario #2: Minta Payload yang dikirim dalam bentuk terkompresi

    Catat nilai error dari rekaman aktivitas:

    • Respons yang diterima dari server target: 200 OK
    • Content-Encoding: Jika Anda melihat header ini di bagian Header Respons, catat nilainya. Misalnya, dalam contoh ini nilainya adalah gzip.
  8. Perhatikan Body di bagian Response Content:

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

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

    Tidak terkompresi

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

    Perhatikan nilai target.received.content.length:

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

    Terkompresi

    Skenario #2: Minta 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 alasan error 502 ditampilkan oleh Apigee dalam dua skenario berdasarkan nilai target.received.content.length:

    Skenario Nilai target.acceptd.content.length Alasan kegagalan
    Payload Respons dalam format yang 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:

  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

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  3. Telusuri untuk mengetahui apakah ada Error 502 selama durasi tertentu (jika masalah terjadi sebelumnya) atau apakah ada permintaan yang masih gagal dengan 502.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code yang cocok dengan nilai protocol.http.TooBigBody, tentukan nilai dari X-Apigee-fault-source.

    Contoh error 502 dari log akses NGINX:

    Contoh entri dari log akses NGINX di atas 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 API Monitoring, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #1.
  2. Jika Sumber Kesalahan memiliki nilai target, ini menunjukkan bahwa ukuran payload respons yang dikirim oleh server target/backend ke Apigee lebih besar dari batas yang diizinkan di Apigee Edge.
  3. Verifikasi Response Payload Size seperti yang ditentukan dari langkah 1.
  4. Pastikan bahwa ukuran payload respons memang > 10 MB batas yang diizinkan dengan memeriksa respons sebenarnya menggunakan langkah-langkah berikut:
    1. Jika Anda tidak memiliki akses ke permintaan yang sebenarnya yang dibuat ke server target/backend, buka Resolution.
    2. Jika Anda memiliki akses ke permintaan aktual yang dibuat ke server target/backend, lakukan langkah-langkah berikut:
      1. Jika Anda adalah pengguna Cloud Publik/Cloud Pribadi, buat permintaan langsung ke server backend dari server backend itu sendiri atau perangkat lain tempat Anda diizinkan untuk 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 mendapati bahwa ukuran payload melebihi batas yang diizinkan di Apigee Edge, maka itulah yang menyebabkan masalah tersebut.

    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 melampaui batas yang diizinkan di Apigee Edge.

Resolusi

Baca bagian 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, payload respons akan didekompresi. Selama proses dekompresi, jika Apigee mendapati ukuran payload lebih besar dari batas yang diizinkan di Apigee Edge, Apigee akan menghentikan dekompresi lebih lanjut dan segera merespons kembali dengan 502 Bad Gateway dan kode error protocol.http.TooBigBody.

Diagnosis

  1. Tentukan Fault Code, Fault Source dan Response Payload size untuk error yang diamati menggunakan API Monitoring, Trace Tool, atau log NGINX Access 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 oleh aplikasi target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge.
  3. Verifikasi Response Payload Size seperti yang ditentukan dari langkah 1.
    • Jika ukuran payload > 10 MB batas yang diizinkan, berarti itulah penyebab error.
    • Jika ukuran payload mencapai batas yang diizinkan ~ 10 MB, kemungkinan payload respons akan diteruskan dalam format terkompresi. Dalam hal ini, periksa ukuran payload respons terkompresi yang belum dikompresi.
  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 berikut:

    Rekaman aktivitas

    Menggunakan alat Trace:

    1. Jika Anda telah merekam aktivitas untuk permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam Pelacakan 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 batas 10 MB yang diizinkan, dan header respons Content-Encoding: gzip, itulah penyebab error ini.

    Permintaan sebenarnya

    Menggunakan permintaan aktual:

    1. Jika Anda tidak memiliki akses ke permintaan yang sebenarnya yang dibuat ke server target/backend, buka Resolution.
    2. Jika Anda memiliki akses ke permintaan aktual yang dibuat ke server target/backend, lakukan langkah-langkah berikut:
      1. Verifikasi ukuran payload yang diteruskan dalam respons bersama dengan header Content-Encoding yang dikirim dalam respons.
      2. Jika Anda mendapati bahwa header respons Content-Encoding ditetapkan ke gzip dan ukuran payload yang tidak dikompresi melebihi batas yang diizinkan di Apigee Edge, maka itulah penyebab error.

        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, tetapi ukuran file testzippedfile yang tidak dikompresi adalah ~15 MB.

    Log Pemroses Pesan

    Menggunakan log Pemroses Pesan:

    1. Jika Anda adalah 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 melihat apakah ada error 502 selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan 502. Anda dapat menggunakan string pencarian berikut:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Anda akan menemukan baris dari system.log yang mirip dengan yang ditunjukkan di bawah ini (TotalRead dan chunkCount dapat bervariasi 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 > 10 MB, Pemroses Pesan akan berhenti 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 ukurannya mulai melebihi batas 10 MB dengan kode kesalahan sebagai protocol.http.TooBigBody

Resolusi

Ukuran tetap

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

  1. Analisis alasan server target tertentu mengirim ukuran respons / payload melebihi batas yang diizinkan, seperti yang dijelaskan dalam Batas.
  2. Jika tidak diinginkan, ubah aplikasi server target agar mengirimkan ukuran respons / payload kurang dari batas yang diizinkan.
  3. Jika diinginkan dan Anda ingin mengirim respons/payload lebih dari batas yang diizinkan, lanjutkan ke opsi berikutnya.

Pola URL bertanda tangan

Opsi #2 [Direkomendasikan]: Gunakan pola URL bertanda tangan dalam Apigee JavaCallout

Untuk payload yang lebih besar dari 10 MB, Apigee merekomendasikan penggunaan pola URL yang ditandatangani dalam Apigee JavaCallout, yang diilustrasikan dengan contoh Edge Callout: Signed URL Generator di GitHub.

Streaming

Opsi #3: Menggunakan Streaming

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

CwC

Opsi #4: Gunakan properti CwC untuk meningkatkan batas buffering

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 memungkinkannya meningkatkan batas ukuran payload permintaan dan respons. Untuk mengetahui detailnya, lihat Menetapkan batas ukuran pesan di Router atau Pemroses Pesan.

Batas

Apigee memperkirakan aplikasi klien dan server backend tidak akan mengirim ukuran payload yang lebih besar dari batas yang diizinkan seperti yang didokumentasikan untuk Request/response size dalam Apigee Edge Limits.

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

  1. Pada mesin Message Processor, telusuri properti HTTPResponse.body.buffer.limit dalam 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 output di atas, perhatikan bahwa properti HTTPResponse.body.buffer.limit telah ditetapkan dengan nilai 10m dalam http.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 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
  • 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 rekaman aktivitas untuk permintaan API yang gagal
  • Perintah curl lengkap 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

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message-processor/logs/system.log