>> Edit article
이름
제목
패스워드
------------------------------- 1차 작성자..... 제목 : 아파치 숫자 설정 다시 하기 v0.1 작성자 : 지현명 작성일자 : 2001년 5월 12일 연락처 : gwise@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 의 연간관계를 고려하여 고민중에 있습니다. 혹시 아시는분 있으면 연락주세요..... 같이 공부 합니다.....
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved