Operating System/Linux2007/06/22 23:38

글 쓴 사람: 지현명
글 쓴 일자: 2001-05-08 20:11:22

출처: LSN

1. Web Page Loading 시간 확인

#time -pa lynx -source http://www.gwise.com > /dev/null

real 0.74
user 0.16
sys 0.09

실제 접속시간: 0.74-(0.16+0.09)=0.49초

2. Apache Benchmarking

#man ab 사용법 보기

-n requests 요청을 수행할 개수
-c concurrency 요청을 만들 개수로 동시 사용자 개념으로 이해하면 되겠다.
-v verbosity 얼마나 자세한 정보를 화면에 출력해 줄 것인지 결정
-w HTML 문서형식으로 Table로 만들어 결과를 화면에 출력
-k HTTP Protocol의 지속연결 (KeepAlive) 기능을 사용

#./ab -n 100 -c 10 http://www.gwise.com:80/

10 명의 User가 동시에 http://www.gwise.com/index.html 을 요청하는 것을 모의 실험. 각각의 Simulate User는 요청을 10 번씩 하게 됩니다

# ab -n 1500 -c 50 http://www.apache.kr.net:80/
요청을 30 x 50 (50 명의 사용자가, 각각 30 번의 요청)

Requests per second: 80.48
초당 80.48개를 요청 했음.

'MaxRequestsPerChild' 는 Memory 누수현상(?) 등이 발생하지 않는다면 가능한 이 값을 높게 설정하시고요(Parameter의 값을 0으로 설정해 무한대로 하실 수도 있습니다) StartServers' 는 Process가 active 되어 있는 경우가 적을 경우 값을 낮게 설정하시고, 접속량이 아주 많을 경우는 MaxClients 에 가깝게 조절하시기 바라며, MaxSpareServers 를 MaxClients 와 같게 설정합니다. MaxClients 는 너무 낮게 설정하지 않도록 주의하시기 바라며, 그렇다고 또 너무 크게 잡으셔도 안됩니다

3. Web Server 삽질 막기

BrowserMatch "WebZip" go_out
BrowserMatch "Teleport" go_out
BrowserMatch "GetRight" go_out

<Directory "/home/gwise/public_html">
....
Deny from env=go_out
</Directory>

4. Apache Tunning

일반 Server에서는 다른 것은 그냥 Default 값으로 둔다. (대형 Server의 경우 말고는 특히 쓸 일이 없을 것이다.)

증가 시킬 경우 배수로 한다. 꼭 이렇게 해야 하는 것이 아니라 이렇게 하면 좋다.

Timeout 300

Client의 요청에 의해서 Server와 연결 되었을 때, Client와 Server간의 아무런 메시지가 발생하지 않았을 때, 오류로 처리하는 시간이며 Network 속도가 나쁠수록 수치값을 높게 한다.

KeepAlive on

지속적인 접속, 즉 Server 연결에 대하여 한번 이상의 요청을 허용 여부.

MaxKeepAliveRequests 100

Client가 접속된 시간 동안 Apache Server에 요청할 수 있는 처리 process 개수

StartServers 5 X ? =20 → 초반에 뜰 Process 그 이상 그 이하의 의미도 없다.
MinSpareServers 5 X ? =20 → Spare Process가 이것 이하 일 때 끌어 올려 준다.
MaxSpareServers 10 X ? =40 → Spare Process가 이것 이상 일 때 진정(?)시켜 준다.

말 그대로 Spare.... 언제 있을지 모를 요청에 대해서 Computer 스스로가 조절해 준다.

MaxClients 150

Client들이 동시에 최대로 접속했을 때 가능한 최대 Server이 수를 지정하며 Ulimit -a ~~~ max process...이 수치 이상 증가 못하며, httpd.h 안에 'HARD_SERVER_LIMIT=250' 조정해서 다시 Compile 해야 한다.

#ulimit -a

core file size (blocks)        0
data seg size (kbytes)        unlimited
file size (blocks)        unlimited
max memory size (kbytes)    unlimited
stack size (kbytes)        8192
cpu time (seconds)     unlimited
max user processes     2048
pipe size (512 bytes)     8
open files         1024
virtual memory (kbytes)     2105343

위의 max user processes 의 수를 초과 할 수 없다.

MaxRequestPerChild 100

한 Process가 몇 번의 Service를 하고 소멸될 것인지 정한다. M$계열에서는 별 의미가 없으므로 0을 한다. 하지만 Unix 계열은 0을 사용하지 않는 것이 좋다.

가장 중요한 것은Timeout 설정입니다. 위에서 keep-alive 를 설정해 놓은 경우, 하나의 connection에서 계속해서 다음 request를 처리할 수 있기 때문에 효율적이라고 하지만, 실제로는 그렇지 않습니다. keep-alive 를 허용하고 그 timeout을 5초로만 설정해도, 하나의 request를 처리한 후 적어도 5초 동안은 그 httpd가 다른 작업을 하지 못하고 다음 request를 기다리게 됩니다.

보통 Web Browser들은 Server로 동시에 4개의 connection을 만들게 됩니다. 한 Page를 보는데 이미지 등등 해서 보통 4개의 connection을 만드는 것은 기본이죠. 이렇게 되면 httpd가 100개 떠 있다고 해도, 실제로는 동시에 25명의 방문자 밖에 처리하지 못합니다.

그리고 keep-alive timeout이 5초인 경우, 한 명의 방문자를 처리한 후 적어도 5초 동안은 계속해서 기다리면서 httpd가 놀게 됩니다. (그렇다고 해서 httpd의 수를 늘여주면 앞의 문제 때문에 load가 몰릴 때 순간적으로 부하가 지나치게 많이 걸리게 됩니다. 어떤 request는 수초가 지난 후 답을 받는 등 quality of service가 많이 떨어지죠.)

결국 한 명의 방문자를 처리하는데 4개의 httpd가 5초 동안 작업한다는 뜻이고, 100개의 httpd를 띄워봐야 1초에 5명의 방문자밖에 처리하지 못하는 셈입니다. (1명 / 5 sec / 4 httpd = 5 / 1 sec / 100 httpd )

그래서 검색엔진 Service 등 traffic이 많은 사이트에서는 keep-alive 옵션을 반드시 꺼놓게 됩니다. 그리고 connection timeout도 상당히 짧게 설정해 놓죠. 4~5초 이내로 말입니다

5. Apache Tunning-2(Log 기록 Rotate로)

/home/apache/conf/httpd.conf

CustomLog /home/apache/logs/access_log common
TransferLog "|/home/apache/bin/rotatelogs /home/apache/logs/access_log 86400"
TransferLog "|/home/apache/bin/rotatelogs /home/apache/logs/error_log 86400"

24시간 마다 Log File을 갱신해 준다.

24X60X60=86400초

6. Apache Error Message 바꾸기

httpd.conf

Customizable error response (Apache style)

2) local redirects

ErrorDocument 404 /cgi-bin/missing404.pl

missing404.pl

#!/usr/bin/perl

print<<"(END_HTML)";

Content-type: text/html\n\n

<head><title> 요청한 URL 이 없습니다. </title>

<meta http-equiv="content-type" content="text/html;charset=EUC-KR">

</head>

<body>

<br><br><center

<b><h2>요청하신 http://www.gwise.com$ENV{'REQUEST_URI'} 이 <br>

존재 하지 않습니다.<br></h2></b>

<br><br><h4>

<a href="mailto:gwise\@orgio.net"> Server관리자 </a>

에게 문의 바랍니다.</h4><br>

(END_HTML)

exit;

7. Apache Error Code

HTTP 1.1 status codes [TOP]

100 : Continue
101 : Switching protocols
200 : OK, Error없이 전송 성공
201 : Created, POST 명령 실행 및 성공
202 : Accepted, Server가 Client 명령을 받음
203 : Non-authoritative information, Server가 Client 요구 중 일부만 전송
204 : No content, Client 요구를 처리했으나 전송할 Data가 없음
205 : Reset content
206 : Partial content
300 : Multiple choices, 최근에 옮겨진 Data를 요청
301 : Moved permanently, 요구한 Data를 변경된 임시 URL에서 찾았음
302 : Moved temporarily, 요구한 Data가 변경된 URL에 있음을 명시
303 : See other, 요구한 Data를 변경하지 않았기 때문에 문제가 있음
304 : Not modified
305 : Use proxy
400 : Bad request, Client의 잘못된 요청으로 처리할 수 없음
401 : Unauthorized, Client의 인증 실패
402 : Payment required, 예약됨
403 : Forbidden, 접근이 거부된 문서를 요청함
404 : Not found, 문서를 찾을 수 없음
405 : Method not allowed, Resource를 허용 안 함
406 : Not acceptable, 허용할 수 없음
407 : Proxy authentication required, Proxy 인증 필요
408 : Request timeout, 요청시간이 지남
409 : Conflict
410 : Gone, 영구적으로 사용할 수 없음
411 : Length required
412 : Precondition failed, 전체조건 실패
413 : Request entity too large,
414 : Request-URI too long, URL이 너무 김
415 : Unsupported media type
500 : Internal server error, 내부Server 오류(잘못된 Script 실행 시)
501 : Not implemented, Client에서 Server가 수행할 수 없는 행동을 요구함
502 : Bad gateway, Server의 과부하 상태
503 : Service unavailable, 외부 Service가 죽었거나 현재 멈춤 상태
504 : Gateway timeout
505 : HTTP version not supported

Creative Commons License
Posted by BLUEDAY™