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 yang 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 habis?

Jalur umum untuk permintaan API melalui platform Edge adalah Client > Router > Message Processor > Backend Server seperti yang ditunjukkan pada gambar berikut:

Semua komponen dalam alur runtime Apigee Edge, termasuk klien, Router, Prosesor Pesan, dan server backend disiapkan dengan nilai waktu tunggu default yang sesuai untuk memastikan bahwa permintaan API tidak membutuhkan waktu yang terlalu lama untuk diselesaikan. Jika salah satu komponen dalam alur tidak mendapatkan respons dari komponen upstream dalam jangka waktu yang ditentukan dalam konfigurasi waktu tunggu, komponen tertentu akan habis waktu tunggunya dan biasanya akan menampilkan error 504 Gateway Timeout.

Playbook ini menjelaskan cara memecahkan masalah dan mengatasi error 504 yang disebabkan saat waktu Router habis.

Waktu tunggu di Router

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

Kemungkinan penyebab

Di Edge, penyebab umum error 504 Gateway Timeout yang disebabkan karena waktu tunggu Router habis adalah:

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
Konfigurasi waktu tunggu salah pada Router Hal ini terjadi jika {i>Router<i} dikonfigurasi dengan periode waktu tunggu I/O yang salah. Pengguna Edge Publik 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 API Monitoring:

  1. Buka halaman Analyze > API Monitoring > Menyelidiki.
  2. Filter untuk 5xx error dan pilih jangka waktu.
  3. Tandai Kode Status terhadap Waktu.
  4. Klik sel tertentu yang menunjukkan error 504 untuk melihat detail selengkapnya dan melihat log tentang error ini seperti yang ditunjukkan di bawah:

    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: Bagian ini menyediakan metode permintaan dan URI yang digunakan untuk melakukan panggilan
    • Respons Waktu: Jenis ini memberikan total waktu yang berlalu untuk permintaan.

    Pada contoh di atas,

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

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

    Karena Pemantauan API menetapkan proxy ke - (not set) untuk error 504 ini, Anda dapat menggunakan API (Logs API) untuk 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 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 untuk melihat apakah ada Error 504 selama durasi tertentu (jika masalah terjadi sebelumnya) atau apakah 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 yang dikonfigurasi pada Router/host virtual. Jika ya, berarti waktu Router habis sebelum Pemroses Pesan tidak merespons dalam periode ini.

    Dalam contoh entri Log Akses NGINX yang ditampilkan di atas, Waktu Permintaan 57.001 detik sangat mendekati waktu tunggu I/O default yang ditetapkan pada Router. Hal ini secara jelas menunjukkan bahwa waktu Router habis sebelum Prosesor Pesan dapat merespons kembali.

  5. Tentukan Proxy API yang permintaannya dibuat menggunakan jalur dasar di kolom Permintaan .

Penyebab: Konfigurasi waktu tunggu yang salah pada Router

Diagnosis

  1. Tentukan apakah error 504 disebabkan karena Router telah habis waktu sebelum Pemroses Pesan dapat merespons kembali. Anda dapat melakukannya dengan memeriksa untuk melihat apakah Response Time di Pemantauan API/Request Time di Router (kedua kolom mewakili informasi yang sama, tetapi dipanggil dengan nama berbeda) sama dengan waktu tunggu I/O yang dikonfigurasi di Router/host virtual dan kolom Fault Source, Fault Proxy, dan Fault Code disetel ke - menggunakan API Pemantauan API atau langkah diagnosis NGINX di Akses NGINX.
  2. Periksa 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 Edge UI, lakukan hal berikut:

  1. Login ke UI Edge.
  2. Buka Admin > Virtual Hosts.
  3. Pilih Lingkungan tertentu tempat Anda mengalami masalah waktu tunggu.
  4. Pilih host virtual tertentu yang ingin Anda verifikasi nilai waktu tunggu I/O-nya.
  5. Di bagian Properties, lihat nilai Proxy Read Timeout 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 Waktu Tunggu Baca Proxy menggunakan API pengelolaan berikut:

  1. Jalankan Get 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 lingkungannya

    VIRTUALHOST_NAME adalah nama host virtual

  2. Periksa nilai yang dikonfigurasi untuk properti proxy_read_timeout

    Contoh Definisi Virtual Host

    {
      "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. Artinya, waktu tunggu I/O yang dikonfigurasi pada host 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 dalam direktori /opt/nginx/conf.d dan periksa apakah properti tersebut telah ditetapkan dengan nilai baru seperti berikut:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Periksa nilai yang ditetapkan untuk properti proxy_read_timeout di file konfigurasi host virtual tertentu.

    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 telah ditetapkan dengan nilai baru 57 di 0-default.conf yang merupakan file konfigurasi untuk host virtual default. Hal ini menunjukkan bahwa waktu tunggu I/O dikonfigurasi ke 57 detik pada Router untuk host virtual default. Jika memiliki beberapa host virtual, Anda akan melihat informasi ini untuk setiap host virtual. Dapatkan nilai proxy_read_timeout untuk host virtual tertentu yang Anda gunakan untuk melakukan panggilan API yang gagal dengan error 504.

Memverifikasi waktu tunggu I/O di proxy API

Anda dapat melihat waktu tunggu I/O di berikut:

  • Endpoint target proxy API
  • Kebijakan ServiceCallout proxy API
Melihat waktu tunggu I/O di endpoint target proxy API
  1. Di UI Edge, pilih proxy API tertentu tempat Anda ingin melihat nilai waktu tunggu I/O.
  2. Pilih endpoint target tertentu yang ingin diperiksa.
  3. Lihat properti io.timeout.millis dengan nilai yang sesuai di bagian elemen <HTTPTargetConnection> dalam konfigurasi TargetEndpoint.

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

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

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

    <Timeout>120000</Timeout>
    

Memverifikasi waktu tunggu I/O pada Pemroses Pesan

  1. Masuk ke mesin 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 output di atas, perhatikan bahwa properti HTTPTransport.io.timeout.millis telah ditetapkan dengan nilai 55000 dalam http.properties. Hal ini menunjukkan bahwa waktu tunggu I/O berhasil dikonfigurasi hingga 55 detik pada Pemroses Pesan.

Setelah Anda menentukan waktu tunggu yang dikonfigurasi pada Router dan Pemroses Pesan, pastikan bahwa Router/host virtual telah dikonfigurasi dengan nilai waktu tunggu yang lebih rendah dibandingkan dengan yang ada pada Pemroses Pesan/proxy API.

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

Waktu tunggu di 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, nilai default 57 detik yang dikonfigurasi di Router itu akan digunakan.
  • Pada Pemroses Pesan, nilai default 55 detik akan dikonfigurasi.
  • Namun, pada Proxy API tertentu, nilai 120 detik akan dikonfigurasi.

Perlu diketahui bahwa nilai waktu tunggu yang lebih tinggi hanya dikonfigurasi pada proxy API, tetapi Router masih dikonfigurasi dengan durasi 57 detik. Oleh karena itu, waktu tunggu Router akan habis pada 57 detik saat Pemroses Pesan/backend masih memproses permintaan Anda. Hal ini menyebabkan Router merespons kembali dengan error 504 Gateway Timeout ke aplikasi klien.

Resolusi

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

  1. Lihat Praktik terbaik untuk mengonfigurasi waktu tunggu I/O untuk memahami nilai waktu tunggu yang harus ditetapkan pada berbagai komponen yang terlibat dalam alur permintaan API melalui Apigee Edge.
  2. Dalam contoh di atas, jika Anda yakin bahwa nilai waktu tunggu yang lebih tinggi perlu ditetapkan karena server backend memerlukan waktu yang lebih lama, dan Anda telah meningkatkan nilai waktu tunggu Pemroses Pesan menjadi 120 detik, maka tetapkan nilai waktu tunggu yang lebih tinggi. Misalnya: 123 seconds pada Router. Agar tidak memengaruhi semua Proxy API karena nilai waktu tunggu yang baru, tetapkan nilai 123 seconds hanya pada host virtual tertentu yang digunakan dalam Proxy API tertentu.
  3. Ikuti petunjuk di Mengonfigurasi waktu tunggu I/O pada Router untuk menyetel waktu tunggu pada host virtual.