2013-12-20 7 views
2

배경 정보아파치 프록시는 prefork의 또는 노동자 MPM

우리는 델 R620의 통신 기반의 엔터프라이즈 애플리케이션 서버가 실행이 중 하나와 연결 재사용을 안하고 모두 아파치 웹 서버 & OCCAS 함께 배포 RHEL 5 플랫폼 &에 응용 프로그램 서버. 당사는 모든 HTTP 기반 요청에 대해 클라이언트 &이 아파치를 공격하기 때문에 응용 프로그램 서버에 연결하는 독점적 인 전화를 보유하고 있습니다. Apache 서버는 OCCAS에 요청을 프록시/전달하도록 구성됩니다.

문제점

고유의 전화가 초당 약 10 개 개의 요청 즉 35초 내 (시동시) 350 HTTP 요청을 전송할 것이다. 우리는 전화 & 아파치가 연결을 재사용하고있는 것을 볼 수 있습니다. 반면 아파치 사이의 연결 인 mod_proxy & OCCAS 은 연결을 재사용하지 않아 요청 당 하나의 연결을 생성합니다. Apache & OCCAS 간의 연결은 요청이 처리 된 직후 Apache/proxy (프록시에서 FIN이 표시됨)에 의해 닫힙니다. 350 개의 요청이 처리 된 후 1 분 동안 TIME_WAIT 상태에서 350 개의 소켓을 볼 수 있습니다. 우리 시스템은 그런 전화 500 대를 처리해야합니다. 이제 350 대의 모든 전화기가 350 건의 요청을 동시에 처리하는 것을 상상할 수 있다면 175,000 (350 * 500)의 임시 포트가 필요합니다! 그래서 나는 아파치 프록시 & OCCAS 사이에서 작업 할 수 있도록 연결 재사용을 시도했다.

우리는 & 가지 구성을 아래에 게시했습니다. 시도한 다른 것들 & 연결 재사용을 실패했습니다. 우리는 기본 prefork의의 MPM을 사용하는 &을 다음과 같이

우리의 구성

1) & 노동자 MPM은 /etc/httpd/conf/httpd.conf 파일에있는 우리의 시스템에 구성된 prefork의입니다.

<IfModule prefork.c> 
StartServers  8 
MinSpareServers 5 
MaxSpareServers 20 
ServerLimit  256 
MaxClients  256 
MaxRequestsPerChild 4000 
</IfModule> 

<IfModule worker.c> 
StartServers   8 
MaxClients   150 
MinSpareThreads  5 
MaxSpareThreads  20 
ThreadsPerChild 256 
MaxRequestsPerChild 4000 
</IfModule> 

2)에 연결 유지 /etc/httpd/conf/httpd.conf 파일 관련 파라미터 다음과 같다 :이

[[email protected] ~]# grep -i keepalive /etc/httpd/conf/httpd.conf | grep -v "#" 
KeepAlive On 
MaxKeepAliveRequests 100 
KeepAliveTimeout 15 
BrowserMatch "Mozilla/2" nokeepalive 
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 
[[email protected] ~]# 

3) 프록시 구성은 다음과 같다 :

<VirtualHost *:80> 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

<Location /ds-webservice> 
ProxyPass   http://{IP address of local host}:8001/ds-webservice retry=0 
ProxyPassReverse http://{IP address of local host}:8001/ds-webservice 
</Location> 
. 
. 
# Few more similar ProxyPass 
. 
. 
</VirtualHost> 

4) 우리는 디폴트 prefork 아파치를 사용한다 :

[[email protected] ~]# httpd -l 
Compiled in modules: 
    core.c 
    prefork.c 
    http_core.c 
    mod_so.c 

테스트 시도했지만 연결이 우리는 mod_proxy를가 보내는 눈치

시험 1) 다시 달성하는 데 실패 '연결 : 살아-유지'전달 된 요청 반면에 (헤더가 아니라 '연결 유지') 자체 헤더 OCCAS는 '연결'또는 '연결 유지'헤더로 응답하지 않습니다. 초기의 용의자는 Apache가 이러한 헤더가없는 응답을 좋아하지 않는다는 것입니다. 그래서 우리는 실험을 통해 다른 아파치로 요청을 전달했다. 다른 아파치가 mod_proxy에 응답하여 'Connection'또는 'Keep-alive'헤더를 돌려 받았지만 여전히 mod_proxy는 연결 재사용을하지 않았다. 그래서, 우리는 그 문제가있는 mod_proxy를 확인했습니다. (또는 우리 쪽에서 잘못된 설정 일 수도 있습니다.)

시험 2) 조금만 살펴보면 prefork로 연결 재사용에 대한 2.2.0 - https://issues.apache.org/bugzilla/show_bug.cgi?id=38602의 버그 보고서를 발견했습니다. 버그 38602는 2.2.1에서 수정되었습니다. 그러나 게시물 Can I use Apache mod_proxy as a connection pool, under the Prefork MPM?을 기반으로 업그레이드 후 문제가 지속되는 것으로 나타났습니다. 따라서, 아파치를 2.2.3에서 2.2.26으로 업그레이드했지만 mod_proxy는 연결 재사용을하지 않았습니다.

시험 3) 우리는 mod_proxy를 연결 재사용을하지 않았다, 그들 중 & 아무도 즉, 도움 없음)을 httpd.conf에서 아무 것도 변경하지 않고 (다른 ProxyPass로 매개 변수와 함께 몇 가지 검사를 시도 : 참고 : 제외 (7), 우리 우리의 테스트를 위해 'ProxyPass http : // {로컬 호스트의 IP 주소} : 8001/ds-webservice'옆에 아래의 매개 변수를 추가했습니다.
1 재시 = 0
ON (우리의 기본 구성)

2 disablereuse = OFF
3. 최대 = 256 재시 = 0
proxyto 4 = 80
제 재시 = 0 = 킵 얼라이브 6. 마지막으로 http.conf의 keep-alive 매개 변수를 무시하기 위해 keep-alive 특정 매개 변수를 프록시 구성에 추가했습니다.

<VirtualHost *:80> 

Timeout 300 
KeepAlive On 
MaxKeepAliveRequests 1000 
KeepAliveTimeout 100 
ProxyRequests Off 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

<Location /ds-webservice> 
ProxyPass   http://{IP address of local host}:8001/ds-webservice retry=0 
ProxyPassReverse http://{IP address of local host}:8001/ds-webservice 
</Location> 
. 
. 
# Few more similar ProxyPass 
. 
. 
</VirtualHost> 

테스트 4) 게시물 Can I use Apache mod_proxy as a connection pool, under the Prefork MPM?을 기반으로 2.2.26 &에서 httpd.worker를 사용하여 Apache를 작업자 Apache로 프리 프레킹하도록 전환했습니다. mod_proxy는 연결 재사용을 수행하지 않았습니다.

여기서 우리는 매우 근본적인 것이 빠져있는 것처럼 보입니다. ProxyPass 또는 prefork 구성에서 잘못된 점이 있다면 상당히 관련이 있습니다. 어떤 포인터가 큰 도움이 될 것입니다.

미리 감사드립니다.

감사
Goutham 프라 사드

답변

1

기회 중 하나를 고객이 (킵 얼라이브 명시 적으로 헤더를 통해 활성화해야) HTTP 프로토콜 1.0에서 요청하거나 요청 중 하나를 만들거나 응답이 폐쇄 될 연결을 요청하는 것이 좋다 Connection: close 헤더

  1. 프록시
  2. OCCAS
  3. 에 프록시에서 요청에 대한 클라이언트의 요청 :의 패킷 흔적에서 헤더를 게시하는 것입니다 무슨 일이 일어나고 있는지 결정하기 위해 http://en.wikipedia.org/wiki/HTTP_persistent_connection

    가장 좋은 방법을 참조하십시오

  4. 이 플레이에 어떤 프로토콜 버전 및 헤더 볼 수 있도록 할

프록시에 OCCAS의 응답.