Cegah nginx 504 Gateway timeout menggunakan PHP set_time_limit ()

116

Saya mendapatkan pesan batas waktu 504 dari nginx ketika skrip PHP saya berjalan lebih lama dari biasanya. set_time_limit(0)tampaknya tidak mencegah hal itu! Apakah tidak berfungsi saat menjalankan php5-fpm di nginx? Jika ya, bagaimana cara yang tepat untuk menetapkan batas waktu?

Kesalahan:

504 Gateway Time-out
nginx/1.2.7
Nyxynyx
sumber

Jawaban:

193

Ada beberapa cara untuk menyetel waktu tunggu untuk php-fpm. Di /etc/php5/fpm/pool.d/www.confsaya menambahkan baris ini:

request_terminate_timeout = 180

Juga, di /etc/nginx/sites-available/defaultsaya menambahkan baris berikut ke blok lokasi server yang dimaksud:

fastcgi_read_timeout 180;

Seluruh blok lokasi terlihat seperti ini:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Sekarang mulai ulang php-fpm dan nginx dan seharusnya tidak ada lagi waktu tunggu untuk permintaan yang membutuhkan waktu kurang dari 180 detik.

kulit babi
sumber
2
Jika ada orang lain yang bertanya-tanya, default untuk saya (nginx + php5-fpm) adalah 60 detik, jadi jika Anda melihat "gateway timeout" untuk skrip @ 60 detik, pengaturan "fastcgi_read_timeout" harus ditambahkan
Michael Nguyen
1
Saya telah mencoba memikirkan hal ini selama berhari-hari, dan jawaban @pymkinlah yang berhasil bagi saya. Untuk amatir lain seperti saya yang bertanya-tanya bagaimana cara me-restart nginx dan php5-fpm, jalankan dua perintah berikut: sudo service nginx restart & sudo service php5-fpm restart Satu-satunya hal yang saya lakukan secara berbeda adalah saya menerapkan pengaturan ini hanya ke satu dari situs web saya daripada konfigurasi untuk semua situs web di server saya.
Pamela
4
Sayangnya, apa pun yang saya atur fastcgi_read_timeoutdi locationblok itu, waktu masih habis setelah 60 detik.
Spencer Williams
ini harus menjadi jawaban yang diterima. mencoba begitu banyak solusi tetapi hanya ini yang berhasil. Saya menggunakan laravel homestead dan mengalami kesalahan batas waktu gateway 504 dan ini memperbaikinya.
Anbu369
Jika menggunakan Laravel, Anda perlu menyetelnya di locationblok yang menangani skrip php, bukan di docroot.
Ryan DuVal
50

Coba tautan ini , ini memiliki solusi yang lebih baik tentang cara memperbaikinya. Jadi langkah-langkahnya adalah:

  1. Buka nginx.conffile Anda yang terletak di /etc/nginxdirektori.
  2. Tambahkan kode di bawah ini http {di bawah bagian:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Catatan: Jika sudah ada, ubah nilainya sesuai.

  3. Muat ulang Nginx dan php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Jika kesalahan terus berlanjut, pertimbangkan untuk meningkatkan nilainya.

arp
sumber
1
Ini tidak membuat menemukan penyebabnya, itu hanya menambah waktu sampai terjadi kesalahan. Tetapi lebih baik menemukan solusi mengapa itu memuat begitu lama. Ketika di localhost saya adalah satu-satunya klien dan itu memuat begitu lama, itu sama sekali tidak baik untuk menunggu saat mengembangkan.
Darius.V
16
Pertanyaannya bukanlah menanyakan penyebab dari skrip yang lambat, ini menanyakan cara untuk membuat server menunggu lebih lama. Terkadang Anda perlu menjalankan skrip khusus yang melakukan tugas yang membutuhkan waktu sangat lama, dan itu bukan hal yang buruk.
tanggal
Tautan yang diperbarui (di atas): codetweet.com/nginx/…
nadavkav
2
Bagi mereka yang mungkin bertanya-tanya apa yang secara sah memakan banyak waktu, itu bisa menjadi contoh skrip instalasi dari antarmuka web yang mencoba membuat koneksi ke database dan kemudian membuat banyak tabel awal dan mengisinya dengan data .. itu bisa memakan waktu cukup lama sebelum ada tanggapan.
Imme
Ingatlah bahwa pengaturan global ini akan diganti dengan pengaturan per situs di /etc/nginx/sites-available/mysite.com.
Mac
11

Anda tidak dapat menggunakan PHP untuk mencegah batas waktu yang dikeluarkan oleh nginx.

Untuk mengkonfigurasi nginx agar memiliki lebih banyak waktu lihat proxy_read_timeoutdirektif .

Bart
sumber
Ini memecahkan masalah yang saya alami di mana 504s akan mulai muncul di kotak gelandangan saya (menggunakan vaprobash).
Andy Fleming
2
Saya yakin jawaban ini hanya berlaku jika Anda hanya menggunakan Nginx sebagai server proxy. Ini tidak akan berfungsi jika Anda menggunakan Nginx sebagai server web utama Anda (dengan PHP-FPM).
tanggal
10

Jawaban yang benar adalah meningkatkan fastcgi_read_timeout dalam konfigurasi Nginx Anda.
Sederhana seperti itu!

tfont
sumber
7
 sudo nano /etc/nginx/nginx.conf

Tambahkan variabel ini ke file nginx.conf:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

Dan kemudian restart:

service nginx reload
kabus
sumber
4

Ada tiga jenis batas waktu yang dapat terjadi dalam kasus seperti itu. Terlihat bahwa setiap jawaban difokuskan hanya pada satu aspek dari kemungkinan-kemungkinan ini. Jadi, saya berpikir untuk menuliskannya sehingga seseorang yang berkunjung ke sini di masa mendatang tidak perlu memeriksa setiap jawaban secara acak dan mendapatkan kesuksesan tanpa mengetahui mana yang berhasil.

  1. Batas waktu permintaan dari pemohon - Perlu menyetel header batas waktu (lihat konfigurasi header di perpustakaan permintaan)
  2. Timeout dari nginx saat membuat permintaan (sebelum diteruskan ke server yang di-proxy) misalnya: File besar sedang diunggah
  3. Batas waktu setelah meneruskan ke server yang di-proxy , server tidak membalas kembali nginx tepat waktu. misal: Skrip yang memakan waktu berjalan di server

Jadi perbaikan untuk setiap masalah adalah sebagai berikut.

  1. atur tajuk batas waktu misalnya: di ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx Client timeout

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. nginx proxied server timeout

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Jadi gunakan yang Anda butuhkan. Mungkin dalam beberapa kasus, Anda memerlukan semua konfigurasi ini. Saya memerlukannya.

Gayan Kavirathne
sumber
1

Anda perlu menambahkan arahan nginx tambahan (untuk ngx_http_proxy_module) di nginx.conf, misalnya:

proxy_read_timeout 300;

Pada dasarnya proxy_read_timeoutarahan nginx mengubah waktu tunggu proxy, FcgidIOTimeoutadalah untuk skrip yang diam terlalu lama, dan FcgidBusyTimeoutuntuk skrip yang terlalu lama untuk dieksekusi.

Juga jika Anda menggunakan aplikasi FastCGI, tingkatkan opsi ini juga:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Kemudian muat ulang nginx dan PHP5-FPM.

Plesk

Di Plesk, Anda dapat menambahkannya di Pengaturan Server Web di bawah Arahan nginx tambahan .

Untuk cek FastCGI di Pengaturan Server Web di bawah Arahan tambahan untuk HTTP .

Lihat: Bagaimana cara memperbaiki masalah batas waktu FastCGI di Plesk?

kenorb
sumber
Bukankah FcgidBusyTimeoutvariabel hanya ada untuk Apache?
Slavik
0

Karena Anda menggunakan php-fpm, Anda harus memanfaatkan fastcgi_finish_request () untuk memproses permintaan yang Anda tahu bisa memakan waktu lebih lama.

Kate
sumber
-1

Penggunaan set_time_limit(0)tidak berguna saat menggunakan php-fpm atau pengelola proses serupa.

Garis bawah tidak untuk digunakan set_time_limitsaat menggunakan php-fpm, untuk menambah waktu tunggu eksekusi Anda, periksa tutorial ini .

pangkalizer
sumber
8
mungkin akan memberikan beberapa penjelasan tentang jawabannya di sini serta jawaban ini mungkin menjadi tidak berguna jika link kadaluarsa.
Lakshmi
-7

Saya mengatasi masalah ini dengan konfigurasi APACHE! Semua metode (dalam topik ini) salah untuk saya ... Lalu saya coba konfigurasi apache chanche:

Timeout 3600

Kemudian skrip saya berhasil!

NeuroZ
sumber
5
Pertanyaannya menyatakan nginx, jika Anda mengalami masalah dengan apache, Anda harus mencari itu.
hogan
Pertanyaannya ada di Nginx dan php-fpm bukan Apache.
Kevin Kaburu