NGINX
- 세계 점유율 1위 Web Server
- 높은 성능, 가벼움
Web Server
- 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML문서, CSS, Javascript, 이미지 등 정적 컨텐츠를 반환해주는 프로그램
- 동적 컨텐츠를 요청받으면 WAS에게 해당 요청을 넘기고, WAS에서 처리한 결과를 클라이언트에게 전달하는 역할도 수행
Web Server의 사용 이유
1. WAS의 부담을 줄임
- Web Server에서 정적 컨텐츠를 처리하게 함으로써 WAS의 부담을 덜어줌
- WAS는 기본적으로 동적 컨텐츠를 제공하기 위해 존재하므로 정적 컨텐츠까지 처리하면 수행 속도가 느려짐
- 과거에는 WAS의 정적 컨텐츠 처리 속도가 느렸지만, 현재는 Web Server만큼 속도가 나오기는 함
2. 물리적으로 분리하여 보안 강화
- SSL에 대한 암·복호화 처리에 Web Server를 사용
3. 여러 대의 WAS를 연결 가능 (Load Balancing)
- fail over(장애 극복), fail back(장애 이전 복구) 처리에 유리함
- 무중단 운영이 가능함
4. 여러 웹 어플리케이션 서비스 가능
- ex) 하나의 Web Server에 PHP Application과 Java Applicaition을 함께 사용 가능
Web Server를 사용하면 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성이 증대됨
Web Server에 대해 알아봤으니 본격적으로 NGINX에 대해 알아보자
NGINX의 탄생 배경
Before NGINX (Apache HTTP Server)
- NGINX의 탄생 이전, Apache HTTP Server(이후 아파치 서버)가 존재
- 아파치 서버는 unix 계열의 OS가 네트워크 커넥션을 생성하는 방식과 유사하게 유저 요청이 들어오면 하나의 프로세스를 할당해 처리하게 구현됨 (아래 그림 참조)
- 이를 Thread Driven 방식이라고 함
- 프로세스를 생성하는 건 부하가 매우 크기 때문에 프로세스를 미리 생성해놓고 요청이 들어올 때마다 프로세스를 할당해주는 Prefork 방식을 사용
- 이 방식은 다양한 모듈을 만들어 유저 요청을 동적으로 처리하기 좋음
요청을 받아 응답을 내보낸다
의 로직 중간에 모듈로서 필요한 로직을 구현해 추가하는 식
C10K 문제
- 시간이 흐르고 PC의 보급률이 높아지고 인터넷이 널리 보급됨에 따라 클라이언트에서 서버로의 트래픽 또한 기하급수적으로 늘어남
- 그 과정에서 아파치 서버는 커넥션이 약 1만개일 때 새 프로세스를 더이상 생성할 수 없는 문제인
Connection 10K Problem
, 즉 C10K 문제
가 생김
- 당시의 하드웨어 성능은 커넥션 1만개를 거뜬히 처리할 수 있었음
- 하지만 아파치 서버의 장점이었던 모듈을 쉽게 추가 가능하다는 점 때문에 서버 프로세스가 무거워지고, 이 프로세스를 커넥션 수만큼 생성하는 과정에서 문제가 발생
- 많은 프로세스가 끊임없이 컨텍스트 스위칭하는 비용도 문제
NGINX의 구조
- 위의 문제를 해결하기 위해 개발된 것이 NGINX
- 아파치 서버 앞 단에 NGINX를 두어 아파치 서버가 받을 커넥션을 줄여줄 목적
- NGINX 자체가 웹 서버이기 때문에 정적 파일은 NGINX에서 처리하고, 동적 요청만 아파치 서버로 넘기는 방식으로 아파치 서버가 받을 부하를 줄임
- NGINX는 아파치 서버와 다른 방식으로 다중 커넥션 연결을 처리
마스터 프로세스, 워커 프로세스
- NGINX는 구동 시 정해진 양만큼 프로세스를 만들어두고, 그 프로세스만으로 요청을 처리함
- 마스터 프로세스 : 설정파일을 읽고 워커 프로세스를 생성
- 워커 프로세스 : 유저 요청을 처리
Event Driven 방식
- 커넥션으로부터 요청이 발생(Event)하면 순차적으로 working queue에 들어감
- 워커 프로세스는 working queue에서 비동기로 이벤트를 처리
- 오래 걸리는 작업(Disk I/O 등)의 경우 Thread Pool이라는 다른 작업 공간에서 처리하도록 위임
- working queue의 다른 이벤트의 대기시간이 감소
NGINX의 기능
리버스 프록시(Reverse Proxy)
- 클라이언트의 요청을 대신 받아 내부 서버로 전달해주는 것
장점
- 캐싱 : 자주 사용되는 정적 파일들을 캐시에 저장하여 빠르게 제공하여 응답 시간 개선
- 보안 강화 : 외부 요청을 필터링하여 보안 강화 및 서버의 정보를 공개하지 않음
로드 밸런싱 (Load Balancing)
- 클러스터에 설정되는 서버 정보와 포트를 이용해 어떤 서버가 어떤 작업을 처리할 것인지를 지정해 부하 분산 가능
- 무중단 운영과 장애 복구에 강점을 가짐
기타 기능
- CORS 처리
- TCP/UDP 커넥션 부하 분산
- HTTP/2
NGINX 언제 써야 할까?
- 대량의 정적 데이터 & 가벼운 작업이 많을 때
- 클라이언트의 요청이 많은 서비스일 때
nginx 설정 쉽게 도와주는 깃헙
https://github.com/h5bp/server-configs-nginx
References
https://www.youtube.com/watch?v=6FAwAXXj5N0&ab_channel=우아한테크
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://blog.naver.com/gi_balja/223028077537
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://velog.io/@wijihoon123/Nginx란-무엇인가
https://tecoble.techcourse.co.kr/post/2021-07-30-web-server-and-nginx/
https://sihyung92.oopy.io/server/nginx_feat_apache
https://applefarm.tistory.com/137