PHP set_time_limit () kullanarak nginx 504 Gateway zaman aşımını önleyin


117

PHP betiğim normalden daha uzun süre çalıştığında nginx'ten 504 zaman aşımı mesajı alıyorum. set_time_limit(0)bunu engellemiyor gibi görünüyor! Nginx üzerinde php5-fpm çalıştırırken çalışmıyor mu? Öyleyse, zaman sınırını belirlemenin doğru yolu nedir?

Hata:

504 Gateway Time-out
nginx/1.2.7

Yanıtlar:


194

Php-fpm için zaman aşımını ayarlamanın birkaç yolu vardır. In /etc/php5/fpm/pool.d/www.confI bu satırı eklendi:

request_terminate_timeout = 180

Ayrıca /etc/nginx/sites-available/defaultsöz konusu sunucunun konum bloğuna şu satırı ekledim:

fastcgi_read_timeout 180;

Konum bloğunun tamamı şuna benzer:

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;
} 

Şimdi sadece php-fpm ve nginx'i yeniden başlatın ve 180 saniyeden az süren istekler için daha fazla zaman aşımı olmamalıdır.


2
başka birinin merak etmesi durumunda benimki için varsayılan (nginx + php5-fpm) 60 saniyeydi, bu nedenle 60 saniyede bir komut dosyası için "ağ geçidi zaman aşımı" görürseniz, "fastcgi_read_timeout" ayarı eklenmelidir
Michael Nguyen

1
Bunu günlerdir anlamaya çalışıyorum ve @ pymkin'in cevabı benim için işe yarayan şeydi. Benim gibi nginx ve php5-fpm'nin nasıl yeniden başlatılacağını merak eden diğer amatörler için aşağıdaki iki komutu çalıştırın: sudo service nginx restart & sudo service php5-fpm restart Farklı yaptığım tek şey, bu ayarları yalnızca birine uygulamam sunucumdaki tüm web sitelerinin yapılandırması yerine web sitelerim.
Pamela

4
Ne yazık ki, fastcgi_read_timeouto locationblokta ne ayarlasam da, 60 saniye sonra hala zaman aşımına uğruyor.
Spencer Williams

bu kabul edilen cevap olmalıdır. pek çok çözüm denedi ama sadece bu işe yaradı. Laravel homestead kullanıyordum ve 504 ağ geçidi zaman aşımı hatası aldım ve bu düzeltildi.
Anbu369

Laravel kullanıyorsanız, bunu docroot locationyerine php betiklerini işleyen blokta ayarlamanız gerekir .
Ryan DuVal

50

Bu bağlantıyı deneyin , bunun nasıl düzeltileceğine dair daha iyi bir çözümü var. Yani adımlar:

  1. Dizinde nginx.confbulunan dosyanızı açın /etc/nginx.
  2. Aşağıdaki kod parçasını http {bölümün altına ekleyin :

    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;

    Not: Zaten mevcutsa, değerleri buna göre değiştirin.

  3. Nginx ve php5-fpm'yi yeniden yükleyin.

    $ service nginx reload
    $ service php5-fpm reload

    Hata devam ederse, değerleri artırmayı düşünün.


1
Bu sebebi bulmamızı sağlamaz, sadece hataya kadar olan süreleri artırır. Ancak neden bu kadar uzun süre yüklendiğine bir çözüm bulmak daha iyi olur. Localhost'tayken tek müşteriyim ve o kadar uzun süre yükleniyor ki, geliştirme sırasında beklemek hiç de iyi değil.
Darius.V

16
Soru, yavaş komut dosyasının nedenini sormak değil, sunucuyu daha uzun süre bekletmenin bir yolunu sormaktır. Bazen çok uzun süren görevleri yerine getiren özel komut dosyaları çalıştırmanız gerekir ve bu kötü bir şey değildir.
2016

Güncellenen (yukarıda) bağlantı: codetweet.com/nginx/…
nadavkav

2
Meşru olarak neyin bu kadar zaman alacağını merak edenler için, örneğin bir web arayüzünden bir veri tabanına bağlantı kurmaya çalışan ve ardından birçok başlangıç ​​tablosu oluşturup onu verilerle dolduran bir kurulum betiği olabilir. bir yanıtın gelmesi biraz zaman alabilir.
imme

Bu genel ayarların içinde site başına ayarlar tarafından geçersiz kılınacağını unutmayın /etc/nginx/sites-available/mysite.com.
Mac

11

Nginx tarafından verilen bir zaman aşımını önlemek için PHP'yi kullanamazsınız.

Nginx'i daha fazla zamana izin verecek şekilde yapılandırmak için proxy_read_timeoutyönergeye bakın .


Bu, 504'lerin serseri kutumda (vaprobash kullanarak) görünmeye başladığı yerde yaşadığım sorunu çözdü.
Andy Fleming

2
Bu cevabın yalnızca Nginx'i bir proxy sunucusu olarak kullanıyorsanız geçerli olduğuna inanıyorum. Nginx'i birincil web sunucunuz olarak kullanıyorsanız (PHP-FPM ile) bu işe yaramaz.
orrd

10

Doğru cevap, Nginx yapılandırmanızdaki fastcgi_read_timeout'u artırmaktır .
Bu kadar basit!


7
 sudo nano /etc/nginx/nginx.conf

Bu değişkenleri nginx.conf dosyasına ekleyin:

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

Ve sonra yeniden başlatın:

service nginx reload

4

Böyle bir durumda ortaya çıkabilecek üç tür zaman aşımı vardır. Her cevabın bu olasılıkların yalnızca bir yönüne odaklandığı görülebilir. Bu yüzden, bunu bir yere yazmayı düşündüm, böylece gelecekte burayı ziyaret edecek birinin her cevabı rastgele kontrol etmesine ve hangisinin işe yaradığını bilmeden başarıya ulaşmasına gerek kalmaz.

  1. İstekte bulunandan gelen isteği zaman aşımı süresi - Zaman aşımı başlığını ayarlamanız gerekir (istek kitaplığındaki başlık yapılandırmasına bakın)
  2. İstekte bulunurken nginx'ten zaman aşımı (proxy sunucuya iletilmeden önce) örn: Çok büyük dosya yükleniyor
  3. Proxy sunucuya iletildikten sonra zaman aşımı , sunucu nginx'e zamanında yanıt vermez. örneğin: Sunucuda çalışan zaman alan komut dosyaları

Dolayısıyla, her sorun için düzeltmeler aşağıdaki gibidir.

  1. zaman aşımı başlığını ayarla, örneğin: ajax'ta

$.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 İstemci zaman aşımı

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. nginx proxy sunucu zaman aşımı

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

Öyleyse ihtiyacınız olanı kullanın. Belki bazı durumlarda, tüm bu konfigürasyonlara ihtiyacınız vardır. İhtiyacım vardı.


1

Ekstra nginx yönergesi (for ngx_http_proxy_module) eklemeniz gerekir nginx.conf, örneğin:

proxy_read_timeout 300;

Temel olarak nginx proxy_read_timeoutyönergesi proxy zaman aşımını değiştirir, FcgidIOTimeoutçok uzun sessiz FcgidBusyTimeoutolan betikler içindir ve çalıştırılması çok uzun süren betikler içindir.

Ayrıca FastCGI uygulamasını kullanıyorsanız, bu seçenekleri de artırın:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Ardından nginx ve PHP5-FPM'yi yeniden yükleyin.

Plesk

Plesk'te, Web Sunucusu Ayarlarında Ek nginx yönergeleri altında ekleyebilirsiniz .

FastCGI için, HTTP için Ek yönergeler altındaki Web Sunucusu Ayarlarını kontrol edin .

Bakınız: Plesk'te FastCGI zaman aşımı sorunları nasıl giderilir?


FcgidBusyTimeoutDeğişken sadece Apache için mevcut değil mi?
Slavik

0

Php-fpm kullandığınız için, daha uzun sürebileceğini bildiğiniz istekleri işlemek için fastcgi_finish_request () avantajından yararlanmalısınız.


-1

set_time_limit(0)Php-fpm veya benzer bir işlem yöneticisi kullanırken kullanmak işe yaramaz.

Bottomline set_time_limitkullanırken php-fpm, yürütme zaman aşımınızı artırmak için kullanmayın , bu eğiticiye bakın .


8
Burada cevabın bazı açıklamaları verilebilir ve bağlantının süresi dolarsa bu cevap geçersiz hale gelebilir.
Lakshmi

-7

Bu sorunu APACHE yapılandırmasıyla çözüyorum! Tüm yöntemler (bu konudaki) benim için yanlış ... Sonra chanche apache yapılandırmasını deniyorum:

Timeout 3600

Sonra senaryom çalıştı!


5
Soru nginx'i belirtir, eğer apache ile sorununuz varsa, onu aramanız gerekir.
hogan

Soru Nginx ve php-fpm'de Apache'de değil.
Kevin Kaburu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.