Nginx
in Web
본 글은 네이버 부스트캠프 과정을 위해 별도 학습 후 작성한 노션 문서를 이전한 글입니다.
1. 서론
1.1. Nginx란
- 경량 웹 서버
- 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용
- WAS 서버의 부하를 줄일 수 있는 로드 밸런서 역할을 하는 Reverse Proxy Server로 활용
1.2. Nginx 흐름
- Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용
- 비동기 방식으로 요청들을 Concurrency(동시성)하게 처리할 수 있음
- 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않음
- 적은 자원으로도 효율적인 운용이 가능
- 이러한 Nginx의 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있음
1.3. Nginx 구조
- 하나의 Master Process와 다수의 Worker Process로 구성되어 실행됨
- Master Process
- 설정 파일을 읽고 유효성을 검사 및 Worker Process를 관리
- Worker Process
- 모든 요청을 처리
- Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용
- Worker Process의 개수는 설정 파일에서 정의, 정의된 프로세스 개수와 사용가능한 CPU 코어 숫자에 맞게 자동으로 조정
2. 웹 서버와 NginX
2.1. 웹 서비스의 발전
- 초기 웹 서비스는 대부분 정보 전달이 목적인 문서 위주의 정적 페이지였음
- 그렇기 때문에 HTML과 같은 마크업 언어로 작성된 문서를 서버에서 보내주기만 하면 됐었음
- 이후 조금 발전된 형태로 스크립트 언어를 얹은 동적 페이지 등장
- 이때까지만 하더라도 서버에서 데이터를 처리하고 클라이언트로 전송해주는데 큰 부담이 되지 않았음
- SPA(Single Page Application)라는 개념이 등장하면서 서버가 분리될 필요성이 생김
- SPA
- 기존 웹 페이지와는 달리 페이지 갱신에 필욯나 데이터만을 전달받아 페이지를 갱신
- 이때 필요한 데이터는 사용자마다 달라졌고, 복잡한 연산이 필요하기도 하였음
- SPA
- 웹 페이지에 필요한 정적 데이터와 페이지 갱신에 필요한 동적 데이터를 하나의 서버에서 처리할 경우
- 부하가 커지게 되고 처리가 지연됨에 따라 수행 속도가 느려지질 것
- Web Server와 WAS(Web Application Server) 같은 개념이 생겨나게 됨
2.2. 웹 서버(Web Server)
- 클라이언트의 요청을 처리하는 기능을 담당
- 클라이언트가 HTML, CSS와 같은 정적 데이터를 요청하면 앞단에서 빠르게 제공하고, 동적 데이터가 필요하면 WAS에 요청을 보냄
⇒ NginX는 바로 이 Web Server의 구축을 도와주는 소프트웨어
2.3. WAS(Web Application Server)
- DB 조회나 다양한 로직을 처리하는 기능을 담당
- Web Server의 요청을 통해 WAS가 처리한 데이터를 클라이언트에 전달
2.4. 엔진 엑스 (NginX)
- Web Server의 구축을 도와주는 소프트웨어
- 웹 서버 소프트웨어라고도 함
- Nginx
- 비동기 이벤트 기반으로 하는 방식으로 처리
- 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다음 요청을 처리하는 방식으로 진행
- 흐름이 끊기지 않고 응답이 빠름
- 공식 홈페이지에 가볍고 빠른 성능을 추구한다고 강조되어 있음
- Apache가 있음 (둘의 차이는 클라이언트의 요청을 처리하는 동작 방식의 차이)
- 스레드/프로세스 기반으로 하는 방식으로 요청을 처리
- 요청 하나당 스레드 하나가 처리하는 구조
- 사용자가 많아지면 CPU와 메모리 사요잉 증가해서 성능이 저하될 수 있음
- Nginx
- 웹 서버 소프트웨어라고도 함
- 웹 어플리케이션을 안정적으로 제공할 수 있도록 도와주는 역할을 수행
2.5. Nginx의 기능
2.5.1. 리버스 프록시 (Reverse Proxy)
- 중계 기능을 하는 서버
- 클라이언트가 서버를 호출할 때 직접 서버에 접근하는 것이 아닌 리버스 프록시 서버를 호출
- 리버스 프록시 서버가 서버에게 요청을 하고 응답을 받아 클라이언트에 전달
- 클라이언트는 리버스 프록시 서버를 호출하기 때문에 실제 서버의 IP를 감출 수 있고, 이를 통해 보안을 높일 수 있음
2.5.2. 로드 밸런싱
- 부하 분산, 서버에 가해지는 부하를 분산해 주는 역할
- 이용자가 많아서 발생하는 요청이 많을 때, 하나의 서버에서 이를 모두 처리하는 것이 아닌 여러 대를 이용하여 요청을 처리하게 됨
- 이 때 서버의 로드율과 부하량 등을 고려하여 적절하게 서버들에게 분산 처리하는 것
- 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 계속 유지할 수 있는 무중단 배포가 가능
3. Nginx 배포 방법
3.1. Nginx - React
3.2. Nginx 동영상
https://www.youtube.com/watch?v=6FAwAXXj5N0