Apache2 프록시 시간 초과


23

PHP + PHP-FPM이있는 Apache2가 다음과 같이 구성되어 있습니다.

http://wiki.apache.org/httpd/PHP-FPM

내부 Vhost에서 실행하는 데 오랜 시간이 걸리는 스크립트를 작성하고 있지만 시간이 초과되어 스크립트가 30 초 이내에 실행되면 모든 것이 완벽하게 실행됩니다.

내 아파치 로그는 나에게 말한다 :

[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:

스크립트를 실행하려고 할 때 503 Service Unavailable정확히 30 초의 실행 시간이 주어집니다 . 논리적으로 이것은 시간 초과 지시문 또는 설정이 30 초로 설정되어 있지만 Vhost의 구성에 다음이 있음을 의미합니다.

Timeout 600
<IfModule proxy_module>
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
    ProxyTimeout 600
</IfModule>

(php-fpm은 나를 위해 9001 포트에서 실행 중입니다)

나는 또한 아무런 차이없이 Timeoutand ProxyTimeout를 배치하려고 시도했다 httpd.conf.

에 대한 다른 시간 초과 설정이있는 것 같지만 mod_proxy_fcgi찾을 수 없습니다. 공식 tarball에서 Apache2 httpd를 설치했는데 어떤 모드도 구성 파일과 함께 제공되지 않은 것 같습니다.

누구든지 올바른 방향으로 나를 가리킬 수 있다면 대단히 감사하겠습니다.

답변:


32

여러 구성 매개 변수를 테스트 한 후이 문제를 해결했습니다. 솔루션을 두 번 테스트하여 이전의 모든 변경 사항을 제거했습니다. 수정하려면 하나의 매개 변수 만 필요했습니다.

최신 버전의 httpd 및 mod_proxy_fcgi의 경우 간단히 다음 timeout=과 같이 ProxyPassMatch줄 끝에 추가 할 수 있습니다 .

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

이전 버전의 경우 조금 더 복잡했습니다. 예 :

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

시간 초과를 30 분으로 설정하려면 프록시 지시문을 추가해야했습니다. 일부 응용 프로그램에서는 일반적으로 데이터베이스를 운영 할 때 실행하는 데 10 분 이상 걸릴 수있는 루틴이 있습니다. 시간 초과를 30 분으로 설정하여 완료되도록합니다. 설치 마법사를 사용할 때 특히 유용합니다. 시간이 너무 오래 걸립니다.

그런데이 문제를 해결하는 데 도움이되는 초기 정보는 다음 URL 주소 에서 찾을 수 있습니다 .


1
이 아파치, AH00526의 최신 버전에서 파산 것 같습니다 : ProxyPass로 / <프록시>와 ProxyPassMatch / <ProxyMatch> 같은 노동자의 이름으로 모두 사용할 수 없습니다
스튜어트 아담

4
ProxyPassMatch 줄 끝에 매개 변수 'timeout = 120'을 추가하여 위의 문제를 해결했습니다.
스튜어트 아담


두 가지가 더 필요했습니다. 먼저 전역 아파치 구성 파일의 "Timeout"및 "ProxyTimeout"을 다른 FPM 시간 초과보다 길게 설정해야합니다. 둘째, 내 FPM 풀이 유닉스 소켓에서 수신 대기 중이며 SetHandler를 다음과 같이 사용합니다. [SetHandler "proxy : unix : /var/run/php/example.com-php7.0-fpm.sock | fcgi : // localhost : 8000 "]. 그러나 <Proxy>는 SetHandler 행의 fcgi : // localhost 부분 (실제로 사용되지 않는 | ... 뒤에있는 부분)과 일치하며 unix : / var / run / 부분은 아닙니다. 위의 사용을 위해 타임 아웃을 설정하려면 : <Proxy ixgi : / var / run / ...이 아니라 <Proxy fcgi : // localhost : 8000>
교수 Falken

9

이 답변 은 이전 버전에서 훌륭하게 작동 하지만 오류 코드 AH00526과 함께 최신 버전의 Apache 2.4에서 작동합니다. ProxyPass그리고 ProxyPassMatch<Proxy>하고 <ProxyMatch>같은 노동자의 이름에서 함께 사용할 수 없습니다. 이것은 제대로 작동하는 데 사용되었으므로 디자인에 의해 변경되었는지 또는 버그인지 알 수 없습니다.

어느 쪽이든, 'timeout = 120'매개 변수 (또는 원하는 값이 무엇이든)와 함께 ProxyPassMatch 만 사용하여이 문제를 해결할 수 있습니다.

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

6

Apache 2.4.6이 있지만이 를 수정하기 위한 패치 는 Apache> = 2.4.8에서 제공됩니다. 여기서 핵심은 Apache (mod_proxy_fcgi)가 연결이 활성화 된 것으로 생각하도록 출력을 즉시 시작하는 것입니다.

예를 들어, PHP를 사용하고 있으며 AJAX 호출에 대한 DB 쿼리가 30 초 이상 걸립니다. 전반적인 응답이 "Content-Type : application / json"이라는 것을 알고 있으므로 해당 헤더를 즉시 보냅니다.

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

2

그렇게해서는 안됩니다 :

<IfModule mod_proxy.c>

php.ini 설정 max_execution_time도 600으로 설정해야합니다. (실제 페이지에서 phpinfo ()를 확인하여 실제 사용 된 값이 표시되는지 확인하십시오)

Jenny가 말했듯이 php-fpm 설정

request_terminate_timeout 610s

(끝에 s를 적어 두십시오)

아파치 페이지에서 볼 수 있듯이 mod_proxy_fcgi 자체로 구성하는 것은별로 없습니다. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

php-fpm 디버그 로깅도 켜서 시간 초과 위치를 확인할 수 있습니다. http://php-fpm.org/wiki/Configuration_File(catch_workers_output 켜기)

Apache 2.4를 사용하고 있으므로 mod_proxy 및 mod_proxy_fcgi 모듈에 대한 디버그 레벨 로깅을 켜십시오. 아주 좋은 기능, 필요한 모듈에 대해서만 켜십시오 : http://httpd.apache.org/docs/current/mod/core.html#loglevel

도움이되지 않으면 php-fpm 구성 파일을 게시하십시오.

최후의 수단으로, 일부 데몬이 장기 실행 프로세스를 종료하고 있습니까?


2

PHP-FPM을 사용하고 있다고 언급했습니다. 나도 그것을 사용하지만 Apache 2.4.6과 함께 사용합니다.

문제가 한동안 존재했다고 가정하면에 대한 시간 초과 값 mod_proxy_fcgi하드 코딩 된 것 같습니다 . 여기서 찾은 것을 썼습니다


1

아파치에서 타임 아웃 설정을 수정 했으므로 문제가되지 않습니다. 두 번째로 살펴볼 곳은 모든 네트워크 장비이지만, 자신의 서버에 프록시하기 때문에 그럴 가능성도 없습니다. 따라서 남은 곳은 백엔드 서버입니다.

php-pfm의 설정 파일입니다.

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

이것은 아파치의 타임 아웃 설정과 동일하거나 약간 아래로 설정해야합니다.


1
나는를 설정하지했습니다 request_terminate_timeout내가위한 세트에 뭔가 I의 필요가 있다는 느낌이 :( 400에 여전히 변화가 mod_proxy_fcgi있지만, 모든 구성 파일을 제공하는 것 같지 않았어요.
wyqydsyq

0

시간 초과 외에도 enablereuse = off를 설정하십시오. 오래 실행되는 스크립트에 대한 요청이있을 때 제대로 작동하고 다른 스크립트는 일찍 종료 될 수 있음을 알았습니다.


0

이 게시물 은 나를 위해 모든 거래를 변경했습니다.

Apache 의 mod_reqtimeout 이 기본값을 사용하지 않는 것 같습니다 .

httpd.conf 파일에 다음 행을 추가 하십시오.

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.