502 Gateway Buruk - TooBigLine

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.TooBigLine 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":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika ukuran Response-Line yang dikirim oleh server target/backend ke Apigee Edge sebagai bagian dari respons HTTP lebih besar dari jumlah maksimum yang diizinkan batas di Apigee Edge.

Sebelum melihat kemungkinan penyebab error ini, mari kita pahami apa yang dimaksud dengan dan cara memeriksa ukurannya.

Memahami Baris Respons

Respons HTTP biasa terdiri dari tiga bagian:

  1. Status-Line (Disebut sebagai Response-Line di Apigee)
  2. ( Kumpulan header HTTP )
  3. [ Isi ]

Baris Respons terdiri dari tiga bagian: versi protokol yang diikuti oleh kolom numerik kode status dan frasa teks yang terkait seperti ditunjukkan di bawah ini:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Ketika respons HTTP dikirimkan oleh aplikasi server target/backend, baris pertama yang terkirim mewakili Baris-Respons seperti yang dijelaskan di atas. Langkah ini diikuti oleh dan isi respons/payload.Tangkapan layar contoh berikut menunjukkan contoh Permintaan curl, bagian Request, dan bagian Response (beserta Baris Respons).

Memahami ukuran Baris Respons

  1. Dalam contoh yang dibahas di atas, baris awal (baris pertama) dalam respons juga yang disebut sebagai Response-Line adalah sebagai berikut:

    HTTP/1.1 200 OK
    

    Baris Respons ini berukuran ~15 bytes karena berisi 15 ASCII characters. Karena lokasi ini berada dalam batas yang diizinkan di Apigee Edge, respons akan dikirim kembali ke klien tanpa error oleh Apigee Edge.

  2. Demikian pula, jika Anda melihat faultstring di Pesan error yang ditampilkan di atas, berisi "response line size exceeding 2,048". Ini menunjukkan bahwa Response-Line di respons HTTP yang dikirim oleh server target/backend melebihi 2.048 byte.

Memahami Baris Respons besar

Sesuai dengan definisi Status-Line (disebut sebagai Response-Line di sini) serta permintaan HTTP umum dan , ukurannya akan jauh lebih kecil dari batas default yang ditentukan sebesar 2 K di Apigee Edge, jadi kita mungkin tidak mencapai batas. Namun, berikut beberapa kemungkinan skenario yang mengharuskan Anda melebihi batas ini:

  1. Server target/backend bukanlah sistem HTTP. Aplikasi dapat merespons dengan non-HTTP yang dihasilkan.
  2. Server target/backend memiliki masalah dan mengirim Response-Line yang panjang sebagai bagian dari permintaan yang dihasilkan.

Baca selengkapnya tentang hal ini di Mendapatkan error protocol.http.TooBigLine, "ukuran baris respons melebihi 2.048.

Berikut adalah kemungkinan penyebab error:

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Ukuran Baris Respons lebih besar dari batas yang diizinkan Ukuran Response-Line yang dikirim oleh server target/backend sebagai bagian dari Respons HTTP terhadap Apigee Edge lebih besar daripada batas yang diizinkan di Apigee Edge 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.TooBigLine sebagai yang ditampilkan di bawah ini:

    ( lihat gambar yang lebih besar)

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

    ( lihat gambar yang lebih besar)

  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.TooBigLine.
  11. Jika Fault Source memiliki nilai target dan Fault Kode memiliki nilai protocol.http.TooBigLine, yang menunjukkan bahwa respons HTTP dari server target/ backend memiliki ukuran Baris-Respons lebih besar dari batas maksimum yang diizinkan di Apigee Edge.

Alat rekaman aktivitas

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

    Perhatikan nilai error dari rekaman aktivitas:

    • error: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Hal ini menunjukkan bahwa Apigee Edge (komponen Pemroses Pesan) menampilkan error sebagai segera setelah menerima respons dari server backend karena ukuran Response-Line melampaui batas yang diizinkan.

  5. Anda akan melihat pesan {i>error<i} yang dikirim ke klien di bagian Respons Dikirim ke Klien seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  6. Perhatikan nilai error dari rekaman aktivitas:
    • Error: 502 Bad Gateway.
    • Konten Error: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Anda juga dapat membuka fase AX (Data Analytics Dicatat) dalam trace lalu klik untuk melihat detail error.

    ( lihat gambar yang lebih besar)

    Perhatikan nilai berikut:

    Header permintaan Nilai
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Konten Error : Isi {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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 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.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code yang cocok dengan nilai protocol.http.TooBigLine, lalu tentukan nilai X-Apigee-fault-source.

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

Penyebab: Ukuran baris-Tanggapan lebih besar dari batas yang diizinkan

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Log akses Monitoring, alat Trace, atau NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Source memiliki nilai target, ini menunjukkan bahwa Ukuran Baris Respons yang dikirim oleh aplikasi server target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge.
  3. Anda dapat memvalidasi bahwa ukuran Baris Respons telah melebihi batas 2 KB yang diizinkan menggunakan satu dari metode berikut:

    Pesan error

    Untuk memvalidasi menggunakan pesan error:

    Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat faultstring.

    Contoh pesan error:

    "faultstring":"response line size exceeding 2,048"
    

    faultstring di atas menunjukkan bahwa ukuran Baris Respons melampaui batas yang diizinkan maksimum 2 KB.

    Permintaan sebenarnya

    Untuk memvalidasi menggunakan permintaan yang sebenarnya:

    Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend aplikasi, lalu lakukan langkah-langkah berikut:

    1. Memverifikasi ukuran Baris Respons
    2. Jika Anda menemukan bahwa ukuran URI lebih dari batas yang diizinkan di Apigee Edge, maka itulah penyebab menyelesaikan masalah.

      Contoh respons dari server target/backend:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      Dalam kasus di atas, Baris Respons HTTP/1.1 200 1111…<trimmed>...11111111 lebih besar dari 2 KB, artinya berisi lebih dari 2 karakter ASCII.

      Jika Anda menggunakan beberapa klien lain, Anda dapat meninjau log klien dan mencoba untuk mengetahui ukuran Response-Line yang dikirim ke Apigee Edge.

    Log Pemroses Pesan

    Untuk memvalidasi menggunakan log Pemroses Pesan:

    Jika Anda pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk memvalidasi jika ukuran Baris Respons telah melampaui batas yang diizinkan di Apigee Edge.

    1. Tentukan ID pesan dari permintaan yang gagal menggunakan Pemantauan API, Alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
    2. Telusuri ID pesan di log Pemroses Pesan:

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

    3. Anda akan menemukan baris dari system.log yang mirip dengan berikut ini:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      Teks message = response line size exceeding 2,048 di atas menunjukkan bahwa ukuran Baris Respons lebih dari 2 KB. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status 502 dengan kode kesalahan protocol.http.TooBigline ke aplikasi klien.

Resolusi

Perbaiki ukuran

Opsi #1 [Direkomendasikan]: Memperbaiki aplikasi server target/backend yang tidak mengirim Ukuran baris Respons lebih besar dari batas yang diizinkan

  1. Menganalisis alasan klien tertentu untuk lebih banyak mengirim Baris Respons dari batas yang diizinkan seperti yang ditetapkan dalam Batas.
  2. Jika tidak diinginkan, ubah aplikasi server target/backend Anda sehingga mengirimkan Baris Respons yang berukuran kurang dari batas yang diizinkan.
  3. Jika itu kita inginkan dan Anda ingin mengirim baris-Tanggapan berukuran lebih besar dari batas yang diizinkan, lanjutkan ke opsi berikutnya.

CwC

Opsi #2: Gunakan properti CwC untuk meningkatkan batas Baris Respons

Apigee menyediakan CwC yang memungkinkannya meningkatkan batas ukuran Baris Respons. Untuk mengetahui detailnya, lihat Menetapkan batas Baris Respons di Pemroses Pesan.

Batas

Apigee mengharapkan aplikasi klien dan server backend tidak mengirimkan Request/Response-Lines yang ukurannya lebih besar dari batas yang diizinkan seperti yang didokumentasikan untuk Batas Baris Permintaan/Respons di Apigee Edge Limits.

  1. Jika Anda adalah pengguna Cloud Publik, batas maksimum untuk Permintaan dan Ukuran Baris Respons seperti yang didokumentasikan untuk ukuran Permintaan/Baris Respons di Batas Apigee Edge.
  2. Jika Anda adalah pengguna Private Cloud , Anda mungkin telah mengubah ukuran maksimum default batas untuk ukuran Baris Respons dan Permintaan (meskipun bukan praktik yang direkomendasikan). Anda dapat menentukan batas ukuran Baris Respons maksimum dengan mengikuti petunjuk di Cara memeriksa batas saat ini.

Bagaimana cara memeriksa batas saat ini?

Bagian ini menjelaskan cara memverifikasi bahwa properti HTTPResponse.line.limit memiliki telah diperbarui dengan nilai baru di {i>Message Processors<i}.

  1. Di mesin Pemroses Pesan, telusuri properti HTTPResponse.line.limit dalam /opt/apigee/edge-message-processor/conf dan periksa lihat nilai yang telah ditetapkan seperti yang ditunjukkan di bawah ini:
    grep -ri "HTTPResponse.line.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.line.limit=2k
    
  3. Pada contoh output di atas, perhatikan bahwa properti HTTPResponse.line.limit telah ditetapkan dengan nilai 2k dalam http.properties.

    Hal ini menunjukkan bahwa batas ukuran Baris Respons yang dikonfigurasi di Apigee untuk Pribadi Cloud sebesar 2 KB.

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 organisasi
  • Nama lingkungan
  • Paket Proxy API
  • File pelacakan untuk permintaan API yang gagal
  • Menyelesaikan perintah curl yang digunakan untuk mereproduksi error 502
  • 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