NGINX

U_Uracil·2023년 12월 27일
0

서버

목록 보기
1/1

nginx logo.svg

NGINX

  • 세계 점유율 1위 Web Server
  • 높은 성능, 가벼움

Web Server

web-service-architecture.png

  • 웹 브라우저와 같은 클라이언트로부터 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

  • 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)

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

profile
기억은 유한, 기록은 무한

0개의 댓글