\php-development 디렉토리에 extract 하고, eclipse-php\eclipse-php.exe 파일을 실행하여 eclipse를 실행
workspace는 아래와 같이 지정.
\php-development\eclipse-php\workspace
자바 빌더 자체가 없어서 java 소스에 대해서 에러가 발생한다.
2. Subversion client 설치
이클립스 subversion client 인 subversive plugin을 설치한다.
eclipse3.7은 helios 이니, Install -> http://download.eclipse.org/releases/helios 등록 -> Collaboration -> subversive로 시작되는 것 모두
설치
Tomcat의 JreMemoryLeakPreventionListener의 gcDaemonProtection은 true값이 디폴트이다. Tomcat은 GC Daemon을 하나 만들어서 sun.misc.GC.requestLatency(long) 메소드를 호출하게 된다. JreMemoryLeakPreventionListener 소스에서는 1시간단위로 해당 메소드를 호출하도록 되어 있다.
따라서, server.xml에 아래 내용을 추가하여 Full GC가 일어나지 않도록 수정되어야 한다.
nginx가 도대체 무엇이길래 사내에서 표준으로 결정되고 여러 부서에서도 쓰고 있을까? 하는 생각을 하실텐데요.
무시 못할 정도로 상승세가 일어나고 있다는 사실은 주목할 이유가 있습니다.
nginx 에 대해서 간단히 설명드리겠습니다. 현재는 1.1.4(2011.9.27일 기준)까지 release 되었으며, 빠르게 relase 가 되고 있습니다.
nginx는 Apache 재단에서 밀고 있는 반면, nginx는 러시아 개발자(Igor Sysoev)가 혼자서 만들 프로젝트이지만, 메모리와 성능이 좋아 입소문으로 많이 사람들이 알게 되었습니다. 2002년부터 시작되어 지금은 9년이 되어갑니다.
특히 nginx는 wordpress.com 에 적용되면서 많이 유명해졌습니다. 지금은 대륙의 인기 싸이트인 qq.com, taobao.com과 트윗터의 3rd party 업체인 twitpic.com과 sourceforge.net, hulu.com이 nginx를 사용하고 있습니다.
server {
listen 80;
server_name ngix.google.com; // 그냥 제가 대충 만든 싸이
access_log off;
location / {
root /home/www/html;
index index.html;
}
}
nginx 는 비동기(async) 이벤트 기반(ioctl, send, recv, epoll)으로 만들어졌고, Apache Http 서버는 프로세스 또는 쓰레드를 태생으로 만들어졌습니다.
Apache Http 서버는 요청 하나당 프로세스(뜨는 쓰레드)가 처리하는 구조이다 보니, 만약 Apache Http 서버의 프로세스가 blocking(DB나 파일)이 되면 요청을 계속 처리하지 못하고 처리 완료때까지 대기하는 일이 생깁니다. 그래서 Timeout이나 Keep Alive 체크를 정말 잘써야 하는 이슈가 생기게 되었습니다.
또한 MaxClient의 수치를 높여 dos 공격에 대해서 조금이라도 막을 수 있는 형태를 취하게 됩니다. 따라서 프로세스(또는 쓰레드) 메모리를 많이 할당/해제하는 상황이 생길 수 있습니다.
반면, nginx는 쓰레드를 적게 사용하는 구조입니다. 또한 쓰레드를 적게 쓰다보니 쓰레드당 할당되는 메모리도 적게 되면서 메모리도 적게 사용되는 구조가 됩니다. 하나의 쓰레드에서 이벤트를 처리하다 보니 blocking이 되는 일이 없는 셈이 됩니다. 또한 쓰레드를 적게 쓴 다는 것은 context swithing 비용도 적게 되기 때문에 cpu의 소모도 상대적으로 작게 됩니다. 하나의 프로세서는 하나의 쓰레드처럼 사용하여 적은 worker에서 동작이 됩니다. 다만 많은 요청을 처리하기 위해서 client 개수는 늘릴 필요는 있습니다.
그러나 요청에 대한 상태(socket status)를 잘 가지고 있어야 하는등.. 비동기 서버 구현 자체가 다양한 팩터로 인해서 코드에 대한 복잡성이 높습니다.
최대한 system call을 적게 하고 비동기 이벤트 처리를 통해서 높은 성능이 있다는 큰 장점과 함께 백엔드와 ajp 통신이 어렵고, 모듈 개발이 어려우며, Apache Http 서버처럼 다양한 모듈이 없다는 단점이 있습니다.
그러나 공식적이지 않지만, ajp 통신 모듈이 오픈 소스로 이미 나온 것이 있으니 연동이 가능합니다.
최근에는 0.8.11부터는 리눅스 AIO(Asynchronous Input-Output) 기능을 적용하여 최적화를 통해서 속도향상을 꾀했습니다. 또한, tomcat 과 같은 backend 통신시 keep alive 기능이 없어서 문제가 있었는데, 1.1.4부터는 모듈이 추가 개발되어 keep alive 기능을 사용할 수 있게 되었습니다. 이를 통해서 nginx-tomcat의 조합이 가능할 수 있게 될 것으로 생각됩니다.
부족한 부분들은 점차 활성화되면서 refernece들에 대한 자료는 꾸준히 나오리라 생각됩니다.
이번에는 성능과 관련된 내용을 보도록 하겠습니다.
내부 테스트시 nginx 단독으로 쓰였을 때는 성능이 좋을 뿐 더러 cpu와 memory 가 apache http 서버보다 엄청 나게 적게 나오지만, 그러나 tomcat 을 붙인 경우는 apache http 서버와 nginx간의 성능은 크게 바뀌지 않습니다. 역시 바틀렉이 있을 때는 성능은 바틀렉이 있는 것으로 떨어지게 마련입니다.
Nginx나 Lighttpd 같은 녀석도 이미지 캐쉬서버로 동작이 가능한가요? Nginx나 lighty가 webserver로, 혹은 reverse proxy로는 동작이 가능하지만, varnish나 Apache traffic server처럼 static contents를 memory에 캐싱하는 역할은 못하는 것으로 알고 있어서요.
메모리 사용량에 대한 결론이 좀 이상한것 같은데요
아파치 트레픽 서버는 초기 시작시에 일정량의 메모리가 사용되고 그 이후 시간에 따른 증가폭은 크지 않습니다. 서버 시작시에 100MB 의 메모리가 필요한것이 마치 굉장히 메모리를 많이 사용하는것 처럼 해석되어 있네요. 요즘 서버 환경에서 100MB 의 메모리가 엄청난 양의 메모리라고 생각되진 않네요.
메모리 그래프에서 중요한거는 시간이 지남에 따라 메모리 사용량 선이 어떻게 꺽이느냐인것 같습니다.
링크거신 원문에는 트레픽서버의 메모리 사용량이 나쁘다는 말은 없네요. 단지 nginx 가 메모리 사용량에 있어서 가장 돋보였다 정도네요. 그 이유로는 동시접속자수 증가에 따른 메모리 사용량 증가가 거의 없다라고 말하고 있네요.
Apache Http 서버는 요청 하나당 프로세스(뜨는 쓰레드)가 처리하는 구조이다 보니, 만약 Apache Http 서버의 프로세스가 blocking(DB나 파일)이 되면 요청을 계속 처리하지 못하고 처리 완료때까지 대기하는 일이 생깁니다.
(nginx는)하나의 쓰레드에서 이벤트를 처리하다 보니 blocking이 되는 일이 없는 셈이 됩니다.
A flaw was found in the way the Apache HTTP Server handled Range HTTP headers. A remote attacker could use this flaw to cause httpd to use an excessive amount of memory and CPU time via HTTP requests with a specially-crafted Range header. This could be used in a denial of service attack.
Issue public: 20th August 2011
Update released: 30th August 2011
The Apache HTTP Server Project is pleased to announce the release of Apache HTTP Server (httpd) version 2.2.20. This release represents fifteen years of innovation by the project, and is recommended over all previous releases!
Add-in modules for Apache 2.0 are not compatible with Apache 2.2. If you are running third party add-in modules, you must obtain modules compiled or updated for Apache 2.2 from that third party, before you attempt to upgrade from these previous versions. Modules compiled for Apache 2.2 should continue to work for all 2.2.x releases.
2. Http의 Head 명령을 처음부터 받지 않도록 한다.
mod_security를 이용하면 GET, POST, DELETE 만 받을 수 있도록 하면 된다.
워낙 지저분한 command에 대해서는 미리 방지하는게 좋다.
만약 구버전을 계속 사용해야한다면.. 다르게 접근이 필요하다.
3. Apache Http 설정에 mod_gzip, mod_deflate를 쓰지 않는다.
이건 좀 아닌거 같다. 클라이언트 브라우져가 똥컴이면 고객 항의가 온다.
zipping은 선택이 아닌 필수이다.
4. range 정보에 대한 unset
side effect 가 있지 않을까? 서비스에서 side effect가 없다면 써도 무방
mod_header에서 다음과 같이 처리 SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range
* 필요 IDEA
수많은 포털과 웹 서버들이 http header를 보면 apache / ssl / mod_jk 버전을 그대로 노출하는 경우가 많다.
이런 정보만 가지면 충분히 마음먹고 공격할 수 있는데.. 최대한 버전정보와 web서버의 버전은 노출하지 않는 것이 좋다.
okcupid.com 에 접속해서, 내가 원하는 조건을 가지고 내가 원하는 타입을 찾아낼 수 있다.
내가 원하는 타입이 match 율에 따라서 보여준다.
중요한 점은 웹 페이지에서는 개인적인 정보(preference)를 가지고 있지 않다. 즉 개인 정보는 최대한 보호할 수 있다.
DB에 개인정보를 보면 질문에 대한 답(취향), 숨겨질 정보, 투표, demo data(자신의 외모,키), demo prefs(내가 찾는 이성 정보) 등이 저장되어 있다.
만약 웹서버에서 DB에 접속해서 개인 정보를 얻어오려고 한다면, 얼마나 많이 검색해야 할까? 1K 디스크 seek만 해도 천3백만명이면, 1억 3천만개의 seek를 해야 한다.
우리는 scalable, low cost, fast, reliable 관점으로 시스템을 구축했다.
* scalable 관점
worker는 분산 아키텍처기반으로 나누어져 있다. 이렇게 하면 2배이상의 효율을 얻어낼 수 있다.
웹 서버의 요청을 받아 merger를 통해 worker로 정보를 읽어오게 하고, 그것을 하나로 데이터를 만들어 웹 서버로 전달했다.
* low cost 관점
c++은 java보다 3배 빠르고, 4배 메모리를 적게 먹어서 서버를 적게 사용할 수 있었다.
12core에 맞게 12개의 worker를 두었다.
* fast 관점
어떻게 해야 가장 빨리 검색할 수 있을까? location, last login을 기준으로 검색해야 했다.
quadtree를 이용해서 지역과 last login정보를 검색하도록 해서 high dimension tree보다 2배 이상 빨리 검색할 수 있었다.
(@김용환 코멘트 : 사실 이미지 검색쪽에서 많이 사용되었던 알고리즘이다. jpeg2000에서 이 알고리즘을 보고 좋아했었다. location 시스템에서 quadtree는 속도가 엄청빠르다. 일부 표준 문서에 jpeg2000으로 이미지를 압축해서 보내는 것을 넣는 것을 했었다.)
(@김용환 코멘트 : quardtree가 속도가 좋을 수 밖에 없는 것은 바로 밀집성과 연관되어 있다. 지도에서 보면, 미국 동북부 지방, 캘리포니아 지방에 사각형이 세밀하게 있고, 텍사스쪽은 허허 벌판이다. 즉 사람 정보가 거의 없다는 것을 의미한다. 인구의 밀집성에 맞춘 검색에 적합하다고 할 수 있다.)
댓글을 달아 주세요