[apache] Apache Prefork 대 작업자 MPM

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



답변

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을 방문 하십시오.


답변

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 온).


답변

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


답변

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


답변

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

apache2ctl -l

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


답변

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


답변

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

1 : 프리 포크 2 : 작업자

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

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