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_timeout그 location블록 에서 무엇을 설정하더라도 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.