PHP set_time_limit ()를 사용하여 nginx 504 게이트웨이 시간 초과 방지


116

PHP 스크립트가 평소보다 오래 실행될 때 nginx에서 504 시간 초과 메시지가 표시됩니다. set_time_limit(0)그것을 막지 않는 것 같습니다! nginx에서 php5-fpm을 실행할 때 작동하지 않습니까? 그렇다면 시간 제한을 설정하는 적절한 방법은 무엇입니까?

오류:

504 Gateway Time-out
nginx/1.2.7

답변:


193

php-fpm에 대한 시간 제한을 설정할 수있는 몇 가지 방법이 있습니다. 에서 /etc/php5/fpm/pool.d/www.conf나는이 줄을 추가 :

request_terminate_timeout = 180

또한 /etc/nginx/sites-available/default문제의 서버 위치 블록에 다음 줄을 추가했습니다.

fastcgi_read_timeout 180;

전체 위치 블록은 다음과 같습니다.

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

이제 php-fpm 및 nginx를 다시 시작하면 180 초 미만의 요청에 대해 더 이상 시간 초과가 없어야합니다.


2
다른 사람이 궁금해하는 경우를 대비하여 내 기본값 (nginx + php5-fpm)은 60 초 였으므로 60 초에서 스크립트에 대해 "게이트웨이 시간 초과"가 표시되면 "fastcgi_read_timeout"설정을 추가해야합니다.
Michael Nguyen

1
나는 이것을 며칠 동안 알아 내려고 노력해 왔으며 @pymkin의 대답은 나를 위해 일한 것입니다. nginx 및 php5-fpm을 다시 시작하는 방법을 궁금해하는 다른 아마추어의 경우 다음 두 명령을 실행하십시오. sudo service nginx restart & sudo service php5-fpm restart 제가 다르게 한 유일한 것은이 설정을 다음 중 하나에 만 적용한 것입니다. 내 서버의 모든 웹 사이트에 대한 구성이 아닌 내 웹 사이트.
Pamela

4
슬프게도 내가 fastcgi_read_timeoutlocation블록 에서 무엇을 설정하더라도 60 초 후에 시간이 초과됩니다.
Spencer Williams

이것은 받아 들여진 대답이어야합니다. 너무 많은 솔루션을 시도했지만 이것이 작동합니다. 나는 laravel homestead를 사용하고 있었고 504 게이트웨이 시간 초과 오류가 발생하여 수정되었습니다.
Anbu369

Laravel을 사용 location하는 경우 docroot가 아닌 php 스크립트를 처리 하는 블록 에서이를 설정해야합니다 .
Ryan DuVal

50

링크를 시도하면이 문제를 해결하는 방법에 대한 더 나은 솔루션이 있습니다. 따라서 단계는 다음과 같습니다.

  1. 디렉토리 nginx.conf에있는 파일을 엽니 다 /etc/nginx.
  2. http {섹션 아래에 코드를 추가 하십시오.

    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;

    참고 : 이미있는 경우 값을 변경하십시오.

  3. Nginx 및 php5-fpm을 다시로드합니다.

    $ service nginx reload
    $ service php5-fpm reload

    오류가 지속되면 값을 늘리십시오.


1
이것은 원인을 찾는 것이 아니라 오류가 발생할 때까지 시간을 증가시킵니다. 그러나 왜 그렇게 오래로드되는지 해결책을 찾는 것이 좋습니다. localhost에서 나는 유일한 클라이언트이고 너무 오래로드되어 개발하는 동안 기다리는 것이 좋지 않습니다.
Darius.V

16
문제는 느린 스크립트의 원인을 묻는 것이 아니라 서버를 더 오래 기다리게하는 방법을 묻는 것입니다. 때로는 매우 오랜 시간이 걸리는 작업을 수행하는 특수 스크립트를 실행해야하는 경우가 있으며 이는 나쁜 일이 아닙니다.
orrd

업데이트 된 (위) 링크 : codetweet.com/nginx/…
nadavkav

2
합법적으로 많은 시간이 걸리는 것이 무엇인지 궁금해하는 사람들을 위해 예를 들어 데이터베이스에 연결을 시도한 다음 많은 초기 테이블을 만들고 데이터로 채우는 웹 인터페이스의 설치 스크립트 일 수 있습니다. 응답하기까지 꽤 시간이 걸릴 수 있습니다.
imme 2017

이러한 전역 설정은의 사이트 별 설정에 의해 재정의됩니다 /etc/nginx/sites-available/mysite.com.
Mac

11

nginx가 발행 한 시간 초과를 방지하기 위해 PHP를 사용할 수 없습니다.

더 많은 시간을 허용하도록 nginx를 구성하려면 proxy_read_timeout지시문을 참조하십시오 .


이것은 504가 내 방랑자 상자에 나타나기 시작하는 문제를 해결했습니다 (vaprobash 사용).
Andy Fleming

2
이 답변은 Nginx를 프록시 서버로 사용하는 경우에만 적용됩니다. Nginx를 기본 웹 서버 (PHP-FPM 포함)로 사용하는 경우 작동하지 않습니다.
orrd

10

정답은 Nginx 구성에서 fastcgi_read_timeout 을 늘리는 입니다.
그렇게 간단합니다!


7
 sudo nano /etc/nginx/nginx.conf

nginx.conf 파일에 다음 변수를 추가합니다.

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

그런 다음 다시 시작하십시오.

service nginx reload

4

이러한 경우 발생할 수있는 세 가지 종류의 시간 초과가 있습니다. 각 답변은 이러한 가능성의 한 측면에만 초점을 맞추고 있음을 알 수 있습니다. 그래서 앞으로 이곳을 방문하는 사람이 답을 무작위로 확인하고 어느 것이 효과가 있는지 모른 채 성공을 거둘 필요가 없도록 적어 두려고했습니다.

  1. 요청자의 요청 시간 초과-시간 초과 헤더를 설정해야합니다 (요청 라이브러리의 헤더 구성 참조).
  2. 요청하는 동안 nginx 에서 시간 초과 (프록시 서버로 전달하기 전) 예 : 거대한 파일 업로드 중
  3. 프록시 서버로 전달한 후 시간 초과 , 서버가 시간 내에 nginx에 응답하지 않습니다. 예 : 서버에서 실행되는 시간 소모적 인 스크립트

따라서 각 문제에 대한 수정 사항은 다음과 같습니다.

  1. 시간 초과 헤더 설정 예 : 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 클라이언트 시간 초과

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. nginx 프록시 서버 시간 초과

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

따라서 필요한 것을 사용하십시오. 경우에 따라 이러한 모든 구성이 필요할 수 있습니다. 내가 필요.


1

에 추가 nginx 지시문 (for ngx_http_proxy_module) 을 추가해야합니다 nginx.conf. 예 :

proxy_read_timeout 300;

기본적으로 nginx proxy_read_timeout지시문은 프록시 시간 제한을 변경하고, FcgidIOTimeout너무 긴 스크립트를위한 것입니다.FcgidBusyTimeout 하고 실행하는 데 너무 오래 걸리는 스크립트를위한 것입니다.

또한 FastCGI 응용 프로그램을 사용하는 경우 다음 옵션도 늘립니다.

FcgidBusyTimeout 300
FcgidIOTimeout 250

그런 다음 nginx 및 PHP5-FPM을 다시로드하십시오.

플레 스크

Plesk에서는 추가 nginx 지시문 아래의 웹 서버 설정추가 할 수 있습니다 .

FastCGI의 경우 HTTP에 대한 추가 지시문 아래의 웹 서버 설정 에서 확인하십시오 .

참조 : Plesk에서 FastCGI 시간 초과 문제를 해결하는 방법?


FcgidBusyTimeout변수는 Apache에만 존재 하지 않습니까?
Slavik

0

php-fpm을 사용하고 있으므로 더 오래 걸릴 수 있다는 것을 알고있는 요청을 처리하려면 fastcgi_finish_request ()를 활용해야합니다.


-1

set_time_limit(0)php-fpm 또는 유사한 프로세스 관리자를 사용할 때 사용 은 쓸모가 없습니다.

요점은를 사용할 set_time_limit때 사용 하지 않는 php-fpm것입니다. 실행 시간 초과를 늘리려면이 자습서를 확인하십시오 .


8
여기에 답변에 대한 설명을 제공 할 수 있으며 링크가 만료되면이 답변이 명확해질 수 있습니다.
Lakshmi

-7

나는 config APACHE 로이 문제를 해결합니다! (이 주제의) 모든 방법이 잘못되었습니다 ... 그런 다음 chanche apache config를 시도합니다.

Timeout 3600

그런 다음 내 스크립트가 작동했습니다!


5
질문에는 nginx가 나와 있습니다. 아파치에 문제가 있으면 검색해야합니다.
hogan

질문은 Apache가 아닌 Nginx 및 php-fpm에 있습니다.
Kevin Kaburu 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.