Waktu tunggu gateway 504 - Waktu router habis

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

Gejala

Aplikasi klien menerima kode status HTTP 504 dengan pesan Gateway Timeout sebagai respons terhadap panggilan API.

Respons error ini menunjukkan bahwa klien tidak menerima respons tepat waktu dari Apigee Edge atau server backend selama eksekusi panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 504 Gateway Time-out

Saat memanggil proxy tersebut menggunakan cURL atau browser web, Anda mungkin mendapatkan error berikut:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

Apa yang menyebabkan waktu tunggu?

Jalur umum untuk permintaan API melalui platform Edge adalah Client > {i>Router<i} > Kirim pesan Prosesor > Server Backend seperti yang ditunjukkan pada gambar berikut:

Semua komponen dalam alur runtime Apigee Edge termasuk klien, Router, Pesan Prosesor dan server backend disiapkan dengan nilai waktu tunggu {i>default<i} yang sesuai untuk memastikan permintaan API tidak memerlukan waktu terlalu lama untuk diselesaikan. Jika ada komponen dalam tidak mendapatkan respons dari komponen upstream dalam jangka waktu yang ditentukan di konfigurasi waktu tunggu habis, maka komponen tertentu akan kehabisan waktu tunggu dan biasanya akan mengembalikan 504 Gateway Timeout.

Playbook ini menjelaskan cara memecahkan dan menyelesaikan error 504 yang terjadi saat Waktu Router habis.

Waktu Tunggu di Router

Waktu tunggu default yang dikonfigurasi pada Router di Apigee Edge adalah 57 detik. Ini adalah jumlah maksimum waktu yang dapat dieksekusi proxy API sejak permintaan API diterima di Edge hingga respons akan dikirim kembali, termasuk respons backend dan semua kebijakan yang dijalankan. Waktu tunggu default dapat diganti di Router/host virtual seperti yang dijelaskan dalam Mengonfigurasi waktu tunggu I/O di Router.

Kemungkinan penyebab

Di Edge, penyebab umum untuk error 504 Gateway Timeout yang disebabkan oleh Waktu habis router adalah:

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Konfigurasi waktu tunggu di Router salah Hal ini terjadi jika Router dikonfigurasi dengan periode waktu tunggu I/O yang salah. Pengguna Edge Public dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

  • Pemantauan API
  • Log akses NGINX

Pemantauan API

Untuk mendiagnosis error menggunakan Pemantauan API:

  1. Buka Analyze > Pemantauan API > Investigasi.
  2. Filter error 5xx dan pilih jangka waktu.
  3. Tempatkan Kode Status terhadap Waktu.
  4. Klik sel tertentu yang menampilkan error 504 untuk melihat detail dan tampilan selengkapnya tentang error ini, seperti yang ditunjukkan di bawah ini:

    Contoh yang menampilkan Error 504

  5. Di panel sebelah kanan, klik View logs.

    Dari jendela Log Traffic, perhatikan detail berikut untuk beberapa error 504:

    • Permintaan: Fungsi ini menyediakan metode permintaan dan URI yang digunakan untuk melakukan panggilan
    • Waktu Respons: Metrik ini memberikan total waktu yang berlalu untuk permintaan.

    Pada contoh di atas,

    • Permintaan mengarah ke GET /test-timeout.
    • Waktu Respons adalah 57.001 detik. Hal ini menunjukkan bahwa {i>Router<i} telah habis waktu sebelum Pemroses Pesan dapat merespons kembali karena nilainya sangat mendekati ke waktu tunggu I/O default yang disetel pada Router, yaitu 57 detik.

    Anda juga bisa mendapatkan semua log dengan menggunakan API Monitoring API GET logs. Misalnya, dengan membuat kueri log untuk org, env, timeRange, dan status, Anda dapat mendownload semua log untuk transaksi yang waktu klien habis.

    Karena Pemantauan API menetapkan proxy ke - (not set) untuk 504 ini Anda dapat menggunakan API (Logs API) guna mendapatkan proxy terkait untuk host dan jalur virtual.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. Tinjau Waktu Respons untuk mengetahui error 504 tambahan, lalu periksa untuk melihat apakah Waktu Respons konsisten (nilai waktu tunggu I/O yang ditetapkan di Router yaitu 57 detik) di semua error 504.

Log akses NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Periksa log akses NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Telusuri apakah ada Error 504 selama durasi tertentu atau tidak (jika masalah terjadi di masa lalu) atau jika ada permintaan yang masih gagal dengan 504.
  3. Perhatikan informasi berikut untuk beberapa error 504:
    • Waktu Respons
    • URI Permintaan

    Dalam contoh ini, kita melihat informasi berikut:

    • Waktu Permintaan: 57.001 detik. Hal ini menunjukkan bahwa Waktu router habis setelah 57.001 detik.

    • Permintaan: GET /test-timeout
    • Alias Host: myorg-test.apigee.net
  4. Periksa untuk melihat apakah Waktu Permintaan sama dengan waktu tunggu I/O dikonfigurasikan pada {i>Router<i}/{i>host<i} virtual. Jika ya, maka itu berarti waktu Router habis sebelum Pemroses Pesan tidak merespons dalam periode ini.

    Dalam contoh entri Log Akses NGINX yang ditampilkan di atas, Permintaan Waktu 57.001 detik sangat mendekati waktu tunggu I/O default yang disetel di {i>Router<i}. Ini jelas menunjukkan bahwa waktu Router habis sebelum Pesan Prosesor dapat merespons kembali.

  5. Menentukan Proxy API yang digunakan untuk membuat permintaan dengan menggunakan jalur dasar di Request .

Penyebab: Konfigurasi waktu tunggu salah pada Router

Diagnosis

  1. Tentukan apakah error 504 disebabkan karena Waktu Router telah habis sebelum Pemroses Pesan dapat membalasnya. Anda dapat melakukannya dengan memeriksa apakah Waktu Respons di Pemantauan API/Waktu Permintaan di Router (kedua kolom merepresentasikan informasi yang sama,tetapi dipanggil dengan nama yang berbeda) sama dengan Waktu tunggu I/O yang dikonfigurasi di Router/host virtual dan kolom Fault Source, Fault Proxy dan Kode Kesalahan ditetapkan ke - menggunakan Pemantauan API atau Akses NGINX log seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Periksa untuk melihat apakah nilai waktu tunggu I/O yang dikonfigurasi pada Router atau host virtual tertentu lebih rendah dibandingkan dengan yang dikonfigurasi pada Pemroses Pesan atau Proxy API tertentu.

    Anda dapat melakukannya dengan mengikuti langkah-langkah di bagian ini.

Memverifikasi waktu tunggu I/O pada host virtual

UI Edge

Untuk memverifikasi waktu tunggu host virtual menggunakan UI Edge, lakukan hal berikut:

  1. Login ke UI Edge.
  2. Buka Admin > Host Virtual.
  3. Pilih Lingkungan tertentu tempat Anda mengalami masalah waktu tunggu.
  4. Pilih host virtual spesifik yang ingin Anda verifikasi nilai waktu tunggu I/O-nya.
  5. Di bagian Properti, lihat nilai Waktu Tunggu Baca Proxy dalam detik.

    Dalam contoh di atas, Waktu Tunggu Baca Proxy dikonfigurasi dengan nilai 120. Artinya, waktu tunggu I/O yang dikonfigurasi pada host virtual ini adalah 120 detik.

API pengelolaan

Anda juga dapat memverifikasi Proxy Read Timeout menggunakan API pengelolaan berikut:

  1. Jalankan Dapatkan virtual host API untuk mendapatkan konfigurasi virtualhost seperti yang ditunjukkan di bawah ini:

    Pengguna Cloud Publik

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Pengguna Private Cloud

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Dengan keterangan:

    ORGANIZATION_NAME adalah nama organisasi

    ENVIRONMENT_NAME adalah nama lingkungan

    VIRTUALHOST_NAME adalah nama virtual host

  2. Periksa nilai yang dikonfigurasi untuk properti proxy_read_timeout

    Contoh Definisi Host Virtual

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }
    

    Pada contoh di atas, proxy_read_timeout dikonfigurasi dengan nilai 120. Ini berarti bahwa waktu tunggu I/O yang dikonfigurasi pada {i>host<i} virtual ini adalah 120 detik.

Memverifikasi waktu tunggu I/O pada file router.properties

  1. Login ke mesin Router.
  2. Telusuri properti proxy_read_timeout di /opt/nginx/conf.d dan periksa apakah direktori tersebut telah disetel dengan nilai baru sebagai berikut:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Periksa nilai yang ditetapkan untuk properti proxy_read_timeout di virtual spesifik file konfigurasi {i>host<i}.

    Contoh hasil dari perintah grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
    

    Pada contoh output di atas, perhatikan bahwa properti proxy_read_timeout memiliki telah ditetapkan dengan nilai baru 57 di 0-default.conf yang merupakan untuk {i>host<i} virtual {i>default<i}. Hal ini menunjukkan bahwa waktu waktu I/O habis dikonfigurasikan ke 57 detik di Router untuk host virtual default. Jika Anda memiliki beberapa {i>host<i} virtual, Anda akan melihat informasi ini untuk masing-masing {i>host<i}. Dapatkan nilai proxy_read_timeout untuk host virtual khusus yang Anda gunakan untuk membuat API panggilan yang gagal dengan 504 error.

Memverifikasi waktu tunggu I/O di proxy API

Anda dapat melihat waktu tunggu I/O di bawah ini:

  • Endpoint target proxy API
  • Kebijakan ServiceInfo proxy API
Lihat waktu tunggu I/O di endpoint target proxy API
  1. Pada UI Edge, pilih proxy API tertentu tempat Anda ingin melihat I/O nilai waktu tunggu.
  2. Pilih endpoint target spesifik yang ingin Anda periksa.
  3. Lihat properti io.timeout.millis dengan nilai yang sesuai di bagian Elemen <HTTPTargetConnection> di TargetEndpoint konfigurasi Anda.

    Misalnya, waktu tunggu I/O dalam kode berikut disetel ke 120 detik:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
Lihat waktu tunggu I/O di kebijakan Service callout dari proxy API
  1. Pada UI Edge, pilih proxy API tertentu tempat Anda ingin melihat I/O baru nilai waktu tunggu untuk kebijakan Servicecallout.
  2. Pilih kebijakan ServiceInfo tertentu yang ingin Anda periksa.
  3. Lihat elemen <Timeout> dengan nilai yang sesuai di bagian Konfigurasi <ServiceCallout>.

    Misalnya, waktu tunggu I/O dari kode berikut adalah 120 detik:

    <Timeout>120000</Timeout>
    

Memverifikasi waktu tunggu I/O pada Pemroses Pesan

  1. Masuk ke komputer Pemroses Pesan.
  2. Telusuri properti HTTPTransport.io.timeout.millis di Direktori /opt/apigee/edge-message-processor/conf menggunakan perintah berikut:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    Contoh output

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
    
  3. Pada contoh {i>output<i} di atas, perhatikan bahwa properti HTTPTransport.io.timeout.millis telah ditetapkan dengan nilai 55000 di http.properties. Hal ini menunjukkan bahwa waktu tunggu I/O berhasil dikonfigurasi untuk 55 detik pada Pemroses Pesan.

Setelah menentukan waktu tunggu yang dikonfigurasi pada Router dan Pemroses Pesan, verifikasi {i>Router<i}/{i>host<i} virtual telah dikonfigurasi dengan nilai waktu tunggu yang lebih rendah dibandingkan dengan yang ada di Proxy API/Pemroses Pesan.

Catat nilai yang ditetapkan pada semua lapisan seperti yang ditunjukkan pada tabel di bawah ini:

Waktu tunggu pada Router (detik) Waktu tunggu pada host virtual (detik) Waktu tunggu pada Pemroses Pesan (detik) Waktu tunggu pada proxy API (detik)
57 - 55 120

Dalam contoh ini,

  • Nilai default 57 detik dikonfigurasi di Router.
  • Nilai waktu tunggu tidak disetel pada host virtual tertentu. Artinya, kode tersebut akan menggunakan dengan nilai default 57 detik yang dikonfigurasi di {i>Router<i} itu sendiri.
  • Di Pemroses Pesan, nilai default 55 detik dikonfigurasi.
  • Namun, pada Proxy API tertentu, nilai 120 detik dikonfigurasi.

Perhatikan bahwa nilai waktu tunggu yang lebih tinggi hanya dikonfigurasi pada proxy API, tetapi Router tetap dikonfigurasi dengan 57 detik. Oleh karena itu, {i>Router<i} akan kehabisan waktu pada 57 detik saat pesan Pemroses/backend masih memproses permintaan Anda. Hal ini menyebabkan {i>Router<i} merespons kembali dengan 504 Gateway Timeout error pada aplikasi klien.

Resolusi

Lakukan langkah-langkah berikut untuk mengonfigurasi waktu tunggu I/O yang tepat di Router dan Pesan Pemroses untuk mengatasi masalah ini.

  1. Rujuk ke Praktik terbaik untuk mengonfigurasi waktu tunggu I/O guna memahami nilai waktu tunggu harus ditetapkan pada berbagai komponen yang terlibat dalam alur permintaan API melalui Apigee Edge.
  2. Dalam contoh di atas, jika Anda memastikan bahwa nilai waktu tunggu yang lebih tinggi perlu disetel karena server backend memerlukan waktu yang lebih lama, dan Anda telah nilai {i>Message Processor<i} ke 120 detik, lalu tetapkan nilai waktu tunggu yang lebih tinggi contoh: 123 seconds di Router. Agar tidak memengaruhi semua Proxy API karena nilai waktu tunggu yang baru, tetapkan nilai 123 seconds hanya pada host virtual spesifik yang digunakan di Proxy API tertentu.
  3. Ikuti petunjuk di Mengonfigurasi waktu tunggu I/O di Router untuk menyetel waktu tunggu di host virtual.