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 kode error 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 adalah 204 No Content atau 205 Reset Content, tetapi berisi isi respons dan/atau satu atau beberapa header berikut:

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

Sesuai dengan spesifikasi RFC 7231, bagian 6.3.5: 204 No Content dan RFC 7231, pasal 6.3.6: 205 Reset Content, diharapkan tidak ada konten tambahan yang 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 dalam keadaan berikut:

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

Content-Length header

(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 kemungkinan penyebab error ini:

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

    ( lihat gambar yang lebih besar)

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

    ( lihat gambar yang lebih besar)

  8. Klik Lihat log dan 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 Sumber Kesalahan memiliki nilai target dan Kode Kesalahan memiliki nilai protocol.http.ResponseWithBody, hal tersebut menunjukkan bahwa error terjadi karena server backend mengirim kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan di bagian Kemungkinan penyebab.

Alat pelacak

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi perekaman aktivitas dan:
    1. Tunggu hingga error 502 Bad Gateway terjadi. atau
    2. Jika Anda dapat merekonstruksi masalah, buat panggilan API dan rekonstruksi error 502 Bad Gateway.
  2. Pastikan Show all FlowInfos diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  4. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  5. Biasanya Anda akan menemukan error dalam Error flowinfo tepat 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 dalam 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 Dicatat) dalam rekaman aktivitas tersebut, lalu klik.
  7. Scroll ke bawah ke bagian Phase Details, Error Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang 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. Hal ini menunjukkan bahwa error tersebut terjadi karena server backend mengirim kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan di 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 kunci tentang HTTP 502 Bad Gateway.
  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 melihat apakah ada error 502 dengan kode error protocol.http.ResponseWithBody 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.ResponseWithBody, 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. Hal ini menunjukkan bahwa error tersebut terjadi karena server backend mengirim kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan di 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 Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan di Langkah-langkah diagnosis umum.
  2. Jika Fault Code adalah protocol.http.ResponseWithBody dan Fault Source memiliki nilai target, ini menunjukkan bahwa server backend telah merespons dengan kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.
  3. Untuk memvalidasi apakah server backend telah benar-benar mengirim isi payload respons dan/atau satu atau beberapa header yang disebutkan dalam Kemungkinan penyebab, Anda dapat melakukan langkah-langkah berikut:

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

    2. Jika Anda adalah pengguna Private Cloud, Anda dapat membuat permintaan API yang sama ke server backend secara langsung dari salah satu Pemroses Pesan yang terkait dengan organisasi dan lingkungan tertentu tempat kegagalan terjadi.
    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 itulah penyebab error ini.

      Contoh #1

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

      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 backend merespons dengan kode status 204 No Content dan Content-Encoding: gzip

      Contoh #2

      Contoh #2: Respons Server Backend 204 dengan Header Panjang Konten

      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 backend merespons dengan kode status 204 No Content 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 backend merespons dengan kode status 205 Reset Content dengan isi respons This is a sample Response.

    4. Dalam semua contoh di atas, server backend mengirim kode status 204 No Content atau 205 Reset Content dengan isi respons dan/atau salah satu header yang disebutkan dalam Kemungkinan penyebab.
    5. Oleh karena itu, Apigee Edge mengirim 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 respons 204 No Content atau 205 Reset Content ke Apigee Edge. Artinya, server backend TIDAK BOLEH mengirim hal berikut sebagai bagian dari respons 204 No Content atau 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 mengirimkan respons 204 No Content atau 205 Reset Content, 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-poin penting yang perlu diperhatikan

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

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
  • Selesaikan 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

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

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