개요
현재 사용하는 아키텍처는 apache를 사용하고 이에 대한 개선작업을 하고 있다. 이전에는 nginx위주로 세팅을 하고 있었기에 apache에 대한 개념이 부족하다고 느껴 글을 작성하게 되었다.
웹서버
현재 웹서버는 보통 nginx나 apache를 사용하고 있다.
두 서버의 간단한 비교를 해보자.
Apache HTTP server
apache는 Apache Software Foundation에서 만든 웹서버 프로그램이다. 거의 모든 OS에서 실행이 가능하고,다른 유명한 소프트웨어와의 문서등의 레퍼런스, 통합지원들이 잘되어있다.
주요 특징
- 스레드/프로세스 기반 구조
- 클라이언트 요청당 하나의 스레드가 처리하는 구조
- 사용자가 많으면 스레드 생성, 메모리 및 CPU낭비가 심함
- MPM(Multi Process Module)
MPM방식은 크게 prefork/worker 두가지가 있다.
prefork MPM
- Client요청에 대해 Apache자식 프로세스를 생성하여 처리
- 요청이 많을 경우 Process를 생성하여 처리
- 하나의 자식 프로세스 당 하나의 스레드를 갖는 구조로, 자식 프로세스는 최대 1024개까지 가능
- 스레드간 메모리는 공유하지 않음(독립적이기에 안전하지만, 메모리 소모가 크다)
- 실행중인 프로세스를 복제하여 실행(메모리 영역까지 복제)
- 응답 프로세스를 미리 띄워놓고 클라이언트 요청시 자식 프로세스가 반응하는 방식
- 디버깅이 빈약한 플랫폼에서 쉬운 디버깅이 가능
- 일반적으로 Single CPU 또는 Dual CPU에서 성능이 좋음
Worker MPM
- Prefork보다 메모리 사용량이 적고, 동시접속자가 많은 사이트에 적합(각 프로세스의 스레드를 생성해 처리하는 구조)
- 스레드 간의 메모리 공유가 가능
- 프로세스당 최대 64개의 스레드 처리가 가능하며, 각 스레드는 하나의 연결만을 부여받음
- 일반적으로 MultiCPU 시스템에서 성능이 좋음
MPM event-driven
- apache에도 이벤트 드리븐 방식으로 처리를 할 수 있음.
(이에 대한 신뢰성 있는 자료는 많이 확인하지 못했지만, 전반적으로 nginx가 apache보다 요청을 더 빠르게 처리할 수 있는것을 볼 수 있음)
비교자료비교자료2
를 통해 장단을 간단하게 비교해 볼수 있음
- 다만 비동기의 효율성이 다르며, 컨텍스트스위칭 관리로 인해 여전히 오버헤드 발생 가능
- 동적 컨텐츠 처리
- 다양한 모듈
- Process/Thread로 접근되어 개별적인 연결이 진행되며, 웹서비스 로직의 어느 지점에서나 새로운 모듈을 추가하거나, 수정하는 것이 쉬움
- http.access를 통해 다양한 커스터마이징 가능
https://httpd.apache.org/docs/2.4/ko/mod/ 위를 참고하여 다양한 모듈이 있음을 확인 가능
단점
- 클라이언트 접속 시마다 프로세스 또는 스레드를 생성하는 구조이기에 대량의 클라이언트(c10k)가 동시에 접속한다면 CPU/Memory 사용이 증가하고 프로세스/스레드 생성 비용이 드는 등 요청의 한계가 있음
- Apache서버의 프로세스가 blocking되면 요청을 처리하지 못하고 처리가 완료될때까지 계속 대기함(Keep Alive를 이용해 해결이 가능하지만 대량접속시에는 효율이 떨어짐)
Apache Tomcat과의 차이점
기본적으로 아파치와 톰캣은 나뉘어져 있지만, 톰캣 안에 있는 컨테이너를 통해 일부 아파치 기능을 발휘하기 때문에 톰캣을 아파치 톰캣으로 부른다.
Nginx
- Apache의 C10K 문제를 해결하기 위해 만들어진 Event-Driven구조의 웹서버 소프트웨어이다.
주요 특징
- Event-Driven처리 기반 구조
- 한개의 고정된 프로세스만 생성하고, 여러개의 Connection을 모두 Event-Handler를 통해 비동기 방식으로 처리
- 적은 양의 스레드만 사용되기 때문에 Context Switching 비용이 적고, CPU소모가 적음
- CPU와 관계없이 모든 I/O들을 전부 EventListener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업이 가능(메모리를 적게 사용)
- Apache와 달리 동시 접속자수가 많아져도 추가적인 생성비용 안듦
- 리버스 프록시로 배치가능
- Nginx의 빠른 처리속도를 활용하여 클라이언트의 모든 요청을 처리함
단점
- 동적 컨텐츠를 기본적으로 처리할 수 없음
- apache에 비해 다양한 모듈이 적으며(핵심 묘듈만 존재) 개별모듈을 추가하기 어려움 (돌아가고 있는 워커 프로세스를 종료해야 하므로 커넥션과 관련된 요청을 더이상 진행할 수 없음)
https://nginx.org/en/docs/http/ngx_http_core_module.html 모듈의 수가 조금 적음을 확인할 수 있음.
출처:
https://velog.io/@deannn/Apache와-NginX-비교-차이점https://growthjournal.tistory.com/entry/톰캣vs아파치-의미-차이점https://nginxstore.com/blog/nginx/apache-vs-nginx-완벽-비교/https://daram.tistory.com/532https://blog.naver.com/nicehosting/220576101025