Nginx와 Apache
웹 서버
- 웹 서버는 HTTP 프로토콜을 통해 읽힐수 있는 문서를 처리하며 일반적으로 웹 애플리케이션의 앞단에 배치되곤 한다.
- 동적인 리소스는 WAS에게 처리하도록 하고 정적인 리소스를 보다 효율적으로 처리하기 위한 방법일 수 있다.
1. Apahce
1-1.스레드/프로세스 기반 구조
- 클라이언트 요청 하나당 스레드 하나가 처리하는 구조. 사용자가 많으면 스레드 생성, 메모리 및 CPU 낭비가 심하다.
- 요청을 받으면 MPM(Multi Processing Module :다중처리 모듈) 방식으로 처리한다.
Apahce문제점
- 1개의 클라이언트당 1개의 스레드(or 프로세스)구조 였기 때문에 클라이언트가 맺은 접속이 완전히 끝나지 않으면 한 스레드/프로세스가 죽지 않는 방법을 사용했다. (keep alive)
- 서버의 프로세스가 blocking되면 요청 처리 못하고, 완료 될때까지 대기
- 그러므로 대량 접속에서 효율이 떨어지는 문제점이 있다.
- Apahce 2.4부터는 Event MPM을 사용해서 해결하고있다.
1-2-1. Prefork MPM
- 1개의 자식 프로세스가 1개의 스레드를 갖는 구조로, 자식 프로세스는 최대 1024개 까지 가능
- 실행 중인 프로세스를 복제해서 실행한다.(메모리까지 같이 복제)
- 응답프로세스를 미리 띄워놓고 클라이언트 요청 시 자식 프로세스가 반응하게 되는 방식.
- 스레드 간 메모리 공유X (독립적이기 때문에 안정적이나, 메모리를 많이 사용한다. 왜냐, 프로세스1:스레드1 이니까, 각기다른 프로세스의 스레드)
- 디버깅이 빈약한 플랫폼에서 쉬운 디버깅 가능
- 일반적으로 single CPU또는 Dual CPU에서 성능이 좋다
1-2-2. Worker MPM
- 1개의 프로세스가 각각 여러 쓰레드를 사용하게 된다.
- 쓰레드간의 메모리를 공유한다.
- prefork보다 메모리 사용량 적고, 통신량이 많은 서버에 적절하다.
prefork vs worker
- 둘의 속도는 비슷하다.
prefork | worker |
---|---|
안전하지 않은 제 3자가 만든 모듈 사용가능 | 통신량이 많은 서버에 적합 |
디버깅이 빈약한 플랫폼에서 쉽게 디버깅 | prefork에 비해 적은 메모리 사용 |
event MPM
- 아파치 2.4.x 버전부터 생성된 방식 – worker 방식을 기반으로 함
2.Nginx (엔진엑스)
- 웹 서버 s/w로 가벼움과 높은 성능을 목표로 한다.
- 웹서버, 리버스 프록시, 캐싱, 로드 밸런싱, 미디어 스트리밍 등을 위한 오픈소스 s/w
- Nginx는 요청에 응답하기 위해 비동기 Event-driven 기반 구조를 가진다.
특징
- 스레드를 많이 사용하지 않기 때문에 문맥교환 비용이 적고 cpu소모도 적다.
- Event-driven 처리 방식으로 모든 IO를 전부 Event-Listener로 미루기 대문에 흐름이 끊기 지 않고 빠르게 응답이 가능하다.
프록시+로드밸런싱
# Load Balancing
upstream target-server {
least_conn;
server [서버주소1] weight=5 max_fails=3 fail_timeout=10s;
server [서버주소2] weight=10 max_fails=3 fail_timeout=10s;
}
server {
listen 80;
listen [::]:80;
server_name front.local;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_next_upstream error http_503;
proxy_pass http://target-server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_redirect off;
}
}
- 로드 밸런싱
- upstream이라는 옵션으로 설정가능
- least_conn은 연결이 가장 적은 서버로 트래픽 전달
- (유료)Nginx Plus만 Health check지원
- ※HAProxy
- L4,L7 H/W 로드밸런서 대체하기 위한 오픈소스 S/W
- (High Availabilty 고가용성). Nginx와 달리 health check, 특정 api에서 서버상태 점검 가능
- 참고 글