기본 콘텐츠로 건너뛰기

아파치 웹서버 2.4 MPM 지시자(Directive of Apache httpd server 2.4)



웹서버는 우리가 보통 쓰는 apache 2.4를 기준으로 생각했을 때 서버사양에 맞는 튜닝값을 찾아 내는 방법과 서버에서 따로 해줘야하는 설정값이 본 글의 주제입니다.

먼저 아파치 튜닝을 위해서 알아둬야하는 개념은 MPM입니다.

참고: APACHE 2.4 의 MPM 관련 글 

MPM은 Multi processing module (다중 처리 모듈)의 약자입니다.

먼저 대표적은 두가지 방식이 있는데 worker 와 prefork방식이 있습니다.
worker는 Thread MPM 이고 , prefork는 Process MPM 입니다.

worker 방식은 확장가능성이 중심이고 prefork는 안정성 및 오래된 소프트웨어와의 호환성에 중점을 두고 있습니다. 또한 다른 사용자아이디로 여러 호스트는 서비스하는 (prebuild)와 같은 기능도 제공 됩니다.

MPM은 아파치 컴파일시에 지정 할 수 있으며 (--with-mpm=worker, --with-mpm=prefork) 한 서버에서 한가지 방식의 MPM만 사용할 수 있습니다.

MPM을 설정하지 않으면 다음과 같이 각 OS에 맞는 기본값이 선택됩니다.

BeOS : beos
Netware : mpm_netware
OS/2 : mpmt_os2
유닉스 : prefork
윈도우즈 : mpm_winnt


1. worker MPM (apache 2.4 기준)

참고 : 워커 방식의 작동 방법 

MPM 모듈의 지시자
ServerLimit 16
StartServers 16
MaxClients 150
MinSpareThreads  25
MaxSpareThreads 75
ThreadsPerChild  25
MaxRequestPerChild 0 

ServerLimit => 구성 가능한 child 프로세스의 수
StartServers => 시작시에 초기회 되는 프로세스의 갯수
MaxClients => 동시에 접속 가능한 Client의 상한 , Process x Threads
MinSpareThreads => 새로운 연결을 위해 대기하는 최소 Thread
MaxSpareThreads => 새로운 연결을 위해 대시하는 최대 Thread
TheadsPerChild => 프로세스당 Threads
MaxRequestPerChild => 자식 프로세스가 처리할 수 있는 최대 갯수(0은 무한대)
                      오래된 프로세스를 죽이도 새로운 프로세스를 시작하는것에 의해 프로세스 리사이클 주기를 얼마나 할지 설정

* 프로세스 갯수
 - Active Child Process 의 최대 갯수는 MaxClients 값과 같고 ThreadsPerChild값에 의해 계산 => MaxClient(150)/ ThreadsPerChild(25) = 6 Process

위의예제지시자의 값으로 계산하면 6개의 프로세스가 최대.

세부 설명
ServerLimit 
 - 구성 가능한 child 프로세스의 제한값
 - 이 ServerLimit 이 필요 이상으로 높으면 미사용 메모리 공간이 많아지므로 적절하게 선택
 - ServerLimit은 prefork 방식의 지시자이지만, worker 와 event mpm 에서는 MaxRequestWorkers에 대응된다.
 - worker에 설정이 될때는 ThreadLimit 와 연계되어 MaxRequestWorkers의 값이 됨
 - event에서는 열린 연결에 대해서 얼마나 많은 프로세스를 실행하거나 끝낼지 정의한다.
 - prefork로 사용할 때, MaxRequestWorkers를 256(default) 보다 크게 설정하길 원하는 경우에  ServerLimit 값을 MaxRequestWorkers 보다 높게 설정하면 안된다.
 - worker로 사용할 때 MaxReqeustWorkers와 ThreadsPerChild 의 값을 16개의 서버 프로세스(default)보다 높이고 싶을때 사용,
 - event로 사용할때 정상적으로 종료되는 프로세스의 수를 16개 이상으로 증가시킬때 MaxRequestWorkers 와 ThreadPerChild 를 정의한다.


StartServers
  - apache 시작시 실행시킬 프로세스의 갯수
  - 웹서버 부하량에 따라 가변하므로 큰 의미가 없음
  - worker ,event 기본값 3
  - prefork 기본값 5
  - mpmt_os2 기본값 2

MaxClients( = apache 2.3.13 이전 버전 , MaxRequestWorker  = apache 2.4 버전)
  - 동시에 처리 될 최대 커넥션(request) 수
  - MaxClients 값을 초과한 후 들어온 요청들은 ListenBackLog에 의해 큐잉됨
  - ThreadsPerChild와 연결 되어 있음
  - 동접이 많은 경우에는 MaxClients 값을 증가 시켜야함.
  - OS의 FD 값을 증가시켜 MaxClients 값에 맞춰줘야함.

MinSpareThreads
  - 최소 Idle Threads
  - 만약 서버에 Idle Threads 가 적다면 child process는 idle thread를 MinSpareThreads 보다 커질때까지 생성한다.

MaxSpareThreads 
  - 최대 Idle Threads
  - 만약 서버에 Idle Threads 가 많이 있다면 MaxSpareThreads 보다 작게 만든다.

ThreadsPerChild 
  - 각 Child 프로세스가 생성할 Threads
  - Child 프로세스는 기동시 ThreadsPerChild 개수만큼 Thread를 생성하고 결코 더이상 생성하지 않는다.

MaxRequestsPerChild ( = apache 2.3.9 이전 , MaxConnectionPerChild로 변경)
  - 각각의 child 프로세스가 처리할 요청의 수를 제한
  - MaxRequestPerChild의 개수를 처리한 후 child 프로세스는 종료된다.
  - 0 으로 설정하면 무한대
  - MaxRequestsPerChild를 0 이외의 값으로 하는 것은 프로세스가(혹시모를) 메모리 누수로 사용할 수 있는 메모리의 양을 제한한다.


ThreadLimit
  - child 프로세스의 라이프 사이클 동안 ThreadsPerChild의 최대 생성값을 설정한다.
  - ThreadLimit가 ThreadsPerChild보다 훨씬 높다면 여문의 미사용 공유메모리를 할당한다.
  - ThreadLlimit 와 ThreadsPerChild 모두 시스템이 다룰 수 있는 양보다 높게 설정한다면 시스템은 불안정 해진다.
  - ThreadLimit의 값을 ThreadsPerChild 보다 높게 하지 말 것.

Note 
ThreadLimit 는 20000개로 제한이 걸려있습니다. (mpm_event는 100000, mpm_winnt는 15000) 이 값을 증가시키려면 소스에서 MAX_THREAD_LIMIT 부분을 수정하고 서버를 재컴파일 해야합니다.

댓글

  1. 질문이 있습니다 마지막에 쓰신

    ThreadLimit 는 20000개로 제한이 걸려있습니다. (mpm_event는 100000, mpm_winnt는 15000) 이 값을 증가시키려면 소스에서 MAX_THREAD_LIMIT 부분을 수정하고 서버를 재컴파일 해야합니다.

    이부분이요 그럼


    ThreadsPerChild 2048
    ThreadLimit 2048
    MAX_THREAD_LIMIT 여기다값을

    넣어주면 되는건가요???

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

RHEL6 보안 설정 (RHEL 7포함)

리눅스를 처음에 설치하면 보안에 관련된 설정이 아무것도 되어 있지 않습니다. 이 글에서는 서버를 처음 설치하고 반드시 해야하는 보안 설정에 대해 다뤄보려고 합니다. 설정 내용들 중에는 자신의 서버와 환경이 맞지 않을 수도 있으니, 조심하시기 바랍니다. 보안설정 시나리오는 다음과 같습니다.  1. 원격지에서 root는 로그인을 못하도록 한다.  2. 특정한 사용자에게만 su(switch user)를 통해서 root 권한을 줄것이다.  3. 패스워드의 유효기간은 90일이고 ,  패스워드의 최고 길이는 8글자이다.  4. 패스워드는 반드시 하나 이상의 대/소문자, 숫자. 특수기호가 들어가야 한다. 1. root의 원격접속 막기 원격접속을 관리하는 sshd 의 설정파일을 통해서 제어 할 수 있습니다. /etc/ssh/sshd_config 파일에서 PermitRootLogin을 no 로 바꿔줍니다. 2. 원격접속용 일반 사용자 생성 root가 원격 접속이 불가능한 상태이므로, 원격 접속을 위한 일반 계정을 하나 생성합니다. shell ]# adduser sysadmin 리눅스는 기본적으로 모든 사용자가 su (switch user)명령을 사용해서 root로 접근이 가능하지만 우리는 특정 그룹(대표그룹 wheel)에 su의 사용권한을 줄것입니다. 그러기 위해서는 먼저 생성한 일반계정의 그룹에 wheel 그룹을 추가합니다. shell ]# usermod -G wheel sysadmin 그리고 PAM에서 wheel 그룹만 su를 사용할 수 있도록 변경해줍니다. shell ]# vi /etc/pam.d/su #%PAM-1.0 auth        sufficient  pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth       sufficient  pam_wheel.so t

CentOS ,RHEL 6.4 이상에서 tboot 안전하게 제거하기

Tboot 이란 Trusted Execution Technology)를 리눅스에서 구현한 부트 프로세스 입니다. 목적은 운영체제의 신뢰성 입증과 운영체제가 신뢰된 환경에서 시작하는 것을 보장합니다. 또한 증명되지 않은 한 이용할 수 없는, 보안 기능이 추가된 신뢰된 운영체제를 제공하는 역할을 하고 있습니다. Intel TXT (Inten Trusted Execution Technology)는 시스템 소프트웨어와 로컬 및 원격 관리 어플리케이션, 이들의 측정값을 사용하는기 가능하도록 하는 소프트웨어와 플랫폼 콤포넌트의 측정을 제공하기 위해서 TPM (Trusted Platform Module)의 암호화 기술을 이용합니다. 이것은 BOIS가 공격을 당했거나 플랫폼의 설정이 바뀌는 것에 대한 대비를 하도록 되어 있습니다. 요약하면 tboot은 BIOS에 해킹 코드가 심어지는것을 대비하기 위해서 만들어졌는데 벤더에서 제공하는 서버의 BIOS는 정상이라 판단하고 OS를 설치하기 때문에 이것을 무효화 하는 방법을 알아보겠습니다. 1. 패키지 설치시에 제외 tboot 패키지는  Base system > Base > tboot (언체크) 킥스타트의 경우에는 %Packages 섹션에서 -tboot 로 명시 ----------------------------- %Packages @Base --optional -tboot ------------------------------ 이제 혹시나 설치가 되어버렸다고 한다면 다음과 같은 절차로 삭제를 해줍니다. 1. 새로운 부팅 메뉴 추가 # ARGS=$(grep "^[[:space:]]*module /vmlinuz-$(uname -r)" /boot/grub/grub.conf | sed -e 's/^.*x86_64 //' | head -n 1) # grubby --add-kernel=/boot/vmlinuz-$(uname -r) --args=&quo

centos 6.x 설치 (centos 6.x installation)

미디어 준비  https://wiki.centos.org/Download 위의 웹페이지에서 6.9(EOL: 30 Nov 2020)를 다운로드 받습니다. CentOS 6.9 릴리즈 노트 주요 변경 사항 1. LiveCD는 더 이상 제공되지 않습니다. LiveDVD를 USB 드라이브등에 복사해서 사용할 수 있습니다. 2. GNUTLS가 TLSv1.2를 지원합니다. (암호화를 사용하는모든 CentOS의 패키지에서 TLSv1.2를 사용할 수 있습니다.) 3. 안전하지 않은 Chiper에 대한 지원이 종료되었습니다. => MD5, SAH0, RC4 및 DH 매개변수의 사용에 영향이 있습니다. 4. 클라우드 도구인 cloud-init가 추가되었습니다.   => cloud-init패키지가 설정되지 않은 상태로 부팅을 하면 약 5분간 지연될 수 있습니다.   => cloud-init패키는 /etc/ssh/sshd_config의 설정중 패스워드로 접속가능한 부분을 no로 변경합니다.   PasswordAuthentication no 기본값으로 되어 원격지에서 ssh접속이 불가합니다. 5. UEFI지원 시스템에서 CentOS 6.x는 부트설정을 /boot/efi/EFI/redhat에 생성을 하는데, 이미 CentOS 혹은 RHEL이 설치된 시스템에서 문제가 발생할 수 있습니다. 6. CentOS 6.9의 UEFI:i386은 UEFI와 동장하지 않습니다.    UEFI환경에서는 CentOS 6.9 x86_64를 이용해 합니다.    BIOS상에서 SecureBook가 켜진 상태에서는 모든 버전의 CentOS 6.x 버전은 작동하지 않습니다.   => CentOS 6.x 버전에서 전체설치는 하는 경우에 system->base 패키지에서 tboot 패키지를 제외해야합니다.  본격적인 설치에 앞서 앞의 릴리즈 노트에 있는 사항 중 두 가지만 기억하면 됩니다. 1. UEFI 모드에서