2009-11-09 7 views
0

너무 오래 걸리는 서버 프로세스가 있다고 가정 해 보겠습니다. 고객은 "시간 초과"라고 불평합니다.Apache 프로세스가 중단되었습니다. 얼마나 오래 갈 것입니까?

내가 틀렸다면 정정 해주세요.하지만이 시간 초과는 아파치의 타임 아웃 설정과 관련이 있지만 반드시 그런 것은 아닙니다. 문제의 페이지를 테스트 할 때 신뢰할 수있는 시간을 확보하지 못했기 때문에 대부분의 경우 브라우저가 회전 할 것입니다.

the documentation에 설명 된대로 클라이언트에 연결하는 데 문제가있는 경우 제한 시간 설정이 적용됩니다. 하지만 연결 상태가 좋으면 연결을 닫을 때까지 클라이언트에게 달려 있습니다 (저는 믿습니다).

클라이언트가 브라우저를 닫을 경우 아파치가 시간 제한 (내 경우 300 초)에 도달하여 프로세스를 종료한다는 의미이기도합니다. 이것은 사실이 아닌 것 같습니다. 여기

내가 그것을 테스트 방법은 다음과 같습니다
내가 서버에서 일부 코드에 while 루프를 추가 :

too_long = 2000 
tstart = time.time() 
f = open('/tmp/timeout_test.txt', 'w') 
while True: 
    time.sleep(100) 
    elapsed = time.time() - tstart 
    f.write('Loop, %s elapsed\n' % elapsed) 
    if elapsed > too_long: 
     break 

내가 그 루프를 실행하는 웹 페이지를 열고, 서버에서 netstat 실행 :

~$ netstat -np | grep ESTAB | grep apache 
tcp  0  0 10.102.123.6:443  10.102.119.101:53519 ESTABLISHED 16534/apache2 
tcp  0  0 127.0.0.1:60299   127.0.0.1:5432   ESTABLISHED 16534/apache2 

(즉, 서버가 10.102.123.6에있다, 10.102.119.101 날입니다)
내가 다음 브라우저를 닫고 NETSTAT 줄 것을 reran :

~% netstat -np | grep ESTAB | grep apache 
tcp  0  0 127.0.0.1:60299   127.0.0.1:5432   ESTABLISHED 16534/apache2 

내 연결이 사라,하지만 서버가 루프에 여전히, 나는 실행하여 확인할 수 :

~% lsof | grep timeout 
apache2 16534 www-data 14w  REG  8,1  0  536533 /tmp/timeout_test.txt 

아파치 프로세스가 아직 열려 해당 파일을 가지고 의미한다. 다음 2000 초 동안 실행했을 때 :

~% cat /tmp/timeout_test.txt 

나는 아무것도 얻지 못했습니다. 2000 초가 지나면 netcat 라인은 아무것도 생성하지 않았고 tmp 파일은 while 루프의 출력으로 채워졌습니다.

그래서 아파치 프로세스는 클라이언트 연결에 관계없이 요청 된대로 처리하는 것 같습니다. 그 루프백 연결은 무엇에 관한 것입니까?

+0

파이썬 인터페이스에 어떤 아파치를 사용하고 있습니까? mod_python? fcgi? CGI? –

+0

mod_wsgi를 사용하고 있습니다. – EMiller

+0

* Apache 프로세스를 포기했습니다. 얼마나 오래 갈 것입니까? * 휴식을 취할 때까지 먹거나, 부모를 찾거나 죽을 때까지 기다리십시오. – voyager

답변

1

수정. 는 C 아파치 모듈에서는 같은 검사를 추가 할 수 있습니다

/* r is the 'request_rec' object from apache */ 
if (r->connection->aborted) { 
    /* stop processing and return */ 
} 

는 클라이언트가 여전히 연결되어 있는지 확인합니다. 아마도 파이썬 인터페이스는 비슷한 것을 가지고있을 것입니다.

루프백 연결은 루프가 실행되는 동안 열린 상태로 유지되는 postgresql 데이터베이스에 대한 연결입니다.

+0

오른쪽, 포스트그레스! 나는 포트 5432를 알아 차렸어 야했다. 그래서 기본적으로 아파치 인터페이스가 내가 중단 된 프로세스를 죽여야 할지를 결정하기 위해 사용하고 있는가? – EMiller

+0

네,하지만 mod_wsgi가 그 정보를 파이썬 코드에 전달할 수있는 방법이 있어야합니다. – Gonzalo

+0

hmh, 왜 mod_wsgi가 내 정보를 내 파이썬 코드에 중계해야하는지 모르겠다. mod_wsgi가 프로세스를 죽일 수는 없습니까? mod_wsgi 소스를 살펴보면 http://code.google.com/p/modwsgi/source/browse/trunk/mod_wsgi/mod_wsgi.c#3263 이벤트를 로깅해야합니다. 내 기록. 아파치 타임 아웃이 끝나면 그 이벤트가 트리거되지 않아야합니까? (기본적으로 5 분) – EMiller

관련 문제