저번에 웹서버와 WAS에 대해서 공부하고 알아봤는데,
이번엔 웹서버중 현재 가장 많이 쓰이고있는, 웹 서버 중 점유율이 무려 35%나 되는 Nginx에 대해서 알아보겠습니다.
Nginx란
트래픽이 많은 웹사이트를 위해 확장성을 위해 설계한 비동기 Event-Driven 구조의 웹서버입니다.
OSI7 Layer 중 application level 아래의 level에서 Nginx 같은 웹서버가 HTTP 통신을 담당합니다.
Nginx는 단순히 정적 파일을 호스팅 해주는 웹서버입니다.
그리고 일명, "더 적은 자원으로 더 빠르게 서비스를 제공"의 컨셉을 갖고 있습니다.
Nginx에 대해 중점적으로 다룰 것이기 때문에, Apache웹서버는 간단하게 살펴보고 넘어가겠습니다.
- Apache는 클라이언트 접속마다 Process 혹은 Thread를 생성하는 구조입니다.
- 1만 클라이언트로부터 동시접속 요청이 들어온다면 CPU와 메모리 사용이 증가하고, 추가적인 Process나 Thread 생성비용이 드는 등 대용량 처리에서 한계를 보입니다.
- 또한, Apache서버의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있습니다. 이는 Keep Alive(접속 대기)로 해결이 가능하지만, 효율이 떨어집니다.
➡️결론적으로, Apache는 "1개의 Thread : 1개의 Client' 라는 구조로 보면 됩니다.
아까 앞서서 Nginx는 적은 자원으로 서비스를 빠르게 제공한다고 했는데, 이는 바로 "이벤트 처리 방식"으로 가능합니다.
Apache의 Thread 기반은 매 요청당 하나의 Thread를 생성하기 때문에, 많은 요청 시 CPU의 부하를 걱정해야 하지만
- Event-driven 방식은 여러 요청을 모두 다 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 합니다.
- 이는 요청을 하나의 Event라 보고 Event Handler로 관리를 하기 때문에 메모리의 낭비가 적습니다.
결국, 많은 요청에서 다른 웹서버보다 성능적 우위를 점할 수 있기 때문에 더 빠른 서비스를 적은 자원으로 이용할 수 있습니다.
SSL 지원
웹페이지 접근 인증
압축
비동기 처리
Sub Domain 처리
(가상 호스팅과 관련된 내용으로 하나의 웹서버에서 여러 서비스를 호스팅할 수 있는 기능을 제공합니다.)
Keep Alive 설정
(Http 설정으로 Http 연결 소켓이 얼마나 지속되어 연결될 지를 설정합니다.)
[Reference]