Zapobiegaj przekroczeniu limitu czasu bramy nginx 504 za pomocą PHP set_time_limit ()


117

Otrzymuję komunikat o przekroczeniu limitu czasu 504 z nginx, gdy mój skrypt PHP działa dłużej niż zwykle. set_time_limit(0)nie wydaje się temu zapobiegać! Czy to nie działa podczas uruchamiania php5-fpm na nginx? Jeśli tak, jaki jest właściwy sposób ustalenia terminu?

Błąd:

504 Gateway Time-out
nginx/1.2.7

Odpowiedzi:


194

Istnieje kilka sposobów ustawienia limitu czasu dla php-fpm. W /etc/php5/fpm/pool.d/www.confdodałem tę linię:

request_terminate_timeout = 180

Ponadto /etc/nginx/sites-available/defaultdodałem następujący wiersz do bloku lokalizacji danego serwera:

fastcgi_read_timeout 180;

Cały blok lokalizacji wygląda następująco:

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

Teraz po prostu zrestartuj php-fpm i nginx i nie powinno być więcej limitów czasu dla żądań trwających mniej niż 180 sekund.


2
gdyby ktoś inny się zastanawiał, domyślna wartość dla mojego (nginx + php5-fpm) wynosiła 60 sekund, więc jeśli widzisz „limit czasu bramy” dla skryptu @ 60 sekund, należy dodać ustawienie „fastcgi_read_timeout”
Michael Nguyen

1
Próbowałem to rozgryźć od kilku dni, a odpowiedź @ pymkina jest tym, co zadziałało. Dla innych amatorów takich jak ja, którzy zastanawiają się, jak zrestartować nginx i php5-fpm, uruchom następujące dwa polecenia: usługa sudo nginx restart i usługa sudo restart php5-fpm Jedyną rzeczą, którą zrobiłem inaczej, jest to, że zastosowałem te ustawienia tylko do jednego z moje strony internetowe zamiast konfiguracji dla wszystkich witryn na moim serwerze.
Pamela

4
Niestety, bez względu na to, co ustawiłem fastcgi_read_timeoutw tym locationbloku, nadal kończy się on po 60 sekundach.
Spencer Williams

powinna to być akceptowana odpowiedź. próbowałem wielu rozwiązań, ale tylko to działa. Używałem laravel homestead i miałem błąd limitu czasu bramy 504 i to naprawiło.
Anbu369

Jeśli używasz Laravel, musisz ustawić to w locationbloku, który obsługuje skrypty php, a nie docroot.
Ryan DuVal

50

Wypróbuj ten link , ma lepsze rozwiązanie, jak to naprawić. Oto kroki:

  1. Otwórz nginx.confplik znajdujący się w /etc/nginxkatalogu.
  2. Dodaj poniższy fragment kodu w http {sekcji:

    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;

    Uwaga: jeśli jest już obecny, zmień wartości zgodnie z.

  3. Załaduj ponownie Nginx i php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Jeśli błąd nadal występuje, rozważ zwiększenie wartości.


1
Nie powoduje to znalezienia przyczyny, po prostu wydłuża czas do wystąpienia błędu. Ale lepiej byłoby znaleźć rozwiązanie, dlaczego ładuje się tak długo. Kiedy jestem na hoście lokalnym, jestem jedynym klientem i ładuje się tak długo, że wcale nie jest dobrze czekać na programowanie.
Darius.V

16
Pytanie nie dotyczy przyczyny powolnego skryptu, ale sposobu, aby serwer dłużej czekał. Czasami trzeba uruchomić specjalne skrypty, które wykonują zadania, które zajmują bardzo dużo czasu, a to nie jest złe.
orrd

Zaktualizowany (powyżej) link: codetweet.com/nginx/…
nadavkav

2
Dla tych, którzy mogą się zastanawiać, co legalnie zajmie tyle czasu, może to być na przykład skrypt instalacyjny z interfejsu internetowego, który próbuje nawiązać połączenie z bazą danych, a następnie tworzy wiele początkowych tabel i wypełnia je danymi. może zająć trochę czasu, zanim odpowiedź.
imme

Pamiętaj, że te ustawienia globalne zostaną zastąpione przez ustawienia dla poszczególnych witryn w /etc/nginx/sites-available/mysite.com.
Mac

11

Nie możesz użyć PHP, aby zapobiec przekroczeniu limitu czasu wydanego przez nginx.

Aby skonfigurować nginx, aby dać więcej czasu, zobacz proxy_read_timeoutdyrektywę .


To rozwiązało problem, z którym miałem do czynienia, gdzie 504 zaczęły pojawiać się na moim pudełku włóczęgi (używając vaprobash).
Andy Fleming

2
Uważam, że ta odpowiedź ma zastosowanie tylko wtedy, gdy używasz Nginx jako serwera proxy. To nie zadziała, jeśli używasz Nginx jako podstawowego serwera internetowego (z PHP-FPM).
lub

10

Prawidłowa odpowiedź to zwiększenie fastcgi_read_timeout w konfiguracji Nginx.
Proste!


7
 sudo nano /etc/nginx/nginx.conf

Dodaj te zmienne do pliku nginx.conf:

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

A następnie uruchom ponownie:

service nginx reload

4

W takim przypadku mogą wystąpić trzy rodzaje limitów czasu. Można zauważyć, że każda odpowiedź skupia się tylko na jednym aspekcie tych możliwości. Pomyślałem więc, żeby to zapisać, aby ktoś odwiedzający tutaj w przyszłości nie musiał losowo sprawdzać każdej odpowiedzi i odnosić sukcesu, nie wiedząc, która zadziałała.

  1. Przekroczono limit czasu żądania od żądającego - należy ustawić nagłówek limitu czasu (zobacz konfigurację nagłówka w bibliotece żądającej)
  2. Przekroczono limit czasu z nginx podczas wysyłania żądania wysyłania (przed przekazaniem do serwera proxy), np .: Przesyłanie ogromnego pliku
  3. Przekroczenie limitu czasu po przekazaniu do serwera proxy , serwer nie odpowiada na czas nginx. np .: czasochłonne skrypty działające na serwerze

Tak więc poprawki dla każdego problemu są następujące.

  1. ustaw nagłówek limitu czasu, np .: w 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. Limit czasu klienta nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. Limit czasu serwera proxy nginx

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

Więc użyj tego, którego potrzebujesz. Może w niektórych przypadkach potrzebujesz wszystkich tych konfiguracji. Potrzebowałem.


1

Musisz dodać dodatkową dyrektywę nginx (for ngx_http_proxy_module) w nginx.conf, np:

proxy_read_timeout 300;

Zasadniczo proxy_read_timeoutdyrektywa nginx zmienia limit czasu serwera proxy, FcgidIOTimeoutjest przeznaczona dla skryptów, które są zbyt ciche, aFcgidBusyTimeout dla skryptów, których wykonanie trwa zbyt długo.

Jeśli używasz aplikacji FastCGI, zwiększ również te opcje:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Następnie przeładuj nginx i PHP5-FPM.

Plesk

W Plesku możesz go dodać w Ustawieniach serwera WWW w sekcji Dodatkowe dyrektywy nginx .

W przypadku FastCGI sprawdź w ustawieniach serwera sieci Web w sekcji Dodatkowe dyrektywy dla protokołu HTTP .

Zobacz: Jak naprawić problemy z przekroczeniem limitu czasu FastCGI w Plesku?


Czy FcgidBusyTimeoutzmienna nie istnieje tylko dla Apache?
Slavik

0

Ponieważ używasz php-fpm, powinieneś skorzystać z fastcgi_finish_request () do przetwarzania żądań, o których wiesz, że może to potrwać dłużej.


-1

Używanie set_time_limit(0)jest bezużyteczne podczas korzystania z php-fpm lub podobnego menedżera procesów.

Dolna linia nie jest używana set_time_limitpodczas używania php-fpm, aby zwiększyć limit czasu wykonania, sprawdź ten samouczek .


8
może zawierać wyjaśnienie odpowiedzi tutaj, a także ta odpowiedź może stać się nieaktualna, jeśli link wygaśnie.
Lakshmi

-7

Rozwiązuję ten problem z config APACHE! Wszystkie metody (w tym temacie) są dla mnie niepoprawne ... Następnie próbuję chanche apache config:

Timeout 3600

Wtedy mój skrypt zadziałał!


5
Pytanie brzmi nginx, jeśli masz problemy z Apache, powinieneś go poszukać.
hogan

Pytanie dotyczy Nginx i php-fpm, a nie Apache.
Kevin Kaburu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.