커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 웹 서버(web, httpd, apache) > 웹서버 튜닝 도움말
검색 : 사이트 WHOIS 웹서버 종류


  [튜닝] 아파치 튜닝 정리 (글 지현명, 출처 LSN) 작성일 : 2003/09/02 21:54
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 12106
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      출처 : LSN, http://linux-sarang.net/board/?p=read&table=tip&no=3016

    ------------------------------------------------
    1063번: 아파치 튜닝 정리
    글쓴이: 지현명    글쓴날: 2001-05-08 20:11:22

    1. 웹 페이지 로딩시간 확인
    #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. 아파치 벤치 마킹
    #man ab  사용법 보기
    -n requests 요청을 수행할 개수
    -c concurrency 요청을 만들 개수로 동시 사용자 개념으로 이해하면 되겠다.
    -v verbosity  얼마나 자세한 정보를 화면에 출력해 줄 것인지 결정
    -w HTML 문서형식으로 테이블로 만들어 결과를 화면에 출력
    -k HTTP 프로토콜의 지속연결 (KeepAlive) 기능을 사용

    #./ab -n 100 -c 10 http://www.gwise.com:80/
    10 명의 유저가 동시에 http://www.gwise.com/index.html 을 요청하는 것을 모의 실험.
    각각의 시뮬레이트 유저는 요청을 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’ 는 메모리 누수현상(?) 등이 발생하지 않는다면 가능한 이 값을 높게 설정하시고요(파라미터의 값을 0 으로 설정해 무한대로 하실수도 있습니다) StartServers’ 는 프로세스가 active 되어 있는 경우가 적을 경우 값을 낮게 설정하시고, 접속량이 아주 많을 경우는 MaxClients 에 가깝게 조절하시기 바라며, MaxSpareServers 를 MaxClients 와 같게 설정합니다. MaxClients 는 너무 낮게 설정하지 않도록 주의하시기 바라며, 그렇다고 또 너무 크게 잡으셔도 안됩니다


    3. 웹 서버 삽질 막기
    BrowserMatch "WebZip" go_out
    BrowserMatch "Teleport" go_out
    BrowserMatch "GetRight" go_out

    <Directory "/home/gwise/public_html">

    ....
    Deny from env=go_out
    </Directoyr>

    4. 아파치 튜닝
    일반 서버에서는 다른것은 그냥 Default 값으로 둔다.
    (대형 서버의 경우 말고는 특히 쓸 일어 없을 것이다.)

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

    Timeout 300
    클라이언트의 요청에 의해서 Server와 연결 되었을때
    클라이언트와 서버간의 아무런 메시지가 발생하지 않았을때
    오류로 처리하는 시간
    네트워크 속도가 나쁠수록  수치값을 높게 한다.

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

    MaxKeepAliveRequests 100
    클라이언트가 접속된 시간동안 아파치 서버에 요청할 수 있는 처리 process 개수

    StartServers 5 X ? =20  -> 초반에 뜰 process 그 이상 그이하의 의미도 없다.
    MinSpareServers 5 X ? =20 -> Spare 프로세스가  이것 이하 일때 끌어 올려 준다.
    MaxSpareServers 10 X ? =40 -> Spare 프로세스가 이것 이상 일때 진정(?)시켜 준다.
    말 그대로 Spare.... 언제 있을지 모를 요청에 대해서 컴퓨터 스스로가
    조절해 준다.

    MaxClients 150
    클라이언트들이 동시에 최대로 접속했을때 가능한 최대 서버이 수를 지정.
    Ulimit -a ~~~ max process...이 수치 이상 증가 못함.
    httpd.h
    HARD_SERVER_LIMIT=250 조정해서 다시 컴파일 가능

    MaxClient 150  -> 동시에 떠 있을수 있는 최대 process
    더 많은 수를 원할시 httpd.h 소스 파일의
    HARD_SERVER_LIMIT 값을 수정 한 다음 다시 컴파일 해야 한다.

    #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
    한 프로세스가 몇 번의 서비스를 하고 소멸될 것인지 정한다.
    M$계열에서는 별 의미가 없으므로 0을 한다.
    하지만 Unix 계열은 0을 사용하지 않는 것이 좋다.

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

    보통 웹브라우저들은 서버로 동시에 4개의 connection을 만들게 됩니다. 한 페이지를
    보는데 이미지 등등 해서 보통 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 )

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


    5. 아피치 튜닝-2(로그기록 로테이트로)
    /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시간 마다 로그 화일을 갱신해 준다.
    24X60X60=86400초

    6. 아파치 에러 메시지 바꾸기
    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"> 서버관리자 </a>
    에게 문의 바랍니다.</h4><br>
    (END_HTML)
    exit;
    ---------------

    7. 아파치 에러 코드
    HTTP 1.1 status codes [TOP]

    100 : Continue
    101 : Switching protocols
    200 : OK, 에러없이 전송 성공
    201 : Created, POST 명령 실행 및 성공
    202 : Accepted, 서버가 클라이언트 명령을 받음
    203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부만 전송
    204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
    205 : Reset content
    206 : Partial content
    300 : Multiple choices, 최근에 옮겨진 데이터를 요청
    301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
    302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시
    303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
    304 : Not modified
    305 : Use proxy
    400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
    401 : Unauthorized, 클라이언트의 인증 실패
    402 : Payment required, 예약됨
    403 : Forbidden, 접근이 거부된 문서를 요청함
    404 : Not found, 문서를 찾을 수 없음
    405 : Method not allowed, 리소스를 허용안함
    406 : Not acceptable, 허용할 수 없음
    407 : Proxy authentication required, 프록시 인증 필요
    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, 내부서버 오류(잘못된 스크립트 실행시)
    501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함
    502 : Bad gateway, 서버의 과부하 상태
    503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
    504 : Gateway timeout
    505 : HTTP version not supported
      커피닉스 카페 최근 글
    [08/25] #gpt_question_subje
    [08/20] From what I've seen
    [08/14] сайт
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~