programing

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

copyandpastes 2022. 10. 29. 12:22
반응형

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

PHP 스크립트가 평소보다 오래 실행되면 nginx에서 504 타임아웃 메시지가 나타납니다. set_time_limit(0)★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★!nginx에서 ?만약 그렇다면, 시간제한을 설정하는 적절한 방법은 무엇인가요?

오류:

504 Gateway Time-out
nginx/1.2.7

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초 미만의 요구 타임아웃은 발생하지 않습니다.

링크를 사용해 보세요.이 링크를 클릭하면 이 문제를 해결할 수 있는 더 좋은 솔루션이 있습니다.순서는 다음과 같습니다.

  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
    

    에러가 해소되지 않는 경우는, 값을 늘리는 것을 검토해 주세요.

nginx가 발행하는 타임아웃을 막기 위해 PHP를 사용할 수 없습니다.

nginx 가 보다 많은 시간을 허용하도록 설정하려면 지시문을 참조하십시오.

정답은 Nginx 설정에서 fastcgi_read_timeout을 늘리는 것입니다.
★★★★★★★★★★★★★★★★★!

 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

이러한 경우에 발생할 수 있는 타임아웃은 3종류가 있습니다.각 답변은 이러한 가능성의 한 측면에만 초점을 맞추고 있음을 알 수 있습니다.그래서 앞으로 이곳을 방문하는 누군가가 어떤 답이 먹혔는지 모르고 무작위로 확인해서 성공을 거둘 필요가 없도록 적어야겠다고 생각했습니다.

  1. 요청자로부터의 요청 시간 초과 - 시간 초과 헤더를 설정해야 합니다(요청 라이브러리의 헤더 구성 참조).
  2. (프록시 서버로 전송하기 전에) 요청을 하는 동안 nginx에서 시간 초과: 대용량 파일을 업로드하고 있습니다.
  3. 프록시 서버에 전달한 후 타임아웃이 발생하여 서버가 시간 내에 nginx에 회신하지 않습니다.예: 서버에서 실행되는 시간이 많이 걸리는 스크립트

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

  1. set timeout header(예: ajax)

    $.ajax({
        url: "test.html",
        error: function(){
            // will fire when timeout is reached
        },
        success: function(){
            //do something
        },
        timeout: 3000 // sets timeout to 3 seconds
    });
    
  2. nginx 클라이언트 시간 초과

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

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

그러니 필요한 걸 쓰세요.경우에 따라서는, 이러한 설정이 모두 필요한 경우도 있습니다.필요했어요.

nginx 디렉티브를 추가해야 합니다.ngx_http_proxy_module)의 경우nginx.conf예:

proxy_read_timeout 300;

기본적으로 nginx는proxy_read_timeout디렉티브는 프록시 타임아웃을 변경합니다.FcgidIOTimeout너무 긴 스크립트용입니다.FcgidBusyTimeout실행 시간이 너무 오래 걸리는 스크립트용입니다.

또, Fast CGI 애플리케이션을 사용하고 있는 경우는, 다음의 옵션도 늘려 주세요.

FcgidBusyTimeout 300
FcgidIOTimeout 250

그런 다음 nginx 및 PHP5-FPM을 새로고침합니다.

플라스틱

Plesk에서 웹 서버 설정의 Additional nginx 지시사항에서 추가할 수 있습니다.

Fast CGI의 경우 웹 서버 설정의 HTTP 추가 지시사항을 확인합니다.

자세한 내용은 Plesk에서 Fast CGI 타임아웃 문제를 해결하는 방법을 참조하십시오.

php-fpm을 사용하고 있기 때문에 fastcgi_finish_request()를 사용하여 요청을 처리하는 것이 더 오래 걸릴 수 있습니다.

php-fpm 또는 이와 유사한 프로세스 매니저를 사용할 경우 를 사용할 수 없습니다.

요점은 사용하지 않는 것입니다.set_time_limit사용할 때php-fpm실행 타임 아웃을 늘리려면 , 이 튜토리얼을 확인해 주세요.

이 문제에 대한 답을 찾기 위해 많은 시간을 보낸 후, 나는 한 가지를 보았다.

애플리케이션에는 다음 레이어가 하나 더 있습니다.

  1. 로드 밸런서(항상 여기서 문제가 발생)
  2. 웹 서버(nginx)
  3. 응용 프로그램(php)

LB에 대한 make request에서 벗어나면 php에 "sleep"이 있는 테스트 성공 응답을 볼 수 있습니다.

php-fpm 로그를 확인하는 것을 잊지 마세요!

PHP 7.3에서는 다음과 같은 일이 있었습니다.

경고: [pool www] 서버가 pm.max_children 설정(5)에 도달했습니다.올려주세요

- 그래, 아니에요! - 왜요?/etc/php/7.3/fpm/pool.d/www.conf나는 키워야 했다pm.max_children로부터 값을 매기다.5까지50(때로는 꽤 무거운 지역 일을 하기도 합니다...)

주의: CPU 사용률이 높아질 수 있습니다.

언급URL : https://stackoverflow.com/questions/16002268/prevent-nginx-504-gateway-timeout-using-php-set-time-limit

반응형