NGINX 쿡북(2판), 115가지 레시피로 배우는 고성능 부하분산, 보안, 서버 배포와 관리 리뷰

Ryan Kim
5 min readFeb 26, 2023

--

어떤 개발 포지션을 가더라도 꼭 이해하고 넘어가야하는 Nginx 학습 리뷰

“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

23년에도 한빛 미디어 도서 리뷰단에 선정되어 Nginx에 대한 도서를 받게 되었다.

개발을 처음 배우는 시점에 AWS로 Django 서비스를 배포할 때도 Nginx 설정에 대해 찾아봤었고, 지금도 쿠버네티스를 만지면서 Nginx, HA Proxy와 같은 웹 서버 소프트웨어를 많이 찾아보고 있다.

그런데 항상 필요한 부분에 대해서 Nginx는 많이 찾아보면서 업무에 사용했지만, Nginx에 대해 어느 정도 기본적인 지식이 필요하다는 생각을 하게 되었다.

Nginx에 대한 기본 개념이 10이면 1만 활용하는 느낌이랄까?

그래서 이번 달 읽어야할 도서로 Nginx를 선택하게 되었고, 개인적으론 적절한 선택 사유라고 생각한다.

Nginx가 오늘날까지도 많은 사랑을 받는 이유는 대규모 애플리케이션 및 웹사이트 배포 시, 높은 부하를 처리할 수 있고, 빠른 속도와 작은 메모리 foot print(프로그램이 실행되는 동안 사용하거나 참조하는 메인 메모리의 양)를 갖고 있다.

그리고 많은 유저들의 니즈를 반영하여 최근에는 흔히 web3라고하는, HTTP/3의 개발도 진행 중이고, 베타 테스트를 하고 있다는 소식도 접해들었다.

아파치 재단에서 Nginx에 대해 꾸준히 유지 보수하고 새 버전을 업데이트할 의지가 있기 때문에 다양한 개발 스택이 꾸준히 나오더라도 리눅스처럼 기본적인 소프트웨어로 자리 잡을 가능성이 무척 높을 것으로 개인적으로 추측해본다.

Nginx는 간단하게 얘기를 하자면 굉장히 가벼운 종류의 웹 서버라고 볼 수 있다.

처음 개발을 배울 때 사용했던 방법 중의 하나로 클라이언트로부터 요청을 받으면 요청에 맞는 정적 파일을 응답 값으로 전달하는 웹 서버로 사용하는 방법도 예시로 들 수 있고, Proxy 서버로 사용해서 서버의 부하를 줄이는 로드 밸런서로 이용하는 것도 가능하다.

그런데 Nginx가 많이 사용되고, 꾸준히 버전 관리가 되는 이유는 Nginx의 구조적인 측면이 부각되는 이유가 큰데, Nginx가 기본적으로 이벤트 기반으로 요청을 처리하기 때문이다.

아래 이미지 한 장이 구조에 대한 기본적인 사항을 모두 설명할 수 있을 것으로 보인다.

https://www.freecodecamp.org/news/an-introduction-to-nginx-for-developers-62179b6a458f/

보는 것처럼 사용자로부터 “요청(request)” 가 들어오면 해당 이벤트를 처리하기 위해 한 개 또는 정해진 고정된 프로세스만 생성해서 사용하고, 비동기 방식으로 요청들을 동시실행 (concurrency)하게 처리하는 것이 가능하다.

아마 요청량이 많거나 요청 당 리소스가 많이 필요한 경우에는 엔진엑스 서버를 더 띄우거나 하나의 서버에서 사용하는 프로세스 갯수를 조절하면서 사용하는 형태로 보이는데 이 경우엔 사용자 필요에 따라 프로세스를 조절할 수 있기 때문에 확장성이 무척 용이해보인다.

Nginx를 타 애플리케이션과 비교할 때 (경량화된 웹 서버라면, 애플리케이션으로 보는 것도 타당할 것이다) 주로 언급되는 것이 Apache인데, Apache의 경우 요청에 따라 프로세스 또는 스레드가 생성되어 응답 값을 반환한다.

약간 크롬과 인터넷 익스플로러의 구조와 비슷한 것 같다.

(크롬은 페이지 한 개 띄울 때마다 프로세스가 하나씩 새로 생성되고, 익스플로러는 하나의 프로세스에 여러 스레드가 떠서 페이지를 구성하는 방식이라 스레드 중 하나라도 응답이 없거나 에러가 뜨면 브라우저 전체가 꺼진다)

Nginx 책을 읽으면서 깨닫게 되는 것은 결국 소프트웨어를 구성하는 아키텍처는 방법이 거의 대부분 공통적이라는 것이다.

Node.js도 싱글 스레드 논블로킹 I/O로 구조를 구성하거나, 쿠버네티스에서 MSA 구조를 유지하기 위해 개별 파드끼리는 서로에게 독립적으로 운영하는 방식 등이 있을 것이고 사실 컨테이너도 하나의 배포 작업 단위로 다른 작업으로부터 영향을 받지 않기 위해 이미지를 만드는 것도 거의 비슷하다.

컴퓨터 작업물이라는 게 결국 하드웨어 아키텍처에서 파생되는 것들이 전부라는 뜻일 것이다.

Nginx에 대해 여러 부분으로 배워봤는데, Nginx 자체가 하나의 프로젝트로 투입되어 사용되기 보다는 다른 프로젝트의 sub 형태로 지원하는 목적으로 많이 쓰여서 늘 학습 순위에서 우선이 되지 못했었다.

그런데 앞으로도 MLOps 업무를 지속할 것이라면 Nginx는 여전히 필요한 지식이라 앞으로 Nginx 쿡북 책은 약간 필요할 때마다 찾는 레퍼런스 북이 되지 않을까 싶다.

Ryan

--

--