사용할 Apache MPM을 어떻게 선택합니까?


261

이것은 올바른 Apache httpd MPM을 선택 하는 것에 대한 정식 질문 입니다.

나는 아파치가 제공하는 다른 MPM- 'worker', 'event', 'prefork'등에 약간 혼란 스럽습니다.

이들 간의 주요 차이점은 무엇이며 특정 배포에 가장 적합한 것을 어떻게 결정할 수 있습니까?


4
mod_php를 지원한다면, prefork를하고있는 것입니다.
Zoredache

6
@ 조르 데슈 :? 그녀는 PHP에 대해 언급 한 적이 없으며, 가지고 있더라도 mod_php는 이벤트 만 제외합니다. 아니면 8 년 전에 RL의 발언에 여전히 집착하고 있습니까? 스레드 아파치와 관련하여 PHP에 기록 된 마지막 버그는 2005
있었습니다

2
죄송합니다-이 투표를 종료하려면 여기에 답변하기에는 너무 광범위합니다.
symcbean

1
@symcbean Re : PHP와 스레드-요즘 PHP의 핵심은 스레드로부터 안전하지만 사람들이 컴파일하는 다른 것들은 그렇지 않습니다. 나는 작년과 같이 최근에 물린 적이 있기 때문에 그것은 여전히 ​​"생산에 의존하기 전에 (확장 적으로) 테스트"상황입니다 ...
voretaq7

사용중인 OS에 따라 표준 설치에서 모든 옵션을 사용하지 못할 수도 있습니다.
John Gardeniers

답변:


415

이 다수있는 MPM 모듈 (다중 처리 모듈)하지만, 지금까지 가장 널리 (적어도 * nix에서 스크립트 플랫폼에서) 사용되는 세 가지 주요 것들이다 : prefork, worker,와 event. 본질적으로 이들은 Apache 웹 서버의 발전과 오랜 시간 (소프트웨어 용어로) 이력에 대한 컴퓨팅 제약 내에서 HTTP 요청을 처리하기 위해 서버가 구축 된 다양한 방법을 나타냅니다.


prefork

mpm_prefork그것은 .. 잘 .. 그것은 모든 것과 호환됩니다. 요청을 처리하기위한 많은 하위 프로세스를 분리하고 하위 프로세스는 한 번에 하나의 요청 만 처리합니다. 서버 프로세스가 거기에 있고 조치를 취할 준비가되어 있으며 스레드 마샬링을 처리 할 필요가 없으므로 한 번에 단일 요청 만 처리 할 때 실제로 최신 스레드 MPM보다 빠르지 만 동시 요청이 발생합니다. 서버 프로세스가 해제 될 때까지 줄을 서서 기다리기 때문입니다. 또한 프리 포크 자식 프로세스 수를 늘리려 고하면 심각한 RAM을 쉽게 줄일 수 있습니다.

스레드 안전하지 않은 모듈이 필요하지 않은 경우 프리 포크를 사용하지 않는 것이 좋습니다.

다음과 같은 경우에 사용하십시오 : 같은 쓰레드가 사용될 때 깨지는 모듈이 필요합니다 mod_php. 그래도 FastCGI 및을 사용해보십시오 php-fpm.

다음과 같은 경우 사용하지 마십시오 : 모듈이 스레드되지 않습니다.

worker

mpm_worker스레딩을 사용합니다. 동시성에 큰 도움이됩니다. 작업자는 일부 하위 프로세스를 분리하여 하위 스레드를 분리합니다. 프리 포크와 유사하게 일부 연결 스레드는 가능한 경우 들어오는 연결을 처리하기 위해 준비 상태로 유지됩니다. 스레드 수는 프리 포크에서 서버 수와 ​​같이 메모리 사용에 직접적인 영향을 미치지 않기 때문에이 방법은 RAM에 훨씬 더 친절합니다. 또한 연결은 프리 포크의 예비 서버 대신 사용 가능한 스레드 (일반적으로 사용 가능)를 기다려야하기 때문에 동시성을 훨씬 더 쉽게 처리합니다.

사용하는 경우 : Apache 2.2 또는 2.4를 사용하고 있고 주로 SSL을 실행하고 있습니다.

다음과 같은 경우 사용하지 마십시오 : 호환성을 위해 프리 포크가 필요하지 않으면 실제로 잘못 될 수 없습니다.

그러나 트레드는 요청이 아닌 연결에 연결됩니다. 즉, 연결 유지 연결은 스레드가 닫힐 때까지 (구성에 따라 시간이 오래 걸릴 수 있음) 항상 스레드를 유지합니다. 그래서 우리는 ..

event

mpm_event구조적으로 작업자와 매우 유사합니다. Apache 2.4에서는 '실험적'상태에서 '안정한'상태로 변경되었습니다. 가장 큰 차이점은 전용 스레드를 사용하여 연결 유지 연결을 처리하고 요청이 실제로 작성된 경우에만 요청을 하위 스레드로 처리한다는 것입니다 (요청이 완료된 후 즉시 해당 스레드를 해제 할 수 있음). 이것은 한 번에 모두 활성화되어 있지는 않지만 가끔 요청을하는 경우와 클라이언트에 연결 유지 시간이 오래 걸리는 클라이언트의 동시성에 유용합니다.

SSL 연결은 예외입니다. 이 경우 작업자와 동일하게 작동합니다 (연결이 닫힐 때까지 지정된 연결을 지정된 스레드에 붙이기).

사용하는 경우 : Apache 2.4 및 스레드와 비슷하지만 유휴 연결을 기다리는 스레드가 마음에 들지 않습니다. 누구나 스레드를 좋아합니다!

다음과 같은 경우 사용하지 마십시오 : Apache 2.4가 아니거나 호환성을 위해 프리 포크가 필요합니다.


서버에 6 개의 TCP 연결 (물론 연결 유지)을 다중화 하려는 오늘날의 slowloris , AJAX 및 브라우저에서 동시성은 서버 확장 및 확장에 중요한 요소입니다. 아파치의 역사는 이와 관련하여 묶여 있으며, 리소스 사용이나 규모면에서 nginx 또는 lighttpd와 유사하지는 않지만 개발 팀은 여전히 ​​관련성이 높은 웹 서버를 구축하기 위해 노력하고 있음이 분명합니다 오늘날의 높은 요청 동시성 세계에서.


3
-1 : IME, 작업자는 15 % 영역에서 httpd 설치 공간의 크기 만 줄입니다 (IIRC Linux는 RSS로 COW를보고하므로 포크보다 훨씬 많은 메모리를 사용하는 것처럼 보입니다). 프로세스의 커널 풋 프린트와 NPTL 스레드 사이에는 무시할만한 차이가 있습니다. 지구를 산산조각내는 데는 먼 길입니다. 스레드를 대기하고 할당하는 것이 (사전 포크) 프로세스를 대기 / 예약하는 것보다 용어를 예약하는 것이 더 효율적이라고 생각하는 이유를 이해하지 못합니다. SSL이 그녀에게 미치는 영향은 무엇이라고 생각하지 않습니다.
symcbean

9
@symcbean 따라서 15 % RAM 사용량이 중요하지 않다고 말하는가? 괜찮 습니다만, 제 의견은 그렇지 않을 것입니다. 동시성 성능 주장은 내 것이 아닙니다. 여기를 참조 하십시오 . 그리고 SSL의 차이점은 MPM 이벤트 문서에서 명확하게 설명되어 있습니다.The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Shane Madden

3
@ShaneMadden은`하지만 여전히 리소스 사용이나 규모 측면에서 nginx 나 lighttpd와 같은 수준에 미치지는 못합니다.
Kelly Elton

SSL 및 MPM 이벤트와 관련하여 @ShaneMadden : nginx가 아파치보다 이것을 훨씬 잘 처리하는지 알고 있습니까?
DASKAjA

mpm 모듈에 대해 알지 못하고 apache 2.4를 컴파일하면 event mpm module이라는 모듈과 함께 제공되며 mod_php7과 함께 작동합니다 (현재 apache2.4가 mysql 연결 제한을 초과하고 동일한 mysql 서버로 apache 2.2가 있기 때문에 mpm을 연구하고 있습니다) not)
BioHazard

8

다음은 gif와 함께 작동하는 방법에 대한 좋은 설명입니다.

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

간단히 말해서 2.4 이상 이고 리버스 프록시 (디스패처) 로 httpd가 필요한 경우 선택은 Event MPM입니다.


우리가 SSL을 사용하더라도? SSL이 아닌 웹 사이트에서 아파치를 프록시 및 SSL 인 에이 블러로 사용합니다.
bokan

예,이 최고입니다 만, 어쨌든 프록시하는 SSL에 대한 제한과 같은 @bokan 보이는
유라

와우 ~ 블로그 게시물은 허용되는 답변보다 낫고 gif는 훌륭합니다! 고마워 당신은 내 하루를 구했습니다.
Rick

6

2018 년 2 월 현재, Event MPM에 대한 Apache 2.4 문서에는 Apache를 프록시로 사용하면 2.4.24 이후의 "개선 된 연결 처리"가 설계된대로 작동하지 않게됩니다. 제한 사항 섹션을 참조하십시오 .

문제는 프록시로서 작업자가 응답의 끝을 알 수 없으며 리스너에게 제어를 반환하기 전에 전체 응답이 표시 될 때까지 기다려야한다는 것입니다.

따라서 아파치를 프록시로 사용하는 경우 작업자 모델을 사용하는 것이 가장 좋습니다. 프록시 환경에서 이벤트 모델에 이점이 있는지는 확실하지 않지만 아마도있을 수 있습니다.


5

주로 사용하려는 Apache 모듈에 따라 다릅니다. 나는 일반적으로 worker가 기본 선택이라고 생각하지만 일부 (이전) 모듈은 포크가 필요하며 프리 포크에 의존합니다.

환경 설정이 없으면 OS 배포에서 선호하는 종속성을 사용하는 것이 좋습니다. 예를 들어 우분투는 Apache2를 설치할 때 기본적으로 mpm-worker를 설치합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.