외국 블로그를 보다가 Apache 2.x 버전에서 Prefork와 Worker 방식의 성능 비교를 올려 놓은 포스트가 있어 소개 한다.

블로그 원문은 여기를 클릭하면은 된다. 원문 보고 싶으신 분들은 링크 클릭해서 보세요. ^^ 참고로 불필요한 부분은 제외 했습니다.

솔라리스 10(06/06 U10)에서 Apache 2.2.4를 하나는 prefork MPM으로(-- with-mpm=prefork) 컴파일하고 다른 하나는 worker MPM으로(--with-mpm=worker)로 컴파일을 했다.

Prefork는 일반적으로 Single CPU 또는 Dual CPU에서 성능이 좋고 Worker는 일반적으로 멀티 CPU 시스템에서 성능이 좋다.

각 MPM은 기본 설정을 사용하였다.

  • Prefork
    <IfModule mpm_prefork_module>
          StartServers                   5
          MinSpareServers            5
          MaxSpareServers          10
          MaxClients                  150
          MaxRequestsPerChild     0
     </IfModule>
  • Worker
    <IfModule mpm_worker_module>
           StartServers                 2
           MaxClients               150
           MinSpareThreads       25
           MaxSpareThreads      75
           ThreadsPerChild         25
           MaxRequestsPerChild   0
    </IfModule>
그리고 테스트(Siege)를 위한 설정은 아래와 같다

  • Concurrent = 10
  • Time = 5M
  • Benchmark = true

Prefork에서 Apache Bench 결과(원문 그대로 사용)

% ./ab -n 10000 -c 10 http://192.168.1.80/index.html
...
Server Software: Apache/2.2.4
Server Hostname: 192.168.1.80
Server Port: 80

Document Path: /index.html

Document Length: 44 bytes
Concurrency Level: 10
Time taken for tests: 478.185521 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3160000 bytes
HTML transferred: 440000 bytes
Requests per second: 20.91 [#/sec] (mean)
Time per request: 478.185 [ms] (mean)
Time per request: 47.819 [ms] (mean, across all concurrent requests)
Transfer rate: 6.45 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 95.4 0 3380
Processing: 1 472 1178.0 2 10139
Waiting: 0 41 389.2 0 1013
Total: 1 475 1182.0 2 10139

Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 3
80% 4
90% 3372
95% 3377
98% 3379
99% 3381
100% 10139 (longest request)


Prefork에서 Siege 결과(원문)
Lifting the server siege... done.
Transactions: 6045 hits
Availability: 100.00 %
Elapsed time: 300.38 secs
Data transferred: 0.25 MB
Response time: 0.50 secs
Transaction rate: 20.12 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 9.97
Successful transactions: 6045
Failed transactions: 0
Longest transaction: 10.13
Shortest transaction: 0.00



Worker 아파치 벤치(원문)
% ./ab -n 10000 -c 10 http://192.168.1.80/index.html
...
Server Software: Apache/2.2.4
Server Hostname: 192.168.1.80
Server Port: 80

Document Path: /index.html
Document Length: 44 bytes

Concurrency Level: 10
Time taken for tests: 244.283673 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3160000 bytes
HTML transferred: 440000 bytes
Requests per second: 40.94 [#/sec] (mean)
Time per request: 244.284 [ms] (mean)
Time per request: 24.428 [ms] (mean, across all concurrent requests)
Transfer rate: 12.63 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 75.4 0 3378
Processing: 1 239 870.1 1 11898
Waiting: 0 16 229.6 0 3388
Total: 1 241 872.9 1 11898

Percentage of the requests served within a certain time (ms)
50% 1
66% 2
75% 2
80% 2
90% 4
95% 3373
98% 3379
99% 3380
100% 11898 (longest request)


Worker에서 Siege 결과(원문
Lifting the server siege... done.
Transactions: 11024 hits
Availability: 100.00 %
Elapsed time: 300.24 secs
Data transferred: 0.46 MB
Response time: 0.27 secs
Transaction rate: 36.72 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 9.91
Successful transactions: 1102
Failed transactions: 0
Longest transaction: 11.92
Shortest transaction: 0.00

MPM을 Worker로 했을때가 Prefork보다 약 두배정도 빠른 결과가 나왔다.

위의 결과를 봤을때 성능상의 이유로 Apache의 MPM을 Worker로 하는가 Prefork로 하는가 하는 결정을 해야될때 Worker방식으로 설정을 하는 것이 고성능을 얻을 수 있을거 같다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
Apache Web Server를 사용하면서 HTTP Method 중 특정 method만 제한을 걸고 싶은 경우가 있다.

apache 버전의 경우 서버단으로 제한을 걸수는 없고 디렉토리 별로 제한을 걸 수 있다.

method 제한을 거는 경우 에는 아래 처럼 설정하면은 된다.

<Directory /home>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit OPTIONS PROPFIND>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>
위와 같이 설정을 하면은 GET, POST 이외의 method로 접속하는 경우에는 405 Method Not Allowed 에러를 발생을 한다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
세션이 안 끊어지는 경우 일반적으로 세션의 쓰레기 처리(garbage collection) php.ini 의 두가지 설정에 영향을 봤습니다.

session.gc_maxlifetime = 세션을 지울 시간의 설정
session.gc_probability = 세션을 지울 확률을 설정

gc_maxlifetime의 값을 변경해 주시면 됩니다. 단위 (초), 기본값 1440

세션지속시간을 늘리는 방법은 세션시간을 늘리고 싶은 해당 페이지에 아래 코드를 이용한다.

ini_set("session.cache_expire", 3600); 
ini_set("session.gc_maxlifetime", 3600);  // 세션 만료시간을 한시간으로 설정
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
2.0이 기존에 1.3과는 다르게 자식 프로세스를 생성하는 방식이 아닌 멀티 쓰래드 방식으로 동작을 하기 때문에 좀더 빠르다고 하나 아직 throttle 모듈이 2.0용이 안나와 있으므로 본인은 1.3을 즐겨 사용한다...(사실 1.3만 사용한다... new21 커뮤니티에서 2.0에서 트래픽 제한 할 수 있는 방법 개발 했다고 하는데 개인적으로는 소스코드라도 공개를 해줬으면은 한다)

보통 사용하는 APM에서 아파치에 들어가는 php 모듈을 정적 모듈로 설치하는 방법과 DSO(Dynamic Shared Object : 동적 라이브러리 적재)방식으로 설치 하는 방법이 있는데 개인적으로 DSO 방식으로 설치하는 것을 권장한다.

정적 모듈이 약간 빠르기는 하나 정적 모듈의 단점은 PHP모듈만을 업그래이드 하기 위해 아파치도 다시 컴파일을 해야되는 문제점이 있다.

http://www.apache.org에서 1.3.34버전을 download 받는다.

download 받은 소스 tar파일을 압축을 해재 한다.

압축해재 디렉토리로 이동해서 다음과 같이 configure을 설정한다.

./configure --prefix=/usr/local/apache --enable-rule=SHARED_CORE --enable-module=so --enable-suexec --suexec-caller=nobody --suexec-uidmin=500 --suexec-gidmin=500 --suexec-userdir=public_html

configure 옵션 설명
--prefix=/usr/local/apache : 이제는 알거라 생각한다....그렇다 아파치를 /usr/local/apache에 설치하라는 뜻이다.
--enable-rule=SHARED_CORE : 특수한 규칙을 사용한다 SHARED_CORE는 기본으로 SOCKS4를 사용한다.
--enable-module=so : 모듈 규칙에 so를 사용한다.
--enable-suexec : CGI를 실행하기 위해 설정
--suexec-caller : suexec를 호출 하는 사용자가 nobody임
--suexec-uidmin=500 : uid의 값이 500이상인 사람만 CGI 사용가능
--suexec-gidmin=500 : gid의 값이 500이상인 사람만 CGI 사용가능
--suexec-userdir=public_html : 유저 디렉토리는 public_html임

make && make install 소스 컴파일 후 소스 설치
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
DSO로 설치한 아파치에 PHP를 동적 모듈로 설치한다.

./configure --with-apxs=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --enable-modules=so --enable-track-vars --disable-debug --with-language=korean --with-charset=euc_kr --with-sockets

configure 옵션 설명은 다음과 같다.
--with-apxs : 아파치가 DSO를 지원할 경우 DSO 모듈 컴파일을 위해 컴파일러를 지정한다. (아파치 2의 경우 옵션 이름이 with-apxs2이다.)
--with-mysql : 기본적으로 PHP에 들어가 있는 MySQL의 모듈 버전이 3.xx의 모듈을 내장하고 있다. 아무레도 현재 시스템에 설치되어 있는 MySQL의 기능을 다 못사용할 수도 있기 때문에 가급적이      면은 MySQL이 설치된 경로를 지정하여 시스템에 설치된 버전의 MySQL 모듈을 내장하는 것이 좋다.
--enable-modules=so : DSO모드를 지원하도록 컴파일 한다. 자세한 내용은 help에 있는 것을 번역하고 올리겠다.
--enable-track-vars : $_HTTP_*_VAR 변수 사용을 가능하게 한다. 구 버전 PHP기반으로 제작된 프로그램을 위해 가급적 사용하는 것이 좋다.
--with-language=korean : 언어를 한국어로 한다.
--with-charset=euc_kr : 기본 언어 셋을 한국어로 한다.
--with-sockets : 소켓 통신을 지원한다.

make && make install

httpd.conf
AddType application/x-httpd-php php ph inc
AddType application/x-httpd-php-source phps

Zend Optimizer 설치
http://www.zend.com에서 젠드 옵티마이저 다운로드
tar로 압축 해재 후 install 실행
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey
웹서버 설치 및 구현 방법

1. 소개 : 웹서버 연동시 Apache, PHP, MySQL 연통설치하는데, 최적화된 서버 운영을 위해 추가로 Zend-Optimizer라 는 프로그램을 설치 할 수 있다.

2. 플렛폼 :OS :REDHAT 9(Linux)

3. 다운로드 사이트 :

MySQL : www.mysql.com
dev.mysql.com/get/Downloads/MySQL  다운로드 하면 된다.
Apache : www.apache.org
http://httpd.apache.org/
PHP : www.php.net
http://www.php.net/downloads.php
Zend-Optimizer : www.zend.com
http://www.zend.com/store/free_download.php
가입하면 자신의 메일로 가입허용이라는 메시지가 올 것이다.
클릭하면 된다.(즉 가입해야 다운 받을 수 있다.)

4. 압축 공통 방식 : tar.gz파일, tar.bz2파일

tar.gz 파일명
예 : tar zxvf mysql-standard-4.0.23-pc-linux-gnu-i686.tar.gz
tar.bz2 파일명
예 : tar jxvf mysql-standard-4.0.23-pc-linux-gnu-i686.tar.bz2

4개의 파일을 모두 압축을 풀어 줘야 한다. 그럼 각각의 디렉토리가 생성 될 것이다.


5. 기존의 인스톨된 apache제거하기 : rpm패키지로 설치되어 있는 아파치 웹서버 프로그램을 삭제 해야 한다. 그렇다고 꼭 해야 하는 것은 아 니지만 공간도 차지하고 서로 충돌이 생길 가능성을 배제하긴 어렵다. 최적화를 위한 작은 성의정도....

- 아파치 데몬을 정지 시킨다.

/etc/rc.d/init.d/httpd stop
설명 : 아파치 1.3버전은 apache라는 이름으로 설치되지만, 2.0버전은
httpd라는 이름으로 설치되므로 두가지 모두 검색해서 나오는 것을 삭제
- rpm으로 아파치 검색 또는 제거

rpm -qi | grep httpd -> 아파치의 정보를 볼때 사용한다.
즉 화면에 정보가 추출되면 설치 되어
있으므로 제거 하면 된다.
rpm -e httpd --nodeps -> 의존성관련된 패키지를 먼저 제거해주고
RPM 패키지를 제거 한다.
- PHP, MySQL도 위와 같은 방식으로 하면 된다.(응용이 될 거라 생각한다.)

6. MySQL 설치 하기

- mysql 소스파일의 압축을 푼 디렉토리로 이동한다.
cd /usr/local/src/cd mysql-standard-4.0.23-pc-linux-gnu-i686
- configure로 환경 설정 한다.
./configure --prefix=/usr/local/mysql --with-charset=euckr

설명 : --prefix는 인스톨한 기본 디렉토리를 지정하는 옵션이다.
--with-charset=ecukr은 한글을 지원한다는 뜻이다.
보통 소스파일에서 환경설정시에 configure를 사용하는데 configure와
관련된 옵션은 ./configure --help 하면 볼 수 있다.
기타 다른 옵션은 불 필요 하므로 사용자에 따라 정의 하면 된다.
- make : 소스이기 때문에 컴파일 과정이 필요하다.
- make install : 컴파일한 것을 실행시켜 설치한다.

7. mysql의 테스트

/usr/local/mysql/bin/mysql_install_db
설명 : 처음 설치시 한번 꼭 실행한다. 이작업은 mysql기본 데이터베이스
인 mysql과 testdb를 설치해준다.

/usr/local/mysql/bin/mysqld_safe --user=root &
설명 : 설치된 디렉토리로 이동하여 데몬을 띄운다.

/usr/local/mysql/bin/mysql
설명 : mysql 실행


8. apache 설치
설치될 디렉토리만 configure 한다.
- 아파치 압축을 푼 디렉토리로 이동한다.
- ./configure --prefix=/usr/local/apache --enable-mods-shared=most --enable-module=so
설명 : prefix는 아파치가 설치될 디렉토리를 지정 하는 것이고,
         --enable-mods-shared=most --enable-module=so은 DSO 방식으로 PHP 모듈이 사용 될 수 있다.
       DSO 동적 모듈로 설정 할 경우 PHP를 업데이트 할때 처음부터 재 설치 하지 않아도 된다.
make
make install

9. 환경 설정 파일 ( httpd.conf ) 설정
- /usr/local/apache/conf/httpd.conf 환경설정파일
설명 : 자신이 설치한 디렉토리 및에 conf폴더가 보일 것이다.
conf폴더 밑에 httpd.conf의 파일을 연다.
- vi httpd.conf
- /ServerName 항목을 찾는다.
설명 : IP 주소나 Domain Name을 적는다.

- php관련 환경 설정 : AddType이라는 항목이 모여있는 곳으로 이동한 뒤
아래와 같이 추가한다.
- AddType application/x-httpd-php .php .htm .html .inc .php5 .php4
- AddType application/x-httpd-php-source .phps
- DirectoryIndex index.html index.php index.htm
설명 : www.mass.com/index.php를 할 필요가 없이 www.mass.com 으로 웹 페이지를 로딩 한다.

10. PHP 설치

- PHP압축을 푼 디렉토리로 이동한다.
- ./configure --prefix=/usr/local/php \
설명 : prefix는 PHP가 설치될 디렉토리를 지정한다.
 --with-apxs2=/usr/local/apache/bin/apxs \
설명 : --with-apxs2는 php가 아파치데몬에 DSO 모듈로 로딩 되도록 하기 위한 것이다.
 --with-mysql=/usr/local/mysql/ \
설명 : mysql과 연동 하기 위한 설정 부분 이다.
 --with-config-file-path=/usr/local/apache/conf \
설명 : php.ini 경로의 위치를 저정 하는 옵션 이다.
 --with-exec-dir=/usr/local/apache/bin \
설명 : 아파치 데몬의 실행경로를 지정 한다.
 --with-zlib --with-gd --with-ttf --with-png --with-jpeg-dir \
설명 :  --with-zlib : zlib 는 zip 나 gzip 에 사용되고 있는 압축 알고리즘을 라이브러리화한 것이다.
         --with-gd : GD에 있는 함수를 이용해서 이미지를 편집할 수 있는 라이브러리 이다.
         --with-ttf ,--with-png, --with-jpeg-dir : 위와 동일하며 각각의 설정 이다.
 --with-freetype-dir --with-gmp --with-xml --with-mod-charset \
 --with-iconv \
 --with-language=korean --enable-mbstr-enc-trans --enable-mbstring \
 --enable-track-vars \
 --enable-trans-sid \
설명 : --enable-track-vars는 HTTP_GET_VARS, HTTP_POST_VARS,
 --enable-iconv
설명 : iconv라는 함수를 사용 하기 위해 iconv 라이브러리를 설정 한다.

- make
- make install
- cp php.ini-dist /usr/local/lib/php.ini
설명 : PHP의 환경설정파일인 php.ini를 라이브러리 디렉토리에 등록 시킨다.

모든 설치는 완료 된 것이다. 하지만 이렇게 한다고 웹 서버가 구축 된 것은
아니다 왜냐면 환경 설정 부분에서 조금 남아 있기 때문이다.
마무리 작업을 하도록 하겠다.

11. Zend-Optimizer 설치
- Zend-Optimizer 압축을 푼 디렉토리로 이동한다.
- ./install.sh을 실행하여 절차대로 설치한다.

12. 아파치 테스트

- 문서는 /usr/local/apache/htdocs/ 밑에 있다 모두 지우고 다시 만들어도
된다. 그러므로 자신이 원하는 이름으로 만들어 본다.
- index.html 문서에 아래와 같이 만든다.
<HTML>
<HEAD>
<TITLE> 리눅스 웹 서버 만들기 </TITLE></HEAD>
<BODY>
<H1> 리눅스에 미치든가 아니면 하지 않는다. </H1><BR>
<H1> 리눅스를 자신의 것으로 만들면 된다. </H1><BR>
<BODY
</HTML>

13. 아파치와 PHP가 제대로 연동되는지 테스트

- test.php에 간단한 PHP문서를 이용하여 phpinfo()라는 PHP정보를 보여주는
함수를 이용해서 작성한 뒤에 웹상에서 불러오도록 한다.
- test.php 문서
<?
php.info();
?>

- 웹상에서 실행 해본다.
예) 192.xxx.xxx.xx/test.php
DNS를 구축 했을 경우 : mass.com/test.php

- 실행 해보면 zend와 각종 관련 정보가 보일 것이다. 그럼 이제 부터 나머지는
각자의 노하우로 하면 된다.


14. 간단한 TIP

- /etc/hosts 네트워크 환경 설정 파일 이용하기
설명 : 많은 사람들은 웹 페이지에서 사이트를 입력 할때 문자로 입력하지
숫자로 입력 하지는 않 숫자로 입력 하지는 않는다. 바로 그 부분을 담당하는 것이라고 생각
하면 된다. 자신의 localhost가 192.33.23.xx이라면 아래와 같이 하면된다.

- vi /etc/hosts
- 192.33.23.xx www.mass.com mass
설명 : 이렇게 하면 telnet 192.123.23.xx 하지 않고
telnet mass 하면 해당 주소로 바인딩 된다.
- /etc/hosts 설명 : DNS 서버를 사용하기 이전에 사용하던 파일로 IP주소와
호스트이름을 매핑시켜 데이터베이스화해서 사용하는 파일이다.


저자 : MASS 
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rey