Nginx 웹 서버 알아보기
들어가기에 앞서
사람들이 가장 흔히 알고있는 웹 서버는 Apache일 것이다. 얼마나 유명하면 Tomcat과 합쳐서 Apache Tomacat이라고 까지 불리니 말이다. 필자도 얼마전까지 계속 그렇게 알고있었지만 Nginx를 알고나서는 생각이 바뀌었다. 사실 생각이 바뀐게 아니라 팩트가 그렇지 않았다. 얼마전까지만 해도 압도적이었던 Apache가 이제는 Nginx에 밀려버린 것이다.
웹 서버에 대해서
Nginx는 웹 서버의 종류 중 하나이다.
보통 요청이 이루어지는 과정을 살펴보면
- 클라이언트 - 웝 서버 - WAS - DB
의 순서로 이루어진다고 볼 수 있다. 여기서 웹 서버의 역할을 하는 것이 Nginx이다.
여기서 웹 서버는 정적인 요소들을 처리하는 작업을 해준다. 예를 들면 변하지 않는 데이터인 이미지, css, js, html등과 같은 데이터를 웹 서버가 처리하는 것이다.
WAS는 그 외에 나머지 요청들을 처리한다. 만약 사용자가 로그인을 요청했다면 아이디와 비밀번호를 DB로 전달해서 받아온 응답데이터를 처리해주는 것이 WAS이다.
물론 WAS도 웹 서버가 하는 작업을 그대로 할 수 있다. 그럼에도 웹 서버를 사용하는 이유는 WAS가 가지고있는 부담을 덜어주기 위해서이다. 안그래도 할 일이 많은 WAS이기에 역할을 분담해서 처리하는 것이다.
Nginx에 대해서
Nginx는 동작하는 구성이 크게 2가지의 마스터 프로세스와 워커 프로세스로 구성된다.
마스터 프로세스의 역할은 워커 프로세스를 생성하고 관리하는 역할을 한다. 기존에 워커 프로세스가 동작하고있을 때 만약 새로운 워커 프로세스를 만들어서 동작시키고 싶다면 새로운 워커 프로세스를 만든 후 기존의 워커 프로세스에는 더이상 요청을 받지 않도록 한다. 그리고 기존에 있던 워커 프로세스에 있던 모든 요청이 만료되면 이 프로세스들은 종료시킨 뒤 새롭게 생성된 워커 프로세스로만 동작시키는 것이다.
이렇게하면 기존의 요청들이 끊김없이 깔끔하게 처리 될 수 있다.
워커 프로세스는 실질적으로 요청을 처리하는 곳이다. 프로세스의 개수는 개별적으로 설정할 수 있지만 기본적으로는 컴퓨터의 코어의 개수와 프로세스의 개수를 동일하게 설정한다. 이렇게 하면 컨텍스트 스위칭이 감소하여 CPU의 부담을 줄여줄 수 있다.
Nginx를 사용하는 이유
그렇다면 왜 Nginx를 사용하는 것일까? 이유로는 Nginx가 가지고있는 여러 기능들이 있다.
- 빠르다
- 리버스 프록시(Reverse Proxy)로 사용이 가능하다.
- 비동기 처리
이 외에도 정말 많은 기능들을 가지고 있지만 대표적인 기능들은 이러하다.
(1) 빠르다
Nginx의 속도를 알기 위해서는 다른 웹 서버와의 비교가 필요하다. Nginx를 제외한 가장 인기가 많은 웹 서버는 아마 Apache일 것이다. 아파치와 Nginx에 동시 요청을 3000개를 보냈을 때의 지표이다.
파란색이 아파치이고 빨간색이 Nginx이다. 동시 요청이 많이 발생할 수록 아파치의 사용량은 급격하게 늘어나지만 Nginx의 사용량은 크게 늘지 않는 것을 볼 수 있다.
그리고 초당 요청 처리 수 이다.
이번에는 빨간색이 Nginx이고 파란색이 아파치이다. 동시요청자수가 늘어나도 Nginx는 굉장히 빠른속도로 처리한다는 것을 볼 수 있다.
(2) 리버스 프록시
프록시 라는 것은 사전적의미로는 '대리'라는 의미가 있다. 일을 대신 처리해주는 것이다.
이런 프록시에는 2가지 종류가 있는데 포워드 프록시와 리버스 프록시이다.
- 포워드 프록시 : 클라이언트와 웹 사이에 위치
- 리버스 프록시 : 웹과 WAS사이에 위치
Nginx는 리버스 프록시가 가능한 웹 서버인 것이다.
만약 구동하고 있는 WAS가 2개가 있다고 했을 때 리버스 프록시는 WAS로 전달되는 요청을 받아서 어느쪽으로 가면될지 길을 안내해주는 역할을 한다. 이것을 로드밸런싱이라고 한다.
로드밸런싱이 가능하다면 요청을 분산시킴으로서 서버로 가는 부하를 낮춰줄 수 있을 것이다. 또한 2개의 WAS를 번갈아가면서 바라보게 하면 무중단 배포도 가능해질 것이다.
또한 캐시기능도 있기 때문에 정적파일에 대한 요청이 들어왔을 때 이미 한 번 들어온 요청이면 WAS로 전달하지 않고 캐싱해놓은 데이터로 빠르게 처리할 수 있다.
(3) 비동기 처리(이벤트 루프)
아파치는 요청이오면 하나의 요청당 하나의 프로세스를 만들어서 처리한다. 이렇게 되면 동시 요청이 많이 올 수록 프로세스가 많이 사용되기 때문에 메모리 문제가 나타날 수 있다.
하지만 Nginx는 하나의 프로세스에서 비동기 방식으로 처리하기 떄문에 이러한 문제로 부터 자유롭다. 이러한 방식을 이벤트 루프라고 한다. 이와 같은 방식으로 동작하는 것으로 Node.js가 있다.
'Nginx' 카테고리의 다른 글
Nginx를 이용하여 무중단 배포하기 (0) | 2022.06.29 |
---|