apache가 받아들인 요청을 처리 하기 위해 'child processes'에게 분배하는 방식을 말한다.
확장성이 필요한 사이트는 worker방식을 택하고, 안정성과 오래된 소프트웨어와 호환성이 필요한 사이트는 prefork를 보편적으로 사용한다. (Linux 기본 설정 prefork)
vi /etc/httpd/conf.modules.d
...
<IfModule mpm_prefork_module>
StartServer 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxConnectionsPerChild 0
</Ifmodule>
...
StartServers - 아파치 시작시 생성되는 기본 프로세스 개수
MinSpareServers - 최소 프로세스의 개수
MaxSpareServers - 최대 프로세스의 개수
MaxClients - 아파치 시작시 최대로 실행할 자식프로세스의 개수
M
...
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
...
StartServer - 아파치 시작시 생성되는 기본 프로세스 개수
ServerLimit(default : 16) - 최대 실행가능한 프로세스 개수
MinSpareThreads - 최소로 유지할 쓰레드 개수
MaxSpareThreads - 최대로 유지할 쓰레드 개수
ThreadsPerChild - 하나의 자식프로세스가 가질 수 있는 쓰레드 개수
MaxRequestWorkers(ServerLimit * ThreadsPerChild) - 동시에 처리될 최대 커넥션(request)의 수
MaxRequestsPerChild - 자식프로세스가 살아있는동안 요청을 받을 개수
MaxConnectionsPerChild - 서버 프로세스가 종료되기 전에 제공되는 최대 연결 수 ( 0의 경우 제한 없음 )
나는 worker 방식으로 하였다. MaxRequestWorkers를 잘 계산하는 것이 중요하다. 제대로 값을 맞추지 못하면 에러 발생가 발생하여 초기 설정으로 돌아온다.
prefork 방식은 계산방법이 인터넷에 잘 나와있으나 worker 방식은 설정을 계속 바꿔보면서 최적화를 맞출수 밖에 없다고 한다.
cpu, memory, apache 프로세스가 사용하는 memory 등을 고려해서 최적화를 맞추자.