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초 미만의 요구 타임아웃은 발생하지 않습니다.
이 링크를 사용해 보세요.이 링크를 클릭하면 이 문제를 해결할 수 있는 더 좋은 솔루션이 있습니다.순서는 다음과 같습니다.
- , 펴보세요.
nginx.conf
「 」에/etc/nginx
디렉토리로 이동합니다. 합니다.
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;
메모: 이미 존재하는 경우 값을 변경합니다.
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종류가 있습니다.각 답변은 이러한 가능성의 한 측면에만 초점을 맞추고 있음을 알 수 있습니다.그래서 앞으로 이곳을 방문하는 누군가가 어떤 답이 먹혔는지 모르고 무작위로 확인해서 성공을 거둘 필요가 없도록 적어야겠다고 생각했습니다.
- 요청자로부터의 요청 시간 초과 - 시간 초과 헤더를 설정해야 합니다(요청 라이브러리의 헤더 구성 참조).
- (프록시 서버로 전송하기 전에) 요청을 하는 동안 nginx에서 시간 초과: 대용량 파일을 업로드하고 있습니다.
- 프록시 서버에 전달한 후 타임아웃이 발생하여 서버가 시간 내에 nginx에 회신하지 않습니다.예: 서버에서 실행되는 시간이 많이 걸리는 스크립트
각 문제에 대한 수정사항은 다음과 같습니다.
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 });
nginx 클라이언트 시간 초과
http{ #in seconds fastcgi_read_timeout 600; client_header_timeout 600; client_body_timeout 600; }
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
실행 타임 아웃을 늘리려면 , 이 튜토리얼을 확인해 주세요.
이 문제에 대한 답을 찾기 위해 많은 시간을 보낸 후, 나는 한 가지를 보았다.
애플리케이션에는 다음 레이어가 하나 더 있습니다.
- 로드 밸런서(항상 여기서 문제가 발생)
- 웹 서버(nginx)
- 응용 프로그램(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
'programing' 카테고리의 다른 글
로컬에서 mysql 도커에 연결할 수 없습니다. (0) | 2022.10.29 |
---|---|
nuxt js를 사용하여 모든 페이지에 글꼴을 삽입하는 방법 (0) | 2022.10.29 |
Vue Router에서 앵커(북마크)를 처리하는 방법 (0) | 2022.10.29 |
Python 사전에서 키를 제거하려면 어떻게 해야 합니까? (0) | 2022.10.29 |
이클립스의 안드로이드 앱:그래픽 레이아웃에 표시되지 않는 텍스트 편집 (0) | 2022.10.29 |