강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
리눅스웹암호인증및 튜닝에 관한 연구
조회 : 3,100  


리눅스웹암호인증및 튜닝에 관한 연구

 

주제

리눅스 웹암호인증 및 튜닝에 관한 연구

 

 

 


목차 

1. 특정페이지 암호인증법(Linux)

1-1. 사용자인증이란?

1-2. 인증사용을 위한 설정사항들

1-3. .htaccess 파일만들기

1-4. 인증사용자의 ID, 패스워드 생성하는 방법

1-5. 인증사용자 웹브라우즈로 확인하기

1-6. 보안에 유의할 사항


2. 아파치를 활용한 가상호스트 설정법

2-1. 가상호스트(Virtual Host)란?

2-2. 하나의 IP Address로 여러개의 가상호스트 설정하기

2-3. 각각의 IP Address별로 가상호스트 설정하기

2-4. Port별로 운용하는 가상호스트 설정하기

2-5. Default 가상호스트 설정하기


3. 아파치웹서버 튜닝 #1 : 아파치 성능향상을 위한 설정


4. 아파치웹서버 응답속도 및 성능테스트(밴치마킹)

4-1. 아파치웹서버 응답속도 및 성능테스트 개론

4-2. Apache Benchmarking tool의 버전확인 (-V 옵션)

4-3. Apache Benchmarking tool의 도움말 보기(-h 옵션)

4-4. 테스트할 세션수 지정 및결과 분석법(-n requests 옵션)

4-5. 동시에 여러 개의 세션 밴치마킹하기(-c concurrency 옵션)

4-6. KeepAlive 옵션 활성화하여 테스트하기 (-k 옵션)

4-7. 테스트에 사용할 최대 허용시간 설정(-t timelimit 옵션)

4-8. 헤드정보와 함께 출력하기 (-v 옵션)

4-9. 결과를 웹문서(HTML코드)로 출력하기 (-w 옵션)

4-10. 그외의 다양한 테스트 옵션들


                                                   작성자

                                 박   성   수

((주)수퍼유저코리아 대표이사)

papa@superuser.co.kr



1. 특정페이지 암호인증법(Linux)

1-1. 사용자인증이란?

홈페이지제작을 해보신 분이나 웹사이트관리를 해보신 분이라면 홈페이지전체나일부의 내용을 ID와 패스워드로 인증을 받은 후에 접속가능하도록 설정을 해보신 경험이 있으리라 생각합니다.

특히 상업적인 사이트나 고급회원에 대한 특별서비스등은반드시 그런 서비스를 받을 만한 자격을 (인증창을 통하여)검증받은 후에 이용할 수 있도록 해야합니다.

이는 경제학의 고객 차별화와 관계가 있는 것입니다.

즉 100개의 페이지로 되어 있는 페이지에서 60개의 페이지는 일반방문자 누구나 볼 수 있도록 하고 나머지 40개의 페이지에 대해서는 특정권한(가입등의 절차를 거친 고객)을 가진 고객들에게만 서비스되는 정보라고 할 경우에 무료로 회원등록을 하게하여 이런 정보를 제공한다고 하면 아마도 일반방문자들은 회원등록을 하게될지 모릅니다.

이렇게 등록한 고객과 등록하지 않은 일반고객과의 서비스에 대한 차이를 두어 등록고객에게는특별한 서비스를 받고 있다는 자부심을 줄 수 있도록하여 고객유치를 할 수 있도록 하는 정책입니다. 이런 사용자 인증을 통한 특정페이지 접속허용은 요즘 한창 떠오르고 있는 유료정보와 CP등에서 활용이 될 수 있는 것입니다.

위의 설명처럼 전체 페이지중의 일부만을 사용자인증을 통해 접속을 허용할 수 있으며, 또한 홈페이지 전체를 처음부터 사용자 인증을 통해 접속을 허용하게 할 수도 있습니다.

단 한가지 주의 할 점은 유료로 운영을 할 경우에는 등록절차를 거쳐서 접속을 하게될 가입자들의 개인정보와 ID 및 Password등의 개인정보를 철저하게 보호해야 한다는 것입니다.

이런 보안을 위해서 쿠키를 이용하는 것과 아파치에서 제공하는 다른 인증모듈을 통해 해결할 수가 있습니다.

후자의 예를 든다면 텍스트파일 인증모듈(mod_auth), DBM인증모듈(mod_auth_dbm), Berkeley DB 인증모듈(mod_auth_db), Anonymous 인증모듈(mod_auth_anon), PostgreSQL인증모듈등이 있습니다.

사용자 인증을 통해 접속을 허용하는 사이트를 운영하는 경우는 다음과 같은 웹사이트를 운용하려고 할 경우에 주로 쓰이고 있습니다.

- 회원제로 운영하는 사이트

- 특정그룹별로 접속을 허용하는 사이트

- 일반에겐 공개페이지를 사내직원에겐 업무용페이지를 보여주는 사이트

- 운영자용 페이지에 접속할 때

홈페이지 전체나 일부에 접근하려고 할 때에 다음과 같은 창이 뜨면서 ID와 패스워드를 입력하라는 창입니다.

 


1-2. 인증사용을 위한 설정사항들

이런 인증작업을 하기 위해서 웹호스팅 사용자들은 다음과 같은 작업을 하셔야합니다. 특정페이지에 사용자암호를 걸기 위해서는 세개의 파일이 필요합니다.  즉, .htaccess와 .htpasswd 그리고 htpasswd이 그것입니다.

 .htaccess <- 점( . )주의

인증을 어떻게 할것인지에 대한 설정(인증방법 및 설정파일지정등)

직접만들어줘야함.(아래에서 설명됨)

htpasswd

위의 .htaccess의 내용을 기준으로하여 인증할 ID와 패스워드를 만들어주는  명령어(유틸리티)이며 이 명령의 결과 아래의 .htpasswd라는 파일이 생성됨.

아파치웹서버를 사용하는 서버사용자는 기본적으로 사용할 수 있음.(즉, 서버에 존재함)

  .htpasswd <- 점( . )주의

htpasswd라는 명령어의 결과 자동적으로 생성되며 인증받을 사용자의 ID와 패스워드가 저정될 파일. 물론 파일이름을 바꿔줄 수도 있음. 특정디렉토리에 대한 인증을 하기위해 고객분들이 해야할 작업내용과 절차는 다음과 같습니다.

     사용자인증을 할 디렉토리로 이동합니다. 

         .htaccess파일의 내용을 작성합니다.

         htpasswd 명령어(유틸리티)를 사용하여 허가할 사용자의 ID와 패스워드를 만든다. (htpasswd파일이 없을 경우에는 which등의 명령어를 사용하여 찾아본다.)

     웹브라우즈를 통하여 사용자인증이 되는지 확인해 본다.

설명드린 바와같이 첫 번째 파일(.htaccess)은 직접 만들어 주셔야 하며 두 번째 파일(.htpasswd)은 세 번째 유틸리티(htpasswd)를 이용해서 만들어 주면 됩니다.

그리고 세 번째 파일은 Linux의 경우에 보통 /usr/bin에 존재하며 이 디렉토리는 일반적으로 계정사용자에게 path로 잡혀있으므로 사용자들은 그냥 사용이 가능합니다.

참고로 htpasswd파일의 위치를 찾지 못했을 경우에 다음과 같은 명령으로 위치를 확인할 수 있습니다.

일반사용자의 경우에는 다음과 같이 which 나 whereis로 확인가능하며, 만약 시스템관리자일 경우에는 find라는 명령어로 파일의 위치를 확인할 수 있습니다.



위의 명령어는 루트디렉토리(/)에서부터 htpasswd라는 파일(-name)을 찾아서 (find) 보여달라(-print)는 명령입니다. 위에서 출력된 결과는 /usr/bin에 있다는 것입니다. 참고로 리눅스에서는 -print옵션을 사용하지 않아도 기본옵션이므로 -print 옵션이 적용됩니다.

1-3. .htaccess 파일만들기

.htaccess 파일은 사용자들이 직접 에디터(vi, 메모장등)를 이용해서 아래와 같이 만들어 주셔야 합니다.

텔넷으로 Linux나 UNIX시스템에 로그인 했다면 vi를 사용하고, vi 사용이 어려우신 분들은 PC에서 메모장을 열어서 만들어 주신 후에 ftp client(Ws_ftp, Cute_ftp등)를 이용하여 서버에 있는 자기계정의 사용자인증 할 특정디렉토리로 전송을 해 주셔야합니다.

이때 전송모드를 반드시 ASCII모드로 해주셔야 합니다.

.htaccess파일의 예가 아래에 있습니다. 여러분의 사용편의를 위하여 .htaccess파일의 작성예는 다음과 같으며, 아래의 파일내용중 AuthUserFile 내용만을 고객의 디렉토리 위치대로만 바꿔주시면 됩니다.

 ● AuthName "메뉴얼랜드"

인증창의 이름으로 임의로 지정가능 하며 보통은 홈페이지이름을 적는다.사용자는  회사이름이나 그룹이름, 홈페이지이름등을 적당히 적어주시면 됩니다.

AuthType Basic

인증타입은 일반적으로 Basic으로 합니다.

AuthUserFile /home/myid/www/.htpasswd

htpasswd유틸리티를 실행할 경우 이 파일(.htpasswd)이 생성됩니다.

AuthGroupFile /dev/null

그룹으로 인증확인을 할 경우에 그룹인증 파일명을 입력합니다.

<Limit GET POST>

GET방식과 POST 방식의 접근만을 허용하는 설정입니다.

require valid-user

인증된 사용자만이 접속을 허용하는 설정입니다.

</Limit>

닫기


1-4. 인증사용자의 ID, 패스워드 생성하는 방법

이제 htpasswd라는 명령어를 사용하여 인증받을 사용자를 생성하도록 하겠습니다. 즉 htpasswd라는 명령어를 사용하여 .htpasswd라는 파일을 만들어 줘야합니다.

이 파일(.htpasswd)은 인증 할 사용자의 ID와 패스워드리스트를 보관하고 있는 파일이며, 해당 페이지로 접근하려할 때 인증창이 뜬 후에 이 파일에 있는 ID와 패스워드를 맞게 입력하면 접속을 허용하게되고, 그렇지 않으면 접속허용을 불허하게 됩니다.

이 파일은 바로 앞에서 생성한 .htaccess파일내의 "AuthUserFile"항목에서 지정했던 파일과 같은 디렉토리 위치(/home/sspark/www)에 동일한 파일이름(.htpasswd)으로 존재해야 합니다.

이 파일의 위치가 정확히 지정되지 않아서 인증창이 뜨지 않는 경우가 많으므로 정확히 확인하도록 하십시요. 그럼 이제 .htpasswd 파일을 만들어 보겠습니다.



처음으로 사용자를 생성할때에는 반드시 -c옵션을 사용해야합니다.

-c 옵션은 한번만 사용하시고, 이후에는 옵션없이 그냥 사용하시면 됩니다.

만약 위의 명령의 결과가 "No such file or directory" 라면 이는 htpasswd명령어를 찾지 못하는 경우이며, which나 whereis등의 명령어로 확인 한 후에 path가 잡혀있지 않다면 절대경로로 명령어를 사용하셔야합니다.

예를 들어 파일의 위치가 /usr/sbin이라면 절대경로로 명령을 사용하는 경우의 예는 다음과 같습니다.

$ /usr/sbin/htpasswd -c .htpasswd webmaster

위의 명령어가 정상적으로 종료되었다면 .htpasswd파일이 생성되었을 것입니다. htpasswd파일은 점(.)으로 시작하는 숨겨진파일이므로 그냥 ls로는 볼 수가 없습니다. 따라서 -a옵션과 함께 사용하셔야만 보실 수가 있습니다. 아래의 예처럼 "ls -al"로 확인 해야만 .htpasswd파일을 볼 수 있습니다.

그리고 "cat .htpasswd"라는 명령어는 위에서 등록한 webmaster라는 사용자를 등록한 후에 정상적으로 등록이 되어있는지를 확인하는 것입니다. 사용자를 등록할 때마다

.htpasswd 파일에는 ID와 암호화된 Password가 누적되어 입력됩니다.

암호는 cript()라는 함수를 사용하여 생성하게 됩니다.  이후에는 -c라는 옵션없이 htpasswd라는 명령어를 사용하여 사용자를 계속 추가해 주시면됩니다.  사용자를 추가생성 할 때에는 다음과 같은 형식으로 사용하면 됩니다.

형식 : htpasswd .htpasswd 등록할사용자ID

이런 형식으로 명령을 실행한 다음에는 아래의 예에서 보는 바와 같이 패스워드의 입력과 재확인을 하면 등록이 완료됩니다.



위의 예에서 sspark, minoz, hokiz 사용자 세명을 추가등록 하였습니다. 이들 명령어를 잘 보시면 명령의 형식이 모두 동일하다는 것을 알 수 있습니다. 그리고 마지막에 cat으로 생성한 ID와 패스워드를 확인해 보았습니다. 자, 그럼 인증에 사용할 ID와 패스워드를 처음등록하는 방법과 추가로 등록하는 방법에 대해서 알아보았는데 한가지 궁금한 것이 생겼습니다. 원하는 자기의 고객이 사용하는 패스워드를 여러 가지 이유로 인하여 바꿔달라고 요구할 수 있습니다. 사용자의 패스워드변경은 어떻게 하면될까요?

대답은 의외로 간단합니다. 바로 앞에서 사용자를 추가하는 방법 그대로 해 주시면됩니다.

단 패스워드를 입력할 때 사용중인 기존의 패스워드 대신 원하는 패스워드를 입력하면됩니다. 아래의 예를 보십시요.



보시는 바와 같이 사용자를 추가생성하는 방법과 사용중인 ID의 패스워드를 변경하는 방법은 동일하다는 것을 알 수 있습니다.


1-5. 인증사용자 웹브라우즈로 확인하기


드디어 위에서 생성한 인증사용자를 웹브라우즈로 확인할 때가 왔습니다.

정상적으로 작업이 완료되었다면 해당 페이지로 접근하려고 할 때 다음과 같은 창이 뜰 것입니다.

보시는 이 창에서 앞에서 등록한사용자의 ID와 패스워드를 입력하면 원하는 페이지로 들어갈 수가 있습니다.

만약 등록이 되어있지 않은 사용자나 등록된 사용자의 암호를 3회이상 잘못 입력했을 경우에는 access.conf 파일의 해당디렉토리 인증부분에 "ErrorDocument 401 "죄송합니다. 가입인증이 되지 않았습니다."와 같은 설정을 해 두었기 때문에 다음과 같은 에러메시지 창이 뜰 것입니다. 이런 간단한 메시지 뿐만아니라 html파일을 지정해서 에러 안내페이지로 사용할 수도 있습니다.


1-6. 보안에 유의할 사항

htpasswd 유틸리트를 이용하여 사용자 인증을 하는 경우에 다음의 보안사항에 유념해야 합니다.  이 글을 쓰고 있는 이 순간 "보안사항"에 대해서 언급을 하는 것이 옳은 것이지, 아니면 옳지 않은 것인지에 대해서는 확신할 수 없지만 이 부분에 대해서는 알만한 분들은 다들 알고 계실 것이라 생각합니다.

여기서 말씀드리는 보안이라는 것은 이 사용자인증에 대한 부분에 국한된 것이 아니라 모든 웹사이트의 공통적인 문제라고 할 수 있습니다.

다음의 웹브라우즈로 확인 가능한 웹브라우즈창 두 개를 잘 살펴보기시 바랍니다.

   

어떻습니까?  좀 전에 만들었던 .htaccess파일의 내용과 .htpasswd파일의 내용이 웹브라우즈에서그대로 보이지 않습니까?  누구나 이런 것이 가능하다는 것은 아닙니다.

암호와 패스워드로 사용자 인증을 거친 후에는 이렇게 확인이 가능하다는 것입니다.

즉, 인증을 거치고 난 뒤에 "http:도메인/해당디렉토리/.htaccess" 이런식으로 웹에서 불러보면 .htaccess에 있는 인증옵션과 .htpasswd에 어떤 사용자들이 있는가를 볼 수 있다는 의미입니다.

물론 패스워드는 cript()라는 함수로 암호화 되어 있지만, 크랙(crack) 같은 툴(프로그램)을 사용하면 조금의 노력으로 패스워드를 알 수가 있기 때문에 위험하다고 할 수 있습니다.

그럼, 어떻게 하면 이런 낭패를 당하지 않게 할 수 있을까요?

방법은 두가지가 있습니다.

첫 번째 방법은 default로 지정된 .htpasswd 파일이름 대신에 다른 이름을 사용하는 것이고, 두 번째는 .htpasswd 파일을 사용자의 홈페이지 디렉토리의 이전디렉토리에 두면 이런 낭패쯤은 방지가능합니다.

웹호스팅서비스를 이용하는 고객의 예를 들어 본다면 다음과 같이 할 수 있습니다.

    .htpasswd 파일 대신에 .kingpasswd를 사용합니다.(임의지정가능)

        /home/sspark/www 대신에 /home/sspark/pw/ 디렉토리에 .kingpasswd를 저장하여 사용합니다.

계정가입자의 홈디렉토리가 /home/sspark/www이므로 웹으로 확인가능한 곳은 이디렉토리 이하가되므로 웹으로는 도저히 확인할 길이 없어지는 셈입니다.

자기가 운용 및 관리하는 사이트가 유료로 운용되고 있다면 이정도의 보안으로도 부족하지만 최소한의 보안을 하여 등록된 사용자를 보호하는 것이 사이트관리자의기본의무가 아닐까합니다.



2. 아파치를 활용한 가상호스트 설정법

2-1. 가상호스트(Virtual Host)란?

웹서버에는 기본적으로 존재하는 호스트가 있습니다.  이를 웹서버의 주호스트(main host)라고 합니다.  하나의 웹서버에는 주호스트 외에 별도의 홈디렉토리를 가진 여러개의 호스트를 설정하여 운용할 수 있습니다. 주로 웹호스팅 서비스에 사용되며 주호스트외에 나머지 호스트들을 모두 가상호스트(virtual host)라고 합니다.

이런 가상호스트를 가장 적절하게 이용하는 것이 웹호스팅 서비스입니다.

웹호스팅 서비스를 하려면 하나의 서버에 여러 가입자를 수용해야 하는데 이때 아파치 웹서버의 가상호스트로 설정하여 운용하면 해결할 수 있습니다.

물론 다른 웹서버에도 이런 기능은 있으며 설정하는 방법에는 조금씩 차이가 있습니다.

이런 가상호스트에는 몇가지 종류가 있습니다. 즉, 다음과 같은 종류가 있습니다.


이름기반의 가상호스트(Name-based virtual host)
주소기반의 가상호스트(IP-based virtual host)
포트기반의 가상호스트(Port-based virtual host)
기본 가상호스트(Default virtual host)

위의 네가지 경우 모두 하나의 물리적인 서버에서 운용된다는 것과 다수개의 가상호스트를 운용한다는 것을 전제로 합니다.

이름기반의 가상호스트는 하나의 IP Address에 여러개의 가상호스트를 운용하는 것이며, 주소기반의 가상호스트는 가상호스트 각각에 하나씩의 IP Address를 할당하여 운용하는 것이고 포트기반의 가상호스트는 하나의 동일한 호스트에 포트만 다르게 지정하여 운용하는 것입니다.

그리고 마지막 기본 가상호스트는 설정되어있는 어떤 호스트도 해당사항이 없는 호스트의 로딩요구를 받았을때 기본으로 응답하게 될 호스트를 지정하게 됩니다.

자 그럼 위에서 제시한 4가지 방법의 가상호스트 운용방법을 하나씩 배워보도록 하겠습니다.


2-2. 하나의 IP Address로 여러개의 가상호스트 설정하기

일명 이름기반의 가상호스트(name-based virtual host)라고 합니다.

이름기반의 가상호스트는 하나의 IP Address에 여러개의 가상호스트를 사용하는 것이며 이 방법이 가장 보편적인 방법입니다.

인터넷 사용인구의 급격한 증가로 인하여 IP Address가 많이 필요하게 되었고 급기야는 IP Address가 모자라는 지경에 이르게 되었습니다.

이런 시점에서 웹호스팅 사업등과 같이 하나의 서버에 여러개의 웹서버를 운용해야하는 오늘날의 여건에는 이름기반의 가상호스트가 가장 적절하다고 할 수 있습니다.

아래의 예는 하나의 IP Address(168.126.72.51)에 3개(A, B, C)의 가상호스트를 설정한 것입니다.


2-3. 각각의 IP Address별로 가상호스트 설정하기

일명 IP Address기반의 가상호스트(IP-based virtual host)라고 합니다.

웹호스팅 사업을 하는 초기에 사용된 방법으로 주소기반의 가상호스트는 하나의 시스템에 여러개의 IP Address를 할당하여 가상호스트에 각각 하나씩 할당하여 운용하는 것입니다.

가입자에게 각각 하나씩의 IP Address를 할당하는 주소기반의 가상호스트로 웹호스팅등의 서비스를 하려면 IP Address의 개수를 수용할 가입자 수 이상 확보를 해 둬야 합니다.

약 1년전 까지만 해도 대부분의 웹호스팅업체에서는 주소기반의 가상호스트로 운용을 했었습니다.

하지만 인터넷의 활용인구가 급속히 늘어난 현재 웹서버등의 수요와 함께 IP Address에 대한 수요도 급팽창하게 되어 IP Address를 확보하기가 어려워 졌습니다.

웹호스팅서비스의 초기 시절에는 주소 기반의 가상호스트로 서비스를 했으나 현재는 이름기반의 가상호스트로 운용을 하지 않을 수 없는 실정이 되었습니다.

하지만 이름기반의 가상호스트보다도 더 안정적이고, 더 효율적이며 관리하기도 편한 것이 주소기반의 가상호스트입니다.

아래의 예는 3개의 가상호스트에 각각 하나씩의 IP Address를 할당하여 운용하기위한 설정입니다.

이 경우에 서버의 기본 IP Address인 168.126.72.51은 주호스트인 ciss9.kornet.net(가)으로 할당하고 첫번째 가상호스트인 www.manualand.co.kr(나)은 168.126.72.52에 할당하였습니다. 그리고 두 번째 가상호스트인 www.hyung.co.kr(다)은 168.126.72.53에 할당하였습니다.  이로써 각각의 웹사이트를 하나의 물리적인 서버에서 별도로 관리할 수 있는 것입니다.


2-4. Port별로 운용하는 가상호스트 설정하기

일명 Port기반의 가상호스트(Port-based virtual host)라고 합니다.

포트기반의 가상호스트는 하나의 웹서버에서 기본포트 80번은 주호스트로 설정하고 여러개의 다른 포트를 지정하여 원하는 만큼의 가상서버를 운용하는 방법입니다.

예를 든다면 80번은 주호스트로 사용하고 8080번, 8081번 그리고 8082번의 포트를 지정하여 같은 가상호스트로 사용하는 것입니다. 즉, 예를 든다면 다음과 같습니다.

이와 같이 얼마든지 다른 포트를 지정하여 원하는 만큼의 가상호스트를 운용할 수 있습니다.


2-5. Default 가상호스트 설정하기

기본 가상호스트란 예기치 못한 IP Address와 포트의 로딩요구를 받았을 때 기본 가상호스트로 지정되어 있는 호스트를 띄워주는 것입니다.

즉, 지정된 가상호스트가 없을 때 기본적으로 응답할 호스트를 지정해 둔 것이 기본 가상호스트입니다.

이상으로 가상호스트에 대한 설명을 모두 마치면서 활용여하에 따라 얼마든지 확장활용이 가능하다는 것을 말씀드리면서 이 확장활용은 여러분들에게 맡기겠습니다.



3. 아파치웹서버 튜닝 #1 : 아파치 성능향상을 위한 설정


아파치웹서버를 관리하다 보면 가끔씩 이런 경험을 한 적이 있었을 것입니다.  하드웨어의 사양과 서버의 성능 및 네트워크의 부하가 전혀 없음에도 불구하고 웹서비스 속도가 현저하게 떨어지는 경험이 있을 것입니다. 물론, 접속자 수가 매우 적고 서비스량이 적은 경우에는 다르겠지만 다른 문제가 전혀 없음에도 불구하고 웹서비스 속도가 굉장히 떨어지는 이유는 아파치의 컴파일시 옵션이 제대로 맞추어 지지 않았거나 아파치 환경설정파일(httpd.conf)의 설정문제일 가능성이 대부분입니다.


네트워크와 서버의 하드웨어 사양 문제가 아님에도 불구하고 이와 같은 웹서비스 성능저하가 초래된다면 아파치 튜닝작업을 해보셔야 할 것입니다.


이번 절에서는 아파치설치시에 하게되는 컴파일 옵션설정과 아파치 운영중에 httpd.conf 파일의 설정을 운영하고있는 서버에 맞게 설정하는 방법에 대해서 간단히 알아볼까 합니다.


만약, 여러분께서 관리하고 계신 서버의 하드웨어 사양이 아래의 조건을 만족한다면 필자가 여기서 권하는 설정방법을 이용하시면 아파치 서버의 성능향상에 큰 효과를 얻으실 수 있을 것입니다.


- 조건 1 : Dual CPU (CPU가 2개이상)

- 조건 2 : RAM은 최소 512이상임(1G 권장)

- 조건 3 : 서비스되는 사이트의 방문자수가 많은 편임

- 조건 4 : 네트웍의 대역폭은 충분함


중급이상되는 대부분의 사이트에서는 이런 조건을 대부분 만족할 것입니다. 필자가 굳이 이런 조건을 제시한 것은 초급 이상되는 웹사이트는 요즘 대부분 이런 조건을 모두 갖추고 있기 때문입니다. 따라서 이런 환경을 갖추고 있다면 웹서버의 성능향상을 위하여 다음과 같은 방법으로 아파치를 튜닝해 보시는 것도 좋은 방법이 될 것입니다.


먼저, 아파치를 컴파일 과정에서 configure작업과정이 있습니다. 이 configure 작업을 하기 전에 다음과 같은 설정작업을 해주시는 것이 좋습니다.


Configure를 하기 전에 다음과 같이 /usr/local/apache/src/include 위치에 있는 httpd.h 라는 파일을 열어서 "HARD_SERVER_LIMIT" 설정항목을 찾아가 보십시오.


기본값으로 256이 설정되어 있습니다. 이 설정은 httpd.conf 파일에서 설정되는 "MaxClients"항목을 상한치 값을 설정해 둔 것입니다. 즉 동시에 접속할 수 있는 방문자 수라고 할 수 있을 것입니다. 좀 더 정확한 의미로는 동시에 생성할 수 있는 httpd 데몬수가 될 것입니다. 참고로 방문자수와 실행되는 httpd의 데몬수와는 차이가 있을 수 있습니다. 한번 방문한 사람이 여러 개의 httpd 데몬을 생성하는 경우가 있기 때문입니다.


어쨌든 초기 httpd.h 파일의 "HARD_SERVER_LIMIT"의 초기 설정값이 256이기 때문에 서버의 하드웨어 사양이 아무리 좋다고 해도 아파치웹서버는 동시에 httpd 데몬을 256개 이상 생성할 수 없습니다.


다음은 기본적으로 설정된 "HARD_SERVER_LIMIT"값이 256이라는 것을 나타내고 있습니다.


이 설정값을 다음과 같이 1024로 수정하여 아파치를 설치하여 보십시오.


이 예는 "HARD_SERVER_LIMIT"값을 1024로 수정한 예입니다. 보통 필자는 서버의 하드웨어 사양이 충분하다면 1024가 아니라 1280로 설정하여 사용합니다. 이렇게 설정해 두면 동시에 접속할 수 있는 방문자수는 1024까지 허용 됩니다.


즉, httpd.conf파일에서 "MaxClients" 설정값을 1024까지 높여서 사용할 수 있다는 것을 의미합니다.


그리고 이에 맞는 httpd.conf 파일의 설정내용을 다음과 같이 적당한 값으로 수정해서 사용하십시오.


MaxKeepAliveRequests 값을 높을수록 성능은 좋아집니다.


앞에서 httpd.conf파일에 대한 자세한 설명을 드린 것 처럼 이값의 의미는 "연결을 유지한채로 허용할 수 있는 최대 요구수"를 나타냅니다. 이 값이 0라면 제한하지 않는다는 의미가 되며 일반적으로 이 수치가 높을수록 성능은 좋아지게 됩니다. 따라서 필자는 이 수치를 10000으로 설정하였습니다.


KeepAliveTimeout 값은 동일한 방문자(Client)가 동일한 연결을 유지한 채로 다음 요청을 할때까지 연결을 유지한 채로 기다림을 허용하는 시간(초)를 의미합니다. 따라서 필자는 여기서 25라는 수치를 지정하였습니다. 즉 동일한 방문자가 동일한 브라우즈로 연결을 한 채로 25초동안 아무런 다음 요청이 이루어 지지 않았다면 연결을 끊은 것으로 판단하고 그 방문자의 서비스를 위해서 생성했던 httpd데몬을 죽여 버리게 됩니다.


MinSpareServers와 MaxSpareServers는 httpd.conf를 설명한 절에서도 충분히 설명된 내용이지만 다시한번 간략히 정리해본다면 다음과 같습니다. "MinSpareServers"수치는 방문자수가 많지않은 경우라도 최소한 여기서 지정한 개수만큼의 httpd 데몬수는 유지하기 위한 설정입니다. 또한 "MaxSpareServers"는 방문자수가 많을 경우에 최대한 허용되는 데몬수는 "MaxClients"항목에서 설정된 수치까지이지만 가능하다면 여기 "MaxSpareServers"에서 설정한 데몬수까지 줄이고자 노력한다는 의미입니다.


필자는 이 값을 각각 15와 45로 설정하였습니다.


다음으로 "StartServers"수치는 20으로 설정하였습니다. 여러분들도 아시겠지만 이 수치는 아파치가 처음으로 실행이 될 때에 생성할 httpd 데몬의 개수를 지정한 것입니다. 솔직히 이 수치의 의미는 실행시에 몇 개의 데몬을 실행할 것인가라는 것 외에는 별 의미가 없습니다.


마지막으로 "MaxClients"항목입니다. 사실 이번 절에서는 이 항목의 설정내용이 가장 중요하다고 할 수 있습니다. 바로 앞에서도 설명을 드렸지만 이 수치를 원하는 값만큼 설정하려면 컴파일 이전에 httpd.h 파일에서 "HARD_SERVER_LIMIT"의 값이 최대치 만큼 설정이 되어 있어야 합니다. 앞의 httpd.h 파일에서 "HARD_SERVER_LIMIT"의 값을 1024로 설정하였으므로 "MaxClients"값을 1024로 설정한 것입니다.



이상과 같이 설정하여 아파치를 운영한다면 성능면에서 굉장히 좋은 효과를 보실 수 있을 것입니다.


한가지 주의하실 것은 이런 설정이 효과를 보시려면 최소한 하드웨어의 사양은 어느정도 갖추어져야 한다는 것입니다.




4. 아파치웹서버 응답속도 및 성능테스트(밴치마킹)



4-1. 아파치웹서버 응답속도 및 성능테스트 개론


아파치웹서버의 응답속도 및 성능에영향을 주는 것들에는 많은 것들이 있습니다. 가장 주된 것이 H/W와 네트워크환경이며, 그리고 아파치서버의 설치환경과 연동되어지는 웹프로그램들이 될 수 있을 것입니다. 우리 같은 서버관리자들이 가장 흔하게 받는 문의중의 한가지가 "홈페이지 응답속도가 너무 느린 것 같다.라는 것입니다. 이런 질문을 받을 때면 곤란할 경우도 있겠지만 "H/W의 사양이나 네트워크의 환경 때문에 그렇다"라고만 대답하기에는 조금 궁색하게 느껴질때가 있습니다.  이런경우 아파치웹서버의 정확한 응답속도를 테스트할 수 있는 방법을 알고 있다면 많은 도움이 될 것입니다.


따라서 이번 절에서 필자는 ab라는 툴을 이용하여 아파치의 응답속도를 테스트하고 그 결과를 다양한 방면으로 확인하는 것에 대한 설명을 할 것입니다. 특히 테스트한 결과를 웹으로 확인하는 방법을 활용한다면 프로그램개발이나 쉘프로그램등에서 많은 도움이 될 것입니다.


ab유틸리티의 정식명칭은 "Apache HTTP server Benchmarking tool"입니다. 즉 아파치서버의 밴치마킹툴이라는 의미입니다.


즉, ab유틸리트는Apache HTTP Server의 속도 및 성능테스트를 위한 밴치마킹 툴(benchmarking tool)입니다.  이 툴은 현재 설치된 아파치서버의 실행속도 및 성능테스트를 위해서 제우스테크널리지(Zeus Technology Ltd, http://www.zeustech.net/)의 Adam Twiss가 개발한 툴입니다. 저작권은 아파치그룹(www.apache.org)과 제우스테크널리지에서 동시에 보유하고 있습니다. 아파치를설치하고 나면 기본적으로 설치가 되므로 별도의 설치과정없이 바로 사용이 가능합니다. 또한 이 툴을 이용하면 아파치 웹서버의 초당 처리능력을 확인할 수 있습니다.


그럼 이제부터 이 툴을 사용하여 아파치의성능을 확인할 수 있는 방법들에 대해서 설명을 하도록 하겠습니다. 참고로 현재 필자는 아파치를 /usr/local/apache에 설치를 했기 때문에 ab툴의 사용위치는 /usr/local/apache/bin이 됩니다.


4-2. Apache Benchmarking tool의 버전확인 (-V 옵션)


아래의 예처럼 V를 사용하시면 ab의 현재 사용중인 버전을 확인하실 수 있습니다.


위의 결과를 보시는 바와 같이 현재 ab의 버전은 1.3d입니다. 참고로 아파치버전은 1.3.23입니다.


4-3. Apache Benchmarking tool의 도움말 보기(-h 옵션)


사용도움말을 표시해 줍니다. 아무런 옵션없이 그냥 (ab)라고만 해도 도움말을 보실 수 있습니다. 결과는 h 옵션을 사용하는 것과 동일합니다.



4-4. 테스트할 세션수 지정 및결과 분석법(-n requests 옵션)


밴치마킹할 세션의 수를 지정하여 테스트합니다. 지정하지 않으면 기본값은 1이 됩니다.


위의 결과를 보시면 다음과 같은 결과를 확인할 수 있습니다.

테스트한 사이트는 www.kornet.net입니다.


- Server Software :  Apache/1.3.23 : 아파치 버전을 표시해줌.

- Server Hostname : www.kornet.net : 테스트 사이트명(도메인명)임.

- Server Port :    80 : 웹서비스 사용포트번호(대부분 80번 포트를 사용함)

- Document Path :   / : 초기 문서가 존재하는 웹문서root위치(서버내의 절대경로 아님)

- Document Length :   410 bytes : 초기문서(대부분 index.html, index.htm)의 크기

- Time taken for tests :   0.012 seconds : 응답시간(매우 중요한 결과값임)

- Complete requests :  1 : 요구에 응답완료한 세션수

- Failed requests :     0 : 요구에 응답실패한 세션수

- Broken pipe errors :  0 : 실패한 에러수

- Total transferred :  693 bytes : 총 전송바이트수

- HTML transferred : 410 bytes : 총 전송한 HTML 바이트수

- Requests per second :  83.33 [#/sec] (mean) : 초당응답요구수

- Time per request :       12.00 [ms] (mean) : 요구에 응답한 시간(단위, micro second, 중요한 결과임)

- Time per request :       12.00 [ms] (mean, across all concurrent requests)                            : 요구에 응답한 시간(단위, micro second)

- Transfer rate :    57.75 [Kbytes/sec] received : 초당전송가능한 용량


4-5. 동시에 여러 개의 세션 밴치마킹하기(-c concurrency 옵션)


한번에 수행할 다중 요구수를 지정합니다. 지정하지 않는다면 기본값은 1이 됩니다.


테스트시에 c 30이라고 주었으며, 결과를 보시면 "concurrency Level  30"이라는 것을 보실 수 있을 것입니다. 즉, 동시에 다중세션을 테스트한 것이며 그 결과를 확인 할 수 있습니다. 결과값의 분석은 앞에 설명된 내용과 비교하면서 보시기 바랍니다.


4-6. KeepAlive 옵션 활성화하여 테스트하기 (-k 옵션)

KeepAlive를 활성화시켜 테스트합니다. KeepAlive란 한 개의 세션에서 여러 개의 요구를 할경우 동일한 세션을 유지하는 것을 의미하며 이 옵션을사용하면 KeepAlive를 활성화시켜 테스트를 하게됩니다. 기본값은 KeepAlive가 비활성화된 상태입니다.



4-7. 테스트에 사용할 최대 허용시간 설정(-t timelimit 옵션)

밴치마킹 테스트시에 허용되는 최대시간을 초단위로 설정합니다. 내부적으로 최대 50000으로 설정이 되어 있습니다. 기본값은 제한이 없습니다.


위의 테스트에서 사용한 옵션은 c 값을 30으로하고, -n 값을 10으로 하였으며 t값을 10으로 주었습니다. 즉 테스트 결과가 오래 걸릴 것을 예상하여 최대허용 시간을 10초로 지정한 것입니다. 그리고 위의 결과를 보시면 Connect 시간과 Processing 시간 그리고 Waiting시간, Total시간이 각각 최소(min), 평균(mean), 최대(max)시간으로 분석되어출력되어 있습니다. 이런결과치를 최대한 활용해 보시면 굉장히 좋은 분석결과를 얻으실 수 있을 것입니다.



4-8. 헤드정보와 함께 출력하기 (-v 옵션)


일반적인 출력결과보다 좀 더 자세한 결과를 보려고 할 때 사용하는 옵션입니다. 즉 테스트하는 사이트의 헤드정보를 함께 볼 수있습니다.


[root@su2 bin]# ./ab -n 1 -v 10 http://www.kornet.net/

This is ApacheBench, Version 1.3d <$Revision: 1.58 $> apache-1.3

Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Copyright (c) 1998-2001 The Apache Group, http://www.apache.org/

 

Benchmarking www.kornet.net (be patient)...INFO: POST header ==

---

GET / HTTP/1.0

User-Agent: ApacheBench/1.3d

Host: www.kornet.net

Accept: */*

 

---

LOG: header received:

HTTP/1.0 200 OK

Date: Tue, 30 Apr 2002 03:42:54 GMT

Server: Apache/1.3.23 (Unix) PHP/4.1.2

Last-Modified: Mon, 17 Dec 2001 09:07:07 GMT

Etag: "227f-19a-3c1db5bb"

Accept-Ranges: bytes

Content-Type: text/html

Content-Length: 410

Via: 1.0 ics_server.kornet.net (ICS 1.2.105)

 

<html>

<head>

<title>인터넷 카리스마 - 코넷</title>

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">

</head>

<frameset rows="123,*" frameborder="NO" border="0" framespacing="0" cols="*">

  <frame name="UPPER

LOG: Response code = 200

..done

Server Software:        Apache/1.3.23                                     

Server Hostname:        www.kornet.net

Server Port:            80

 

Document Path:          /

Document Length:        410 bytes

 

Concurrency Level:      1

Time taken for tests:   0.011 seconds

Complete requests:      1

Failed requests:        0

Broken pipe errors:     0

Total transferred:      693 bytes

HTML transferred:       410 bytes

Requests per second:    90.91 [#/sec] (mean)

Time per request:       11.00 [ms] (mean)

Time per request:       11.00 [ms] (mean, across all concurrent requests)

Transfer rate:          63.00 [Kbytes/sec] received




4-9. 결과를 웹문서(HTML코드)로 출력하기 (-w 옵션)


출력결과를 HTML코드로 출력해줍니다. 이 옵션을 사용하시면 웹으로 확인하는 솔루션을 만들 수 있습니다. 활용가치가 많은 옵션이라고 생각합니다.

다음 예와 같이 w 옵션을 사용하시면 결과를 html 태그와 함께 출력해 줍니다.


그리고 다음과 같이 하시면 결과 값을 지정된 파일(imsi.html)로 저장해 줍니다.


imsi.html 문서를 확인해 보시면 결과가 바로위의 결과값과 같다는 것을 확인하실 수 있을 것입니다.


그리고 이번에는 출력값을 웹으로 확인 할 수 있도록 출력한 예입니다.

다음과 같이 출력값을 특정계정의 웹디렉토리로 파일이름과 함께 출력리다이렉트(>)를 하시면 지정된 파일로 출력이 됩니다.


그리고 확인은 다음과 같이 웹으로 하실 수 있습니다.


필자는 간단히 아파치테스트를 웹으로 할 수 있는 가장 초기의 형태만을 알려드린 것이지만 이를 쉘프로그램이니 어플리케이션과 연동한다면 굉장히 다양한 활용이 가능할 것입니다. 현재 쓰고 있는 이 책을 마무리 한 후에는 필자는 "수퍼유저코리아(www.superuser.co.kr)"에 이를 활용한 간단한 프로그램을 선보일 예정입니다. 이 책을 보고 계실때쯤이면 저희 홈페이지에 ab를 웹으로 테스트 해 볼 수 있는 프로그램이 올려져 테스트 가능하도록되어 있을 것입니다.



4-10. 그외의 다양한 테스트 옵션들


-p POST file 옵션

POST할 파일을 지정하여 밴치마킹을 합니다.


-A Authentication username:password 옵션

아파치에서 사용하는 사용자암호인증인 htpasswd를 사용할 경우에 ID와 패스워드를 지정하여 테스트를 합니다. ID와 패스워드는 콜론(":")으로 분리하여 입력하시면 됩니다.


-p Proxy-Authentication username:password 옵션

Proxy를 사용할 경우의 사용자 암호인증인 htpaswd를 사용할 경우에 사용하는 옵션입니다. ID와 패스워드는 콜론(":")으로 분리하여 입력하시면 됩니다


-C Cookie name=value 옵션

Cookie와 함께 밴치마킹을 가능하게 하는 옵션입니다. "name=value"를 한쌍으로 하여 입력하셔야합니다.


-p Header string 옵션

추가되는 Header와 함께 밴치마킹을 할 수 있는 옵션입니다. 예를 들어 "Accept-Encoding: zip/zop:8bit"와 같이 입력합니다.


-T content-type 옵션

POST하는 데이터에 Content-type Header를 사용할 수 있는 옵션입니다.



[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1320


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
박성수
파파
헐렁고수