502 Bad Gateway - Respons 405 tanpa Izinkan Header

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.Response405WithoutAllowHeader 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":"Received 405 Response without Allow Header",
      "detail":{
         "errorcode":"protocol.http.Response405WithoutAllowHeader"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika server backend merespons dengan kode status 405 Method Not Allowed tanpa header Allow.

Sesuai dengan spesifikasi RFC 7231, bagian 6.5.5: 405 Method Not Allowed, server asal HARUS membuat dan mengirim kolom header Allow dalam respons 405 yang berisi daftar metode resource target yang saat ini didukung. Jika tidak, Apigee akan merespons dengan 502 Bad Gateway dan kode error protocol.http.Response405WithoutAllowHeader.

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Respons 405 tanpa Izinkan header dari server backend Server backend yang memproses permintaan API merespons dengan kode status 405 tanpa header Allow. 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 Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.

    daftar drop-down org
  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.Response405WithoutAllowHeader seperti yang ditunjukkan di bawah ini:

  7. Informasi tentang kode kesalahan protocol.http.Response405WithoutAllowHeader ditampilkan seperti yang ditunjukkan di bawah ini:

  8. Klik Lihat log dan luaskan salah satu permintaan yang gagal untuk melihat informasi lebih lanjut.

  9. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.Response405WithoutAllowHeader.
  10. Jika Fault Source adalah target dan Fault Code adalah protocol.http.Response405WithoutAllowHeader, hal ini menunjukkan bahwa server backend merespons dengan kode status 405 Method Not Allowed tanpa header Allow.

Alat pelacak

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 untuk mereproduksi masalah - 502 Bad Gateway error
  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. Anda akan menemukan error biasanya dalam alur setelah fase Permintaan dikirim ke server target seperti yang ditunjukkan di bawah ini:

  6. Catat nilai error dari rekaman aktivitas.

    Rekaman aktivitas contoh di atas menampilkan error sebagai Received 405 Response without Allow Header. Karena error dipicu oleh Apigee setelah permintaan dikirim ke server backend, hal ini menunjukkan bahwa server backend mengirim kode status respons 405 tanpa header Allow.

  7. Buka Fase AX (Data Analytics Dicatat) di trace, lalu klik Fase tersebut.
  8. Scroll ke bawah ke bagian Error / Response Headers di panel Phase Details, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:

  9. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source masing-masing protocol.http.Response405WithoutAllowHeader dan target, yang menunjukkan bahwa error ini disebabkan karena backend mengirim kode status respons 405 tanpa header Allow.
    Header Respons Nilai
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    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 error 502 HTTP.
  2. Periksa log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
    

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

  3. Telusuri untuk melihat apakah ada error 502 dengan kode error protocol.http.Response405WithoutAllowHeader 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.Response405WithoutAllowHeader, 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.Response405WithoutAllowHeader
    X-Apigee-fault-source target

Penyebab: Respons 405 tanpa header Allow dari server backend

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk 502 Bad Gateway menggunakan Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Code adalah protocol.http.Response405WithoutAllowHeader dan Fault Source memiliki nilai target, hal ini menunjukkan bahwa server backend telah merespons dengan kode status 405 tanpa header Allow. Oleh karena itu, Apigee merespons kembali dengan 502 Bad Gateway dengan kode error protocol.http.Response405WithoutAllowHeader.

Resolusi

Gunakan salah satu metode berikut untuk menyelesaikan masalah:

Server backend

Opsi #1: Memperbaiki Server Backend untuk mengirim kode status 405 dengan header Allow:

  1. Pastikan server backend selalu mematuhi spesifikasi RFC 7231, bagian 6.5.5: 405 Method Not Allowed dan mengirim dengan kode status 405 dengan menyertakan daftar metode yang diizinkan sebagai bagian dari header Allow seperti ditunjukkan di bawah ini:

    Allow: HTTP_METHODS
    
  2. Misalnya, jika server backend Anda mengizinkan metode GET, POST, dan HEAD, Anda harus memastikan bahwa header Allow berisi metode berikut:
    Allow: GET, POST, HEAD
    

Penanganan fault

Opsi #2: Gunakan Fault Handling untuk mengirim kode status 405 dengan header Allow dari proxy API Anda:

Jika server backend menampilkan kode status 405 tanpa header Allow, Anda dapat menggunakan fault handle untuk merespons kembali dengan kode status 405 dan header Allow dari proxy API Anda sebagai berikut:

  1. Buat kebijakan seperti kebijakanAssignMessage atau kebijakan RaiseFault, dan tetapkan kode status ke 405 dengan header Allow dan pesan kustom.

    Contoh kebijakan TetapkanMessage untuk mengirim 405 dengan header Allow:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader">
        <DisplayName>AM-405WithAllowHeader</DisplayName>
        <Set>
            <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>Method Not Allowed</ReasonPhrase>
        </Set>
        <Add>
            <Headers>
                <Header name="Allow">GET, POST, HEAD</Header>
            </Headers>
        </Add>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    
  2. Buat FaultRule di TargetEndpoint, yang memanggil kebijakan setelah mendapatkan error 502 dengan kode error protocol.http.Response405WithoutAllowHeader.

    Contoh konfigurasi TargetEndpoint yang menampilkan FaultRule:

    <TargetEndpoint name="default">
    ...
        <FaultRules>
           <FaultRule name="405WithoutAllowHeader">
                <Step>
                    <Name>AM-405WithAllowHeader</Name>
                </Step>
                <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition>
            </FaultRule>
        </FaultRules>
    
  3. Simpan perubahan ini dalam revisi baru proxy API Anda, lalu deploy revisi tersebut.
  4. Lakukan panggilan API dan pastikan Anda mendapatkan kode status 405 dengan header Allow.

Konfigurasi properti

Opsi #3: Mengonfigurasi properti di Pemroses Pesan untuk mencegah Apigee Edge menampilkan error 502

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat memperbarui properti HTTP.ignore.allow_header.for.405 menjadi true agar Apigee Edge tidak memunculkan error 502, meskipun server backend merespons dengan kode status 405 tanpa header Allow menggunakan panduan Cara kerja: MengonfigurasiIgnore allow header untuk properti 405 di Message Processors.
  2. Jika Anda adalah pengguna Cloud Publik, hubungi Dukungan Apigee Edge

Spesifikasi

Apigee mengharapkan respons 405 Method Not Allowed dari server backend bersama dengan header Allow sesuai spesifikasi berikut:

Spesifikasi
RFC 7231, bagian 6.5.5: 405 Metode Tidak Diizinkan
RFC 7231, bagian 7.4.1: Izinkan

Poin-poin penting yang perlu diperhatikan

Solusi yang direkomendasikan adalah memperbaiki server backend agar mengirim kode status 405 dengan header Allow dan mematuhi spesifikasi RFC 7231, bagian 6.5.5: 405 Method Not Allowed.

Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, 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 502 Bad Gateway dengan kode error protocol.http.Response405WithoutAllowHeader
  • 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~ORG.PORT#_access_log
    

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

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

Referensi

Penanganan error di Apigee