Apache Prefork 대 작업자 MPM


113

Apache 구성 파일을 보면 Prefork 및 Worker MPM이 정의되어 있습니다. 차이점은 무엇이며 Apache가 사용하는 것은 무엇입니까?

답변:


120

Prefork와 worker는 두 가지 유형의 MPM 아파치가 제공합니다. 둘 다 장점과 단점이 있습니다.

기본적으로 mpm은 스레드로부터 안전한 prefork입니다.

Prefork MPM은 각각 하나의 스레드가있는 여러 하위 프로세스를 사용하며 각 프로세스는 한 번에 하나의 연결을 처리합니다.

작업자 MPM은 각각 많은 스레드가있는 여러 하위 프로세스를 사용합니다. 각 스레드는 한 번에 하나의 연결을 처리합니다.

자세한 내용은 https://httpd.apache.org/docs/2.4/mpm.htmlhttps://httpd.apache.org/docs/2.4/mod/prefork.html을 방문 하십시오.


11
"사용할 Apache MPM을 어떻게 선택합니까?"를 참조하십시오. serverfault.com/a/383634
Nazariy

@arvind // 각 스레드는 한 번에 하나의 연결을 처리합니다 .// 여기서 연결은 단일 사용자 또는 단일 요청을 의미합니까? PLS 설명
user1844933

21

Apache의 MPM (Multi-Processing Module)은 시스템의 네트워크 포트에 바인딩하고, 요청을 수락하고, 요청을 처리하기 위해 자식을 디스패치합니다 ( http://httpd.apache.org/docs/2.2/mpm.html ).

항상 하나의 MPM 만 서버에로드되어야 한다는 점을 제외하면 다른 Apache 모듈과 같습니다 . MPM은 구성 중에 선택 되고 구성 스크립트와 함께 인수 를 사용하여 서버로 컴파일됩니다--with-mpm=NAME .NAME 원하는 MPM의 이름입니다.

Apache는 컴파일 타임에 다른 것을 선택하지 않는 한 각 운영 체제에 대해 기본 MPM을 사용합니다 (예 : Windows mpm_winnt 에서 기본적으로 사용됨). 다음은 운영 체제 및 기본 MPM 목록입니다.

  • BeOS beos
  • 넷웨어 mpm_netware
  • OS / 2 mpmt_os2
  • 유닉스 / 리눅스 prefork( 갱신 2.4 ≥ 아파치 버전 : prefork, worker, 또는 event, 플랫폼 기능에 따라)
  • 윈도우 mpm_winnt

서버로 컴파일 된 모듈을 확인하려면 명령 줄 옵션을 사용하십시오 -l( 여기 에 설명서 참조). 예를 들어 Windows 설치에서 다음과 같은 결과를 얻을 수 있습니다.

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c

버전 2.2부터 다음은 사용 가능한 핵심 기능 및 MPM 모듈 목록입니다 .

  • core -항상 사용 가능한 핵심 Apache HTTP Server 기능
  • mpm_common -둘 이상의 MPM (Multi-Processing Module)에 의해 구현되는 지시문 모음
  • beos -이 다중 처리 모듈은 BeOS에 최적화되어 있습니다.
  • event -표준 작업자 MPM의 실험적 변형
  • mpm_netware Novell NetWare에 최적화 된 전용 스레드 웹 서버를 구현하는 다중 처리 모듈
  • mpmt_os2 OS / 2 용 하이브리드 다중 프로세스, 다중 스레드 MPM
  • prefork 스레드되지 않은 프리 포킹 웹 서버 구현
  • mpm_winnt -이 다중 처리 모듈은 Windows NT에 최적화되어 있습니다.
  • worker -하이브리드 다중 스레드 다중 프로세스 웹 서버를 구현하는 다중 처리 모듈

지금의 차이 preforkworker.

preforkMPM

Apache 1.3과 유사한 방식으로 요청을 처리하는 스레드되지 않은 사전 포크 웹 서버를 구현합니다. 스레드로부터 안전하지 않은 라이브러리와의 호환성을 위해 스레딩을 피해야하는 사이트에 적합합니다. 또한 각 요청을 격리하는 데 가장 적합한 MPM이므로 단일 요청의 문제가 다른 요청에 영향을 미치지 않습니다.

workerMPM을 구현하는 하이브리드 다중 프로세스 멀티 스레드 서버와 하나가 아닌 스레드 안전 라이브러리 (참조 포함 된 다른 모듈을 사용하지 않는, 따라서이를 바람직되어야 더 나은 성능을 제공 이 논의 또는 이것 에 Serverfault 온).


1
apache 2.4.7의 ubuntu-trusty-64 기본 설치는 이벤트 MPM을 사용합니다
Federico

9

자세한 내용 은 이것을 보십시오 . Apache가 여러 요청을 처리하는 방법을 나타냅니다. 기본값 인 Preforking은 여러 Apache 프로세스를 시작합니다 (여기서는 기본적으로 2 개이지만 httpd.conf를 통해 구성 할 수 있다고 생각합니다). 작업자 MPM은 요청마다 새 스레드를 시작합니다. 이는 메모리 효율성이 더 높다고 생각합니다. 역사적으로 Apache는 prefork를 사용했기 때문에 더 잘 테스트 된 모델입니다. 스레딩은 2.0에서만 추가되었습니다.


3
이벤트 MPM은 어떻습니까?
Vince Kronlein 2013 년

6

CentOS 6.x 및 7.x (Amazon Linux 포함)의 경우 다음을 사용하십시오.

sudo httpd -V

이렇게하면 구성된 MPM이 표시됩니다. 프리 포크, 작업자 또는 이벤트 중 하나입니다. Prefork는 이전의 threadsafe 모델입니다. 작업자는 다중 스레드이며 이벤트는 스레드 및 요청을 처리하는 데 더 나은 시스템 인 php-mpm을 지원합니다.

그러나 구성에 따라 결과가 다를 수 있습니다. 나는 php-mpm에서 많은 불안정성을 보았고 속도 향상은 없었습니다. 공격적인 스파이더는 php-mpm의 최대 자식 프로세스를 아주 쉽게 소진시킬 수 있습니다.

prefork, worker 또는 event에 대한 설정은 sudo nano /etc/httpd/conf.modules.d/00-mpm.conf(CentOS 6.x / 7.x / Apache 2.4의 경우)에서 설정됩니다.

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so

3

다음 명령을 실행하여 Apache가 preform 또는 worker를 사용하는지 알 수 있습니다.

apache2ctl -l

결과 출력에서 ​​prefork.c 또는 worker.c에 대한 언급을 찾습니다.


8
Apache는 두 MPM 모듈로 컴파일 할 수 있으므로 항상 신뢰할 수있는 것은 아닙니다. 두 개의 MPM 모듈이 나열되면 apachectl -V옆에있는 출력을보십시오 Server MPM. 또한 또는을 확인 ps aux하고 찾을 수 있습니다 . httpdhttpd.worker
reflexiv

2
제 경우 apache2ctl -l에는 작동하지 않았습니다. 을 사용해야했습니다 apachectl -l.
Vacilando

2
그들 중 누구도 나를 위해 나열되지 않은, 아직 아파치는 아파치 / 2.4.7 (우분투)의 벌금을 작동
karatedog

2
아파치 2.4.6을 실행하는 centos 7.x에서는 httpd -V다음과 같은 내용을 제공합니다.Server MPM: worker
runamok dec

2

RHEL7의 Apache 2.4에서 prefork 또는 worker mpm간에 쉽게 전환 할 수 있습니다.

실행하여 MPM 유형 확인

sudo httpd -V

Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

이제 파일을 따라 MPM 편집을 변경하고 필요한 MPM의 주석을 제거하십시오.

 /etc/httpd/conf.modules.d/00-mpm.conf 

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

mpm_worker 또는 mpm_event를 사용하려고 할 때 내 페이지가 작동하지 않는 이유
Leoh

0

Apache에는 다음과 같은 두 가지 유형의 MPM (Multi-Processing Modules)이 정의되어 있습니다.

1 : 프리 포크 2 : 작업자

기본적으로 Apacke는 preforked 모드, 즉 non-threaded pre-forking 웹 서버로 구성됩니다. 즉, 각 Apache 하위 프로세스는 단일 스레드를 포함하고 한 번에 하나의 요청을 처리합니다. 그 때문에 더 많은 리소스를 소비합니다.

Apache에는 Apache를 다중 프로세스, 다중 스레드 웹 서버로 전환하는 작업자 MPM도 있습니다. 작업자 MPM은 각각 많은 스레드가있는 여러 하위 프로세스를 사용합니다.

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