502 Gateway Buruk - ResponseWithBody

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 502 Bad Gateway dengan error kode protocol.http.ResponseWithBody sebagai respons untuk panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 502 Bad Gateway

Selain itu, Anda mungkin melihat salah satu pesan error berikut:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika respons HTTP dari server backend ke Apigee Edge 204 No Content atau 205 Reset Content tetapi berisi respons isi dan/atau satu atau beberapa header berikut:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

Sesuai dengan spesifikasi RFC 7231, bagian 6.3.5: 204 Tidak Ada Konten dan RFC 7231, bagian 6.3.6: 205 Reset Konten, diharapkan tidak ada konten tambahan harus dikirim sebagai bagian dari isi payload respons dengan kode status 204 No Content atau 205 Reset Content oleh server asal. Header respons seperti Content-Length, Content-Encoding, atau Transfer-Encoding menunjukkan ukuran, jenis, atau format payload respons.

Oleh karena itu, Apigee Edge menampilkan kode status 502 Bad Gateway dengan kode error protocol.http.ResponseWithBody ke klien di bawah situasi:

Kode status dari server backend
Respons dari server backend berisi 204 Tidak Ada Konten. 205 Reset Konten
Isi Respons ERROR ERROR

Header Content-Length

(disetel ke bukan nol)

ERROR ERROR

Content-Encoding

(disetel ke encoding yang didukung di Apigee Edge)

ERROR TIDAK ADA ERROR
Transfer-Encoding ERROR ERROR

Berikut adalah kemungkinan penyebab error ini:

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Isi respons atau Header dengan respons 204 dari server backend Server backend mengirim 204 No Content atau 205 Reset Content respons dengan isi respons dan/atau satu atau beberapa header Content-Type, Content-Encoding atau Transfer-Encoding. 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. Gambarkan Kode Kesalahan terhadap Waktu.
  6. Pilih sel yang memiliki kode kesalahan protocol.http.ResponseWithBody sebagai yang ditampilkan di bawah ini:

    ( lihat gambar yang lebih besar)

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

    ( lihat gambar yang lebih besar)

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

    ( lihat gambar yang lebih besar)

  9. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.ResponseWithBody.
  10. Jika Fault Source memiliki nilai target dan Fault Kode memiliki nilai protocol.http.ResponseWithBody, maka menunjukkan bahwa kesalahan terjadi karena server backend mengirim kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Bagian Kemungkinan penyebab.

Alat rekaman aktivitas

Untuk mendiagnosis error menggunakan alat Trace:

  1. Mengaktifkan sesi rekaman aktivitas dan:
    1. Tunggu hingga error 502 Bad Gateway terjadi. atau
    2. Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan rekonstruksi error 502 Bad Gateway.
  2. Pastikan Tampilkan semua FlowInfos diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
  4. Menavigasi melalui berbagai fase pelacakan dan menemukan letak kegagalan terjadi.
  5. Biasanya Anda akan menemukan error dalam Error flowinfo hanya setelah fase Permintaan dikirim ke server target seperti yang ditunjukkan di bawah ini:

    Skenario #1

    Skenario #1: Server Backend merespons dengan kode status 204 No Content yang berisi isi respons dan/atau salah satu header yang tercantum dalam Kemungkinan penyebab.

    Perhatikan nilai berikut dari rekaman aktivitas:

    • error: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    Skenario #2

    Skenario #2: Server Backend merespons dengan kode status 204 No Content yang berisi isi respons dan/atau salah satu header yang tercantum di Kemungkinan penyebab.

    Perhatikan nilai berikut dari rekaman aktivitas:

    • error: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. Buka fase AX (Data Analytics Direkam) di rekaman aktivitas lalu klik tombol tersebut.
  7. Scroll ke bawah ke bagian Detail Fase, Header Error, dan tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagaimana ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  8. Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source are protocol.http.ResponseWithBody dan target. Ini menunjukkan bahwa kesalahan terjadi karena server backend mengirim sebuah kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.
    Error Nilai
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

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 HTTP 502 Bad Gateway.
  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 ada 502 error dengan kode error protocol.http.ResponseWithBody selama durasi tertentu (jika masalah terjadi di masa lalu) atau jika ada permintaan yang masih gagal dengan 502.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code cocok dengan nilai protocol.http.ResponseWithBody, 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.ResponseWithBody
    X-Apigee-fault-source target
  5. Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source adalah protocol.http.ResponseWithBody dan target. Ini menunjukkan bahwa kesalahan terjadi karena server backend mengirim sebuah kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.

Penyebab: Isi respons atau Header dengan respons 204 dari server backend

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Log akses Monitoring, Trace, atau NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Kode Kesalahan adalah protocol.http.ResponseWithBody dan Sumber Kesalahan memiliki nilai target, maka ini menunjukkan bahwa backend server telah merespons dengan status 204 No Content atau 205 Reset Content kode dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.
  3. Untuk memvalidasi apakah server backend memang telah mengirim isi payload respons dan/atau satu atau lainnya yang disebutkan di Kemungkinan penyebab, Anda dapat lakukan langkah-langkah berikut:

    1. Jika Anda adalah pengguna Cloud Publik, dan jika Anda dapat membuat permintaan API yang sama ke server backend langsung dari salah satu sistem Anda.

    2. Jika Anda adalah pengguna Private Cloud, Anda dapat membuat permintaan API yang sama ke server backend langsung dari salah satu Pemroses Pesan yang terkait dengan organisasi dan lingkungan di mana kegagalan diamati.
    3. Tinjau respons yang diterima dari server backend dan verifikasi bahwa respons tersebut berisi isi payload respons dan/atau satu atau beberapa header yang disebutkan di atas. Jika ya, maka penyebab kesalahan ini.

      Contoh #1

      Contoh #1: Backend Server Response 204 dengan Content-Encoding Header

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Dalam contoh ini, server {i> backend <i}merespons dengan 204 No Content kode status dan Content-Encoding: gzip

      Contoh #2

      Contoh #2: Backend Server Response 204 dengan Content-Length Header

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Dalam contoh ini, server {i> backend <i}merespons dengan 204 No Content kode status dan Content-Length: 48

      Contoh #3

      Contoh #3: Respons Server Backend 205 dengan Isi Respons

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      Dalam contoh ini, server {i> backend <i}merespons dengan Kode status 205 Reset Content dengan isi respons This is a sample Response.

    4. Dalam semua contoh di atas, server backend mengirim 204 No Content atau Kode status 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.
    5. Oleh karena itu, Apigee Edge mengirimkan kode status 502 Bad Gateway dengan kode error protocol.http.ResponseWithBody.

Resolusi

Pastikan server backend selalu mematuhi Spesifikasi RFC 7231, bagian 6.3.6: 205 Reset Content, saat mengirim 204 No Content atau 205 Reset Content respons terhadap Apigee Edge. Artinya, server backend TIDAK BOLEH mengirim data berikut sebagai bagian dari 204 No Content atau Respons 205 Reset Content:

  1. Isi payload respons
  2. Dan salah satu header berikut:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Spesifikasi

Apigee Edge merespons dengan kode status 502 Bad Gateway dan kode error protocol.http.ResponseWithBody jika server backend mengirim 204 No Content atau 205 Reset Content respons, tetapi tidak mematuhi spesifikasi RFC berikut:

Spesifikasi
RFC 7231, bagian 6.3.5: 204 Tidak Ada Konten
RFC 7231, bagian 6.3.6: 205 Reset Konten

Poin penting yang perlu diperhatikan

Solusi yang direkomendasikan adalah memperbaiki server backend agar mengirim 204 No Content dan kode status 205 Reset Content tanpa isi respons dan salah satu header - Content-Length, Content-Encoding, dan Transfer-Encoding dan mematuhi spesifikasi RFC 7231, bagian 6.3.5: 204 Tidak Ada Konten dan RFC 7231, bagian 6.3.6: 205 Reset Konten.

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

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Nama lingkungan
  • Paket Proxy API
  • File rekaman aktivitas untuk permintaan API
  • 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