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 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:

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

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

  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 Logs, catat 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, 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:

  1. 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.
  2. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  3. Telusuri berbagai fase rekaman aktivitas dan temukan tempat terjadinya kegagalan.
  4. 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.

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

  6. 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"}}}
  7. 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.
  8. Perhatikan Body di bagian Response Content:

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

  10. Scroll ke bawah di Detail Fase ke bagian Variabel yang Dibaca dan tentukan nilai target.received.content.length yang 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
  11. Tabel berikut menjelaskan alasan 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 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 utama tentang error HTTP 502.
  2. 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.

  3. Cari untuk melihat apakah ada 502 Error selama durasi tertentu (jika masalah terjadi di masa lalu) 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 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.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 Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #1.
  2. 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.
  3. Verifikasi Ukuran Payload Respons sebagaimana ditentukan dari langkah 1.
  4. Validasi bahwa ukuran payload respons memang > batas yang diizinkan 10 MB dengan memeriksa respons sebenarnya menggunakan langkah-langkah berikut:
    1. Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, maka buka Penyelesaian.
    2. Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, maka 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 mesin 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 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

  1. 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.
  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.
  3. 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.
  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:

    Trace

    Menggunakan alat Trace:

    1. Jika Anda telah merekam aktivitas 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 berkisar pada batas 10 MB yang diizinkan, dan header respons Content-Encoding: gzip, maka itulah penyebab error ini.

    Permintaan sebenarnya

    Menggunakan permintaan sebenarnya:

    1. Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend, lalu buka Penyelesaian.
    2. Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat 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 menemukan bahwa header respons Content-Encoding disetel ke gzip dan 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: gzip dikirim dan ukuran file testzippedfile.gz dalam respons kurang dari batas, tetapi ukuran file yang tidak dikompresi testzippedfile adalah ~15 MB.

    Log Message Processor

    Menggunakan log Message Processor:

    1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Message Processor untuk menentukan informasi utama tentang error HTTP 502.
    2. Periksa log Message Processor

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

    3. Cari 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 penelusuran berikut:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Anda akan menemukan baris dari system.log yang serupa dengan yang ditunjukkan di bawah (TotalRead dan chunkCount mungkin 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 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 2571

      Hal 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

Resolusi

Memperbaiki ukuran

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

  1. Analisis alasan server target tertentu mengirim ukuran respons / payload lebih dari batas yang diizinkan seperti yang ditentukan dalam Limits.
  2. Jika tidak diinginkan, ubah aplikasi server target Anda sehingga mengirimkan ukuran respons / payload yang kurang dari batas yang diizinkan.
  3. 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.

  1. Jika Anda adalah pengguna Public Cloud, batas maksimum untuk ukuran payload permintaan dan respons adalah seperti yang didokumentasikan untuk Request/response size di Batas Apigee Edge.
  2. 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.

  1. Di komputer Message Processor, telusuri properti HTTPResponse.body.buffer.limit di direktori /opt/apigee/edge-message- processor/conf dan periksa nilai yang telah ditetapkan seperti yang ditunjukkan di bawah:

    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. Dalam contoh output 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 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_log

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

  • Log sistem Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log