[Web]Nginx와 Apache

HW·2023년 6월 6일
0

서론

웹 서버는 클라이언트의 요청을 받아 처리하여
정적/동적콘텐츠를 제공하는 핵심 역할을 수행합니다.
그 중 Nginx가 Apache의 장단점을 살펴보겠습니다.

본론

Apache 구조

Unix 계열 OS가 네트워크 형성하는 방식과 동일합니다.
클라이언트로부터 요청이 들어오면 Connection을 형성하기 위해
프로세스를 생성합니다.

프로세스 생성은 오래 걸리는 작업이기 때문에,
Apache는 미리 프로세스를 생성해 놓는 Prefork 방식을 사용합니다.
새로운 요청이 들어올 때까지 프로세스를 생성하지 않습니다.

만약 Prefork된 프로세스가 모두 할당 되면
그 때 새로운 프로세스를 생성합니다.

이러한 구조는 개발하기 쉽고 다양한 모듈을 추가하기도 용이합니다.

문제점

C10K (Connection 10000 Problem)

컴퓨터가 보급되면서 동시에 많은 요청이 발생하는 상황이 발생했고,
이로 인해 새로운 Connection 프로세스를 생성할 수 없게 되었습니다.

Apache는 Http Header의 Keep-Alive를 사용하여
Connection 프로세스를 재활용하였으나,
클라이언트 수와 동시 Connection 수가 증가함에 따라
서버는 더 이상 Connection을 형성하지 못하게 됩니다.

결국 문제는 프로세스 생성으로 인한 메모리 부족과
많은 Connection으로 인한 Context Switching으로
CPU 부하가 증가하는 것이 주요 원인입니다.

Nginx 구조

Nginx는 처음에 Apache와 함께 사용하기 위해 개발되었으며, 주로 Apache 서버 앞 단에서 동시 Connection을 처리합니다.

Nginx의 구조는 Master Process와 Worker Process로
이루어져 있습니다.

Master Process는 Worker Process를 생성하고,
각 Worker Process는 Resource Socket을 할당받아
요청을 처리합니다.

Nginx에서 Connection 형성, 제거, Requst 처리를 Event라고 부릅니다.
이러한 Event들은 OS Kernel이 Queue 형식으로
Worker Process에게 전달합니다.

Event들은 Queue단계에서 비동기 방식으로 대기하며,
Worker Process는 하나의 Thread로 Event를 꺼내고 처리합니다.

Queue 이외에도 Thread Pool이 존재하여 오래 걸리는 Event는 Worker Process가 Event를 Thread Pool에 위임할 수 있습니다.

Worker Process 생성은 일반적으로
CPU의 코어 개수만큼 이루어져
Context Switching을 줄일 수 있습니다.

설정에 따라 동적으로 Worker Process를 생성하여
동시 Connection을 유지한 채로 설정을 변경할 수 있습니다.

포워드 프록시, 리버스 프록시, 로드 밸런싱 등의 기능을 원활하게 수행할 수 있습니다

Apache의 MPMs (Multi-Processing Modules) 모듈에 비해 Nginx는 메모리 사용량이 적습니다.

단점

기능을 추가하면 Worker Process가 종료될 수 있습니다.
또한 직접 모듈을 개발하기가 상대적으로 까다로울 수 있습니다.

결론

Apache는 개발이 쉽고 다양한 모듈을 추가하기 용이한 구조를 가지고 있지만, C10K 문제와 메모리 부족으로 인한 성능 저하가 발생할 수 있습니다.

반면 Nginx는 동시 Connection을 효율적으로 처리하고 메모리 사용량을 줄일 수 있는 구조를 가지고 있으나, 모듈 개발의 어려움이 있습니다.

참고자료

https://github.com/h5bp/server-configs-nginx

profile
예술융합형 개발자🎥

0개의 댓글