-------------------------------
1차 작성자.....
제목 : 아파치 숫자 설정 다시 하기 v0.1
작성자 : 지현명
작성일자 : 2001년 5월 12일
연락처 : gwise at linux.co.kr 홈페이지 : http://www.wiselinuxer.org -------------------------------
크랙 강국 건설 :
http://astalavista.box.sk http://www.warez.com 난 우리나라 사람들이 써 놓은 책을 보고, 한국말이 어
디까지 어려울수 있나 를
시험하는줄 알았습니다. 물론 번역자의 생각에 따라서 달라질수 있지만
아파치 숫자(?) 설정은 개념을 확실히 이해를 하고 설정을 해야 하는데
제가 찾아본 책들은 전부다 상투적인 언어로 설명을 했습니다.
과연 그들이 그 개념을 확실히 이해를 하고 썼는지 다시 한번 묻고 싶습니
다.
표현이 자칫 유치해 지더라도 상세한 설명을 해야 하는데 그들은 이 부분을
무시 한 듯 합니다.
오늘 이글을 읽으시고 아파치 숫자 게임에서 승리를 못하신다면 제게 연락
을 주세요.
성인용으로 개념설명을 준비하겠습니다.
아파치 서버(남자)
클라이언트(여자)
아파치서버데몬(여러명에게 바람피울수 있는 능력)
요청(여자의 이상야릇한 눈빛...)
...........
참고한 책 :
아파치 100활용한 호스팅 사업
PHP Web-DB programming guide
Beginning PHP4
리눅스 6.2 그대로 따라하기
리눅스 알짜 레드햇 5.2 Bible
잘못된 부분이 있으면 2차 작성자라고 덧붙여서 적어 주시면 감사.
copyright나 copyleft 이런거는 잘 모릅니다.
여기 저기 흩어져 있는 유용한 정보를 모아서 정리하고 가끔은 본인의
의견도 적습니다. 이런걸 다 모아서 위험한(?) 세팅도 가끔 해 봅니다.
다만 저의 개인적인 생각(세팅,튜닝)으로 인해 피해(?)를 입으셨다해도 저
를
욕하지 마세요.^^
밥상은 차려주지만 어떻게 먹느냐는 YOU 몫입니다.
====================
아파치 그 깊은 뜻을 어디까지 일까?
아파치의 설정을 위해서 먼저 두가지 개념을 이해하고 있어야 합니다.
GET,POST
아파치와 이것이 무슨 상관이겠냐고 의아해 하시는 계실지 모르겠지만
이 개념을 모르고서 아파치 세팅 매뉴얼을 읽어가면 잘 이해가 안 가실 겁니
다.
만약, 잘 알고 계시다거나 분량이 많아 부담이 되신다면 과감히 skip 해 주
세요.
제가 봐도 분량이 조금은 부담되네요. 그러나 잃어보신다면 개념을 확실히
잡을수 있다고
말씀드리고 싶습니다.
※참고 도서 : Beginning PHP4
GET
GET은 브라우저에게 사용자가 입력한 폼 정보를 URL에 덧붙여 보내라고 알려
주는 겁니다. 브라우저는 물음
표(?)로 URL과 폼 정보를 구분해 줍니다. 폼 정보는 필드이름/값을 각각 짝
을 지어 보냅니다. 예를 들어 보면
이해가 쉬울 겁니다. 필드이름/값은 변수를 만드는 것과 비슷합니다. 먼저
필드이름을 써주고 다음에 값을 써
줍니다.
?animal=고양이
여기서 animal은 필드 이름이고 고양이는 값을 나타냅니다. URL에 다음처럼
덧붙일 수도 있습니다.
http://ie.dyu.ac.kr/test.php?animal=양이 폼에 데이터를 입력하고 보내기 버튼을 누르면 브라우
저가 알아서 URL에 정 보를 덧붙여주는 겁니다. 필드이
름과 값을 하나만 써줄 수 있는건 아닙니다. 여러개를 써줄때는 &기호를 쓰
면 됩니다. 두 개의 필드이름과 값
을 써주면 이렇게 됩니다.
?furryanimal=고양이?spikyanimal=고슴도치
URL에 덧붙여 볼까?
http://ie.dyu.ac.kr/test.php?furryanimal=양이?spikyanimal=고슴도치 이렇게 URL에 덧붙이는 문자열을
쿼리 문자열(query string)이라고 합니다. 필드이름과 값이 변수와 비슷하고
다 했는데. 사실 웹 서버에 전달되면 PHP가 필드이름을 곧바로 변수로 바꿔
줍니다. 다시 말해 , 폼에 데이터
를 입력하고 보내기 버튼을 눌러 다른 문서를 부르면 입력한 필드의 이름이
PHP 스크립트에서 곧바로 변수가
된다는 겁니다.
예를 들어, 앞의 예에서 본 "animal=고양이"는 test.php란 스크립트에서
$animal이란 변수로 사용할 수 있고,
$animal변수에 "고양이"란 문자열 값이 담겨 잇다는 뜻입니다.
쿼리 문자열에 공백이 들어가야 할 경우가 있습니다. <textarea>태그 안에
긴 문자열을 쓸 때가 그렇지요.
"Linux 무지 재미있어요"란 문장에 공백이 여러개 들어 있습니다.
이럴 경우 공백은 자동으로 더하기 기호(+)로 바뀝니다.
http://ie.dyu.ac.kr/form.php?textarea=linux+무지+재미있어요 공백을 그대로 남겨두면 "textarea=linux"에
서 정보가 끊기지요. "무지 재미 있어요"란 문자열은 제대로 전달될
수가 없습니다. 다시 말해, 쿼리 문자열은 공백없이 줄줄이 이어져야 한다
는 겁니다.
그럼 textarea에서 진짜 더하기(+)기호를 쓰고 싶으면 어떻게 하지?라고 궁
금해 하시겠지요? 쿼리 문자열에서
특별한 의미가 있는 기호는 코드로 바꿔줘야 합니다. 이 과정을 URL인코딩
(URL encoding)이라고 합니다.
URL인코딩
URL에 그대로 들어가서는 안되는 문자들이 있습니다. 당연히 쿼리 문자열에
도 그대로 들어가면 됩니다. 그래
서 URL인코딩이 필요합니다.
걱정하진 마세요. 단순한 사용자건 프로그램 개발자건 여러분이 직접 인코딩
을 하는 건 아니니까요. 괄호든
더하 기호든 URL에 쓸 수 없는 문자는 웹 브라우저가 알아서 코드값으로 바
꿔 줍니다. 코드값은 변하지 않
습니다. 가장 많이 사용되는 문자와 코드값을 정리해 보면 다음과 같습니다.
tab %09
space %20
! %21
" %22
# %25
% %25
& %26
( %28
) %29
+ %2B
, %2C
. %2E
/ %2F
: %3A
; %3B
< %3C
> %3E
= %3D
? %3F
@ %40
%5C
위에 나온 문자들은 인코딩하지 않으면 엉뚱한 결과가 생길 수 있습니다. 예
를 들어 + 문자는 앞에서도 설명
했듯이 공백을 뜻하고 ? 문자는 쿼리 문자열의 시작을 알려주니까요
그럼 앞에 나온 예제에서 +문자를 공백 코드값으로 바꿔 URL인코딩을 하면
다음처럼 되겠지요.
http://ie.dyu.ac.kr/form.php?textarea=linux%20무지%20재미있어요 POST
GET을 사용할 때의 단점중 하나는 URL에 덧붙여 써야 하기 때문에 누구나 전
달되는 정보를 볼 수 있다는 겁
니다. URL에 정보가 나타니자 않게 하려면 POST를 쓸 수 밖에 없는데요. GET
에 정보가 나타나지 않게 하려
면 POST를 쓸 수밖에 없는데요. GET과 비슷하지만 POST는 폼 정보를 URL이
아닌 HTTP 요청 본문에 삽입
해 보낸다는 점이 다름니다. URL에 나타나지 않으니 아무나 볼 수 없지요.
또 URL에 덧붙일 수 있는 정보의
양은 제한 되어 있기 때문에 POST를 사용하면 훨씬 많은 정보를 전달 할 수
있습니다.
GET이냐 POST냐, 그것이 문제로다.
GET과 POST는 둘다 찬반 양론이 엇갈리는 방법입니다. 누구는 보안 문제와
정보의 양에 제한이 있기 때문에
절대 GET을 써서는 안된다고 하고, 또 누구는 GET은 정보를 받아올 때만 쓰
고 웹서버에 있는 데이터를 수정
할 때는 언제나 POST를 써야 한다고 말합니다. GET과 POST에 대해 엄격하게
정해진 규칙은 없습니다. 그냥
조언 정도로 생각하시면 됩니다.
POST의 단점 중 하나는 북마크(bookmark, 즐겨찾기)가 잘 되지 않는다는 점
입니다. get을 쓰면 이미 URL에
모든 정보가 들어가 잇기 때문에 북마크가 가능합니다. GET을 사용하면 폼
정보를 다시 살려내기가 쉽습니
다. 그래서 알타비스타와 같은 많은 검색 엔진들이 GET을 사용합니다. 또,
POST가 GET보다 안전하다고는
하지만 여전히 불안한 건 사실입니다. http요청 본문에 붙여 넣어 바로 볼
수 없어도 암호화가 된 건 아니기
때문에 마음만 먹으면 해킹이 가능합니다. 이정도로 보안이 걱정 된다면 보
안서버(Secure Server)를 사용할
수 박에 없습니다.
======================
이제 부터가 본론....
♥♥♥♥♥ 설정 파일의 튜닝 ♥♥♥♥♥
Timeout 300 (받기/보내기 타임 아웃 시간)
(The number of seconds before receives and sends time out)
한번의 GET 요청에 대한 타임아웃 시간을 정해주는 부분으로 초 단위.
즉, 클라이언트가 요청한 정보를 받을 때 까지 소요되는 대기시간의 최대 값
이다.
그야 말로 타임 아웃이다. 연결 됐냐 안됐냐가 중요한게 아니라 클라이언트
가 서버에게
request를 던졌을 때 서버가 클라이언트의 request를 씹냐 안씹냐의 차
이....
(서버가 문제시 될 수도 있고, 네트웍이 문제가 될 수도 있고...___^^__)
네트워크 속도가 나쁠수록 수치값을 높게 한다는 얘기는 네트웍상태가 안좋
으니까
서버와 클라이언트간의 질의와 응답의 시간차가 네트웍상태가 좋은 라인보
다 클 것입니다.
이 것에 대비해 질의/응답 시간을 예상하여 늘려 줘여한다는 얘기겠죠...
★sends time out:
내가 한메일에 접속을해서 내 계정과 비밀번호를 타이핑 한 다음 확인 버튼
을 누르고 나서
서버가 응답을 하지 않으면 (timeout 300) 서버 오류로 처리하겠죠.
★receives time out:
일단 서버에 접속을 해서 내 메일을 읽으려고 클릭을 했는데 서버가 클라이
언트의 화면에
메일 내용을 못 뿌려 줬을때..........서버 오류.....
KeepAlive On
지속성의 적용여부라고 생각합니다. 한번의 접속에서 여러 개의 요청을 처리
할 것인가의 여부...
이것을 off로 하면 상당한 성능저하를 보인다. 참고로 M$에서 윈도우와 NT
와 리눅스의 자체 성능을 비교하
고, 리눅스 웹서버의 성능을 테스트 하면서 이 값을 off로 했다고 한다. 넌
센스가 아닐 수 없다. 이 값은 디폴
트로 On으로 설정어 있으며 대부분의 웹서버에서 그렇게 사용하고 있다.
MaxKeepAliveRequests 100
위의 ON전제조건 상태에서 지속성 접속기간동안 처리할 수 있는 최대 요청
갯수.
한번의 접속에 대해 접속을 끊지 않고 몇 번까지 요청을 받을 것인지 설정한
다. 한 번의 접속에서 100번의
요청을 받은 후에 접속을 끊고 다시 처음부터 접속 과정을 거치게 된다. 물
론 이런 내부 과정을 클라이언트는
모르게 된다. 문서에 의하면 대규모 사이트라면 이 값을 가능 크게 잡는 것
이 좋다고 한다. 0으로 하면 클라
이언트가 스스로 접속을 끈히 전까지 계속 연결되어 있겠된다.
KeepAliveTimeout 5
같은 접속 상태에서 <<<같은 클라이언트>>>의 요청이 타임아웃되는 시간.
클라이언트가 5초 내에 다음 요청을 하지 않으면 접속을 끊는다. 사용자가
웹페이지를 읽는 시간을 고려하면
값을 증가시켜도 좋다. 5초간 시간차를 두고 100번을 할 수 있겠죠..
------------
위에 있는 Timeout과 KeepAliveTimeout과는 어떤 차이가 있을까?
★Timeout은 아파치서버 데몬과 클라이언트의 직접적인 접속시간.
★KeepAliveTimeout은 아파치서버 데몬과 클라이언트가 접속되고 나서
(Timeout이안된걸 전제로)
서버데몬이 클라이언트 request를 처리하고나서 또다른 request를 요청할 것
인가를 체크하는 시간.
Request????(한국말로 요청...쉽게 말해서 내가 서버페이지 이동을 누른다거
나 submit버튼을 누른다든가..
여하튼 클라이언트가 서버데몬을 일하게끔 하는거로 쉽게 생각하면 됩니다.)
StartServers 10
초기에 띄울 아파치 서버 데몬.
↓Server-pool크기조정. 몇 개의 프로세스가 필요한지 여러분에게 추측하도
록 하기 보다는 현재의 부하 상태
에 자동으로 적응하도록 되어 있습니다.
아파치 서버는 현재의 부하 상태와 순간적으로 급격히 상승하는 경우 값(예
를 들어, 넷스케이프 브라우저에서
동시에 여러개의 요청이 들어올수 있다.)을 처리할 수 있는 충분한 객수의
서버 프로세스를 유지하려고 노력
한다.
아파치 서버는 주기적으로 몇 개의 서버가 요청 대기 상태인지 점검한다.
만약 MinSpareServers 보다 적다면 여유 서버 프로세스를 생성한다.
만약 MaxSpareServers 보다 많으면 불필요한 여유 프로세스를 제거한다.
MinSpareServers 10
아파치는 자식 프로세스를 분기(fork)해서 http요청을 처리한다. 동시에 많
은 요청이 들어오면 그 때마다 자식
프로세스를 분기해야 하는 데 한 번의 분기에 많은 시스템 자원이 필요하며
지연 시간이 생긴다. 요청이 없어
도 미리 자식을 만들어 놓으면 이런 지연 없이 서비스 할 수 있다. 물론 너
무 많은 여유 프로세스를 만드는
것도 시스템 자원의 낭비를 가져온다. 히트 수가 많은 사이트라면 이 값을
늘려 상당한 성능 증가를 얻을 수
있다. 앞에서와 마찬가지로 M$에서는 이 값을 1로 두고 윈도우 NT와 성능 비
교를 했다. MaxSpareServers 와
비교해 적당한 값을 쓰면된다.
MaxSpareServers 20
최대로 생성할 수 있는 여유 자식 프로세스 수로, 자원을 낭비하므로 너무
큰 값을 사용하면 안된다.
↓서버프로세스의 최대값, 즉 동시에 접속할 수 있는 클라이언트 개수를 제
한하는 값입니다.
만약 이 값에 도달한다면 클라이언트의 요청은 봉쇄될 것입니다.
따라서, 이 값이 너무 낮아서는 안됩니다. 이 값은 아파치 서버가 너무많은
자원을 소비하여 전체 시스템을
먹통이 되도록 하는 것을 방지하기 위해 사용될 뿐입니다.
MaxClients 150
한 서버가 감당할 수 있는 최대 동시 접속 수. 이 값을 크게 해야 할 필요
가 생기고 그 만큼 동시 접속이 많
다면 하드웨어 업그레이드도 생각해야 할 것이다.
↓각 자식 프로세스가 죽기 전까지 처리할 수 있는 요청 개수
한 프로세스가 너무 오랫동안 사용되면 메모리 누출이나 자원 누출(아파치
때문에 또는 잘못된 라이브러리 때
문에)이 발생할 수 있으므로 자식 프로세스는 자동으로 죽는다.
MaxRequestsPerChild 100
아파치가 실행된 후 자식 프로세스를 생성하면 자식 프로세스는 여기에 적
힌 수 만큼의 접속을 처리하고 죽는
다. 이렇게 하면 자식 프로세스가 점유한 자원이 깨끗하게 청소되므로 아파
치가 오래 실행되어 있어도 문제없
다. 이 값을 0으로 하면 한 번 실행된 자식 프로세스는 결코 죽지 않으니 속
도 증가가 있지만 잘못된 코드가
실행되면서 메모리 누수가 생겼을 때 대책이 없어지니 가능하면 적절한 값
을 사용하도록 하자.
HostnameLokups off
아파치가 접속을 받아 들였을 때 어디에서 접속이 들어왔는지 확인하기 위
해 호스트명에 대해 IP주소를 확인
하고 다시 IP주소에 대해 호스트 명을 확인하는 작업을 네임서버에 의뢰한
다. 이때상당한 시간이 필요하므로
이 값을 Off로 설정해야 한다. On 으로 하면 눈에 띄는 성능감소를 볼수 있
다.
-------------
가상 상황
Timeout 300
MaxKeepAliveRequests 100
KeepAliveTimeout 5
StartServers 10
MinSpareServers 10
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 100
---------
현재 서버에는 10개의 아파치 서버 데몬이 떠 있습니다.
여러명의 클라이언트가 서버 데몬에 접속했습니다. 한서버 데몬에 클라이언
트의 request 시간을 달리 하면
한 클라이언트의 KeepAliveTimeout 5 가 지나면 그 서버 데몬은 그 클라이언
트와의 접속을 끊어 버린다.
KeepAliveTimeout 5은 한 클라이언트에 대한 것이다.
예를들어 내가 어느서버에 접속해서 다른 파일로된 홈페이지를 읽는다면
5초를 위반하지않고 100개의 요청(각각 다른 페이지 클릭)을 할수 있는 것
이다. 물론 이것을 위반해도 겉으
로는 아무런 반응이 나타나는 것이 아니다.
한 클라이언트의 5초를 위반해서 접속이 끊기고 새로운 접속이 시도 된다면
방금 접속을 끊은 아파치 서버
데몬은 (MaxRequestsPerChild 100) 100개의 또다른 일을 할수 있다. 즉 한
번 했으니까 99,98 이런식으로..
그리고 0번이되면 죽고 다시 살아 난다.
아파치를 실행했을 때 하나만 root고 나머지는 nobody로 실행이 됩니다.
즉, fork 가 된거지요..
이 nobody가 바로 MaxRequestsPerChild 100 즉 root로부터 태어난 자식 프로
세스입니다.
ps aux 해보시면 하나만 root소유의 httpd이고 나머지는 전부 nobody일 것
입니다.
Maxclients 150 아파치 서버 데몬이 풀로 뜬다 해도 150까지는 안뜬다는 얘
기입니다.
즉 150명의 클라이언트가
MaxKeepAliveRequests 100
KeepAliveTimeout 5
이조건의 위반하지 않고 계속 접속한 상태에서 다른 클라이언트가 접속을 시
도하면
접속이 안된다는 얘기입니다.( 설명이 너무 어렵나요..??)
제 생각에는 알럽스쿨이나 세이클럽 같은 이런 대형 서버에서는 문제가 되지
만
기타 일반 서버에서는 150도 큰값이라고 생각합니다.
자 생각해 봅니다.
지금 150명의 유저가 접속을 동시에 했습니다.
MaxKeepAliveRequests 100
KeepAliveTimeout 5
MaxRequestsPerChild 100 (1개의 fork된 서버데몬이 100개까지 서비스 가능)
이 조건이 무지 중요합니다.
현재상황 150 클라이언트가 동시 접속했음
각 클라이언트들은 한 request에 5초를 위반하지 않는다. 5초를 차이두고
100개의 요청을 처리하고
100개가 넘었으면 죽는 것이 아니라 자식 프로세스는 100개를 처리 할 수 있
다.
즉
MaxKeepAliveRequests 100
KeepAliveTimeout 5
이런 진행 과정을 100번 더 할 수 있다는 얘기가 되겠죠..
5초동안 100번의 request 다시 100번... 단 조건의 위반하지 않는다는 전제
조건하에서..
각150명의 유저들이 조건의 위반하지 않고 계속 접속해 있으면 다른 클라이
언트의 접속은 불가능 하게 되겠
죠......
실제로
start 1
min 1
max 1
MaxKeepAliveRequests 100
KeepAliveTimeout 5
로 세팅해 놓고 넷스케이프를 엄청나게 많이 띄어나도(하나의 서버에서) 데
몬은 그리 많이 생성되지 않습니
다. 왜냐면 5초니까.....빨리 죽고 다른 요청에 응답을 해서 그렇겠죠....
궁금하시다면 1초로 해 놓고 네스케이프 여러게 띄어 놓은다음
쉘 스크립트를 하나 만들어서
#!/bin/bash
while [ 1 ]
do
ps aux |grep /home/apache |wc -l
done
테스트해보세요....잼있을거 같지않나요....상상할 수 없는 극한의 세팅을
어디서 또 해보겠습니다.
음...`~ 쓰고 나니 한글에서 6장이나 되네요.
오늘은 오라클 공부하는 날인데 슬럼프라서 파고들기 공부전략을 세워 아파
치 숫자(?)게임에 도전해 봤습니
다.
혹시 서울에 C언어 잘 가르치는 학원 있으면 연락 주세요.
아직 C언어가 초보라서 C언어 실력이 된다면 C만으로 임베디드 프로그래밍
을 하고 싶거든요..
물론 어렵겠지만....
이만 물러갑니다. 담에는 syslog에 관한거...이거 아주 잼있거든요. 크랙커
나 해커 침입했을 때
이 설정을 어케 하느냐에 따라서 잡느냐 못잡느냐......로그화일을 아카이
브 백업하고
핸드폰 메시지 연락오는 메일로 메일 보내고 등등.. 생각만 해도잼있네요...
물론 smtp 포트를 숨기것도 중요하겟죠.. 왜 그 있잖아요.
http://www.dprkorea.com 여기 홈페이지 스캔 뜨면 이상한 문자가 쫘락락락...뜨면서 아예 스캔 뜨
는 걸 지치게 해놨더라구요
분명 쉘이나 펄 스크립트로 한거 같은데...
아직 제가 접근한거는 .....근데 제 생각이 맞을 수도 있습니다.
/etc/services 파일에다가
..
..
ftp 21/tcp
요렇게 되있지요.. 이걸
a-z0-&(@&(*&$(#&*$&... 21/tcp
요기 위에 21번 앞에다가 수도 없이 많이 이상스러운 문자들을 빈 칸없이 적
어 주는 겁니다.
서비스 되는거중에 제일 작은 숫자에서...
그러면 스캔뜨면 쫘락락........물론 아는 사람들은 몇초(?)면 끝날걸 알지
만....
이런 분들을 위해 2G짜리 services 파일을 만드는겁니다.^^ 너무 엽기적인
가...
스캔 뜨는 넘이 왠만한 인내력을 가지고 있지 않다면 1분도 안되서 스캔뜨
는 것을 포기 할 겁니다.
아니면 더엽기적인 서버관리자가 된다면 포트번호 썩어 놓기도 잼있겠죠...
또다른 제 생각은 /etc/inittab 에 보면 ctrl+alt+del 누르면 다운되잖아요
저같은 경우는
저걸 눌렀을 때 무한 루프 도는 쉘스크립트를 연결 시켜 놓았답니다. 브레이
크 걸어도 못빠져나오죠..
이거에 힌트를 얻어서 스캔 뜨면 바로 무한 루프가 응답을 하도록
syslog화일과 inittab 의 연간관계를 고려하여 고민중에 있습니다.
혹시 아시는분 있으면 연락주세요.....
같이 공부 합니다.....