답변:
Prefork와 worker는 두 가지 유형의 MPM 아파치가 제공합니다. 둘 다 장점과 단점이 있습니다.
기본적으로 mpm은 스레드로부터 안전한 prefork입니다.
Prefork MPM은 각각 하나의 스레드가있는 여러 하위 프로세스를 사용하며 각 프로세스는 한 번에 하나의 연결을 처리합니다.
작업자 MPM은 각각 많은 스레드가있는 여러 하위 프로세스를 사용합니다. 각 스레드는 한 번에 하나의 연결을 처리합니다.
자세한 내용은 https://httpd.apache.org/docs/2.4/mpm.html 및 https://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
mpm_netware
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 용 하이브리드 다중 프로세스, 다중 스레드 MPMprefork
스레드되지 않은 프리 포킹 웹 서버 구현mpm_winnt
-이 다중 처리 모듈은 Windows NT에 최적화되어 있습니다.worker
-하이브리드 다중 스레드 다중 프로세스 웹 서버를 구현하는 다중 처리 모듈지금의 차이 prefork
와 worker
.
Apache 1.3과 유사한 방식으로 요청을 처리하는 스레드되지 않은 사전 포크 웹 서버를 구현합니다. 스레드로부터 안전하지 않은 라이브러리와의 호환성을 위해 스레딩을 피해야하는 사이트에 적합합니다. 또한 각 요청을 격리하는 데 가장 적합한 MPM이므로 단일 요청의 문제가 다른 요청에 영향을 미치지 않습니다.
worker
MPM을 구현하는 하이브리드 다중 프로세스 멀티 스레드 서버와 하나가 아닌 스레드 안전 라이브러리 (참조 포함 된 다른 모듈을 사용하지 않는, 따라서이를 바람직되어야 더 나은 성능을 제공 이 논의 또는 이것 에 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에 대한 언급을 찾습니다.
apachectl -V
옆에있는 출력을보십시오 Server MPM
. 또한 또는을 확인 ps aux
하고 찾을 수 있습니다 . httpd
httpd.worker
apache2ctl -l
에는 작동하지 않았습니다. 을 사용해야했습니다 apachectl -l
.
httpd -V
다음과 같은 내용을 제공합니다.Server MPM: worker
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은 각각 많은 스레드가있는 여러 하위 프로세스를 사용합니다.