Bagaimana cara saya mencegah Gateway Timeout dengan FastCGI di Nginx

203

Saya menjalankan Django, FastCGI, dan Nginx. Saya membuat semacam api di mana seseorang dapat mengirim beberapa data melalui XML yang akan saya proses dan kemudian mengembalikan beberapa kode status untuk setiap node yang dikirim.

Masalahnya adalah bahwa Nginx akan membuang 504 Gateway Time-out jika saya membutuhkan waktu terlalu lama untuk memproses XML - saya pikir lebih lama dari 60 detik.

Jadi saya ingin mengatur Nginx sehingga jika ada permintaan yang cocok dengan lokasi / api tidak akan habis selama 120 detik. Pengaturan apa yang akan mencapai itu.

Sejauh ini yang saya miliki adalah:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

Sunting: Apa yang saya miliki tidak berfungsi :)

heats
sumber
7
Anda dapat mengatur nilai batas waktu ke "2m" bukannya "120".
Cenk Alti
1
Tampaknya buruk bahwa data tidak dialirkan ... yaitu untuk server untuk mulai merespons kembali dalam 60 detik atau lebih tampaknya tidak dapat diterima.
Adam Gent

Jawaban:

245

Waktu tunggu proxy baik, untuk proxy, bukan untuk FastCGI ...

Arahan yang mempengaruhi waktu tunggu FastCGI adalah client_header_timeout, client_body_timeoutdansend_timeout .

Sunting : Mempertimbangkan apa yang ditemukan di nginx wiki, arahan send_timeout bertanggung jawab untuk mengatur batas waktu tanggapan secara umum (yang agak menyesatkan). Untuk FastCGI ada fastcgi_read_timeoutyang mempengaruhi batas waktu respons proses fastcgi .

HTH.

zgoda
sumber
8
Bagi siapa pun yang menggunakan uwsgi dan mengalami kesalahan ini, uwsgi_read_timeout 600; memperbaiki masalah saya.
Homer6
2
Pertanyaan saya di sini adalah (sebagai amatir admin server) di mana saya harus mengubah ini? file httpd.conf?
jeffkee
2
Jika itu membantu, milik saya ada di / etc / nginx / di sistem DV Media Temple.
jeffkee
Abdo memberikan cara yang bagus untuk debug. Jika Anda masih mengalami masalah, Anda mungkin perlu menambah ukuran pesan klien maks di nginx.conf (client_max_body_size ** M;)
Sam Grondahl
2
Meningkatkan batas waktu imho bukanlah solusi yang tepat.
JazzCat
24

Bagi mereka yang menggunakan nginx dengan unicorn dan rails, kemungkinan besar timeout ada di Anda unicorn.rb file

menempatkan batas waktu besar di unicorn.rb

timeout 500

jika Anda masih menghadapi masalah, coba fail_timeout = 0 di hulu Anda di nginx dan lihat apakah ini memperbaiki masalah Anda. Ini untuk keperluan debugging dan mungkin berbahaya di lingkungan produksi.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}
Abdo
sumber
3
Saya pikir orang-orang menurunkannya karena ini tentang Django, namun jawaban Anda memperbaiki masalah batas waktu gerbang saya dengan Rails + Unicorn :)
ZiggyTheHamster
4

Di httpbagian nginx (/etc/nginx/nginx.conf) tambahkan atau modifikasi:

keepalive_timeout 300s

Di serverbagian nginx (/etc/nginx/sites-available/your-config-file.com) tambahkan baris ini:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

Dalam phpfile dalam kasus 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) ubah:

request_terminate_timeout = 300

Saya harap membantu Anda.

Jose Carlos Ramos Carmenates
sumber
Apakah sesuatu yang "buruk" akan terjadi jika saya mengubah waktu menjadi 10.000 detik?
utdev
Tidak terjadi hal buruk, tetapi layanan Anda menunggu lebih lama. Anda dapat mengubah nilainya seperti yang Anda inginkan.
Jose Carlos Ramos Carmenates
1

Jika Anda menggunakan unicorn.

Lihat di topserver Anda. Unicorn kemungkinan menggunakan 100% CPU sekarang. Ada beberapa alasan masalah ini.

  • Anda harus memeriksa permintaan HTTP Anda, beberapa di antaranya bisa sangat sulit.

  • Periksa versi unicorn. Mungkin Anda baru saja memperbaruinya, dan ada yang rusak.

Pavel Kalashnikov
sumber
0

Di server proxy diatur seperti itu

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

Di server php diatur seperti itu

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
Kamil Dąbrowski
sumber