web server architecture
웹서버 웹어플리케이션서버 DB
웹서버는 대표적으로 아파치, nginx가 있는데
클라이언트에서 요청을 받고 정적 페이지라면 직접 처리를 또는 동적 페이지라면 웹 어플리케이션 서버에 보낸다. 또한 웹 어플리케이션에서 받은 데이터를 클라이언트에 다시보내는 역할도 한다. 물론 웹 서버가 직접 동적 페이지 요청을 처리할때도 있다. php와 함께 이용해 요청을 처리 할 순 있지만 보통 그러하진 않는다. 그 이유는 왜냐? 예전에는 속도를 꼽곤했지만 현재는 유의미한 차이는 아니다. 진짜 이유는 웹 서버는 그 외에도 역할이 많다.
먼저 웹 서버는 리버스 프록시 기능을 한다. 프록시 자체는 많이 들어 보았을 것이다. 다른 네트워크에 접속할때 보안등의 이유로 직접이 아닌 중계 서버를 두는 데 이를 프록시라고들 한다. 클라이언트가 본인 IP를 숨기기위해 사용하는 중계 서버가 포워드 프록시이고, 리버스 프록시는 그 반대. 서버가 그 주소를 클라이언트에게 감추기 위해 사용하는 중계 서버이다. 이 웹 서버가 리버스 프록시역할을 한다.
다음으로 로드 밸런서 역할을 한다.
로드 밸런서는 앞서 작성했듯 서버의 부하를 예방한다. 여러 웹어플리케이션 서버에 접속하는데 작업 분배를 잘 해주어 클라이언트들이 끊김 없는 서비스를 제공받는다.
다음으론 캐싱이다.
웹 서버는 리버스프록시 캐싱 즉, 서버와 서버간 캐싱 기능을 지원한다.
사용자가 자주 요청한 것들을 캐시 메모리에 저장해두고 자주 요청한 만큼 재요청이오면 바로 꺼내서 제공한다.
이 외에도 웹서버는 수많은 모듈들을 사용하여 뒤의 웹 어플리케이션들의 헬스체크를 하는 등 여러 역할을 맡는다. 그렇기에 웹 서버는 웹어플리케이션역할 까지 맡기지 않는다.
비유하자면 웨이터 역할이다. 또 비유하자면 웹 어플리케이션 서버는 주방장 역할이다.
웹 서버의 종류로는 대표적으로 아파치 nginx 그리고 웹 어플리케이션 종류로 톰캣 nodejs django등등 이있다.
여기서 아파치와 nginx의 차이는 프로세스 처리 방식이다. 아파치는 멀티 프로세싱 방식으로 일을 처리한다. 기존부터 오래동안 사용해왔고 안정적이다 nginx는 이벤트 처리 방식이다.
아파치는 멀티 프로세싱 방식 즉 요청이 들어올때마다 프로세스를 생성해서 처리한다. 이는 속도가 느려지는 주범임을 직감할 수 있을 것이다. 또는 npm-worker 즉 요청이 들어오면 요청마다 스레드를 생성한다. 이 역시도 성능 문제는 같다. (c10k문제)
nginx는 이벤트 driven 방식 즉 싱글 스레드가 루프를 계속 돌리면서 이벤트 큐에 요청이 들어오면 쓰레드 풀에 넣어 비동기 적으로 처리한다. 즉 비유하자면 손님들을 한줄로 쭉 세워 시간이 걸리는 작업이 생기면 뒤로 서게하고 계속해서 일을 처리하는 방식이다. 물론 아파치 역시 이 event driven 방식을 후에 추가했다.
카테고리 없음