nginx란 도대체 뭐지??

YEONGHUN KO·2024년 1월 5일
0

WEB

목록 보기
10/14
post-thumbnail

백엔드 쪽 개념이라 그냥 이름만 들어보았다. 엔징스 라 하기도 하고 엔진엑스 라고 하기도 한다.

그런데 테코톡에서 엔진엑스 라고 하길래 그렇게 부르기로 함.

그럼 엔진엑스가 뭘까? 간단하게 말하면 아래의 기능을 할 수 있다.

웹서버 , 리버스 프록시 , 로드 밸런서

우선 나타난 배경을 보자.

나타난 배경

년도별로 살펴보자.

1995년 : 아파치 서버의 탄생. 두둥!

: 아파치 서버가 개발 됨. 요청이 들어올때 마다 three way handshake를 이용해, connection을 만듬.(http header - keep-alive=5에 적힌 숫자만큼 connection을 유지) 그리고 connection에 따라 process가 만들어짐.

그런데, prefork라고 해서 process를 미리 만드는 기능 추가. 왜냐면 process는 만드는데 시간이 오래 걸리기 때문. 그래서 새로운 요청이 들어오면 미리 만들어둔 process를 주게 됨.

그럼 프로세스가 뭐지?? chat gpt에게 물어보았다.

아파치 웹 서버에서의 "프로세스"는 주로 웹 서버가 클라이언트 요청에 응답하기 위해 실행되는 실행 인스턴스를 나타냅니다.

아파치는 다수의 프로세스를 생성하고 관리하여 동시에 여러 요청을 처리할 수 있습니다.
일반적으로 아파치 웹 서버는 다음과 같은 프로세스 모델을 사용합니다:

  • 부모 프로세스 (Parent Process): 아파치 웹 서버는 처음 시작될 때 하나의 부모 프로세스를 생성합니다. 이 부모 프로세스는 주로 설정 파일을 읽고 서버를 초기화하는 역할을 합니다.

  • 워커 프로세스 (Worker Process): 부모 프로세스는 하나 이상의 워커 프로세스를 생성합니다. 각 워커 프로세스는 실제로 클라이언트 요청을 처리하고 응답을 생성하는 역할을 합니다. 이러한 워커 프로세스들은 동시에 여러 요청을 처리하여 높은 성능을 유지합니다.

  • 쓰레드 (Thread): 각 워커 프로세스는 다시 하나 이상의 쓰레드를 가질 수 있습니다. 쓰레드는 동시에 여러 연결을 처리하는 데 사용됩니다.

==> 개발하기 쉬운 장점. 다양한 모듈을 만들어 서버에 빠르게 추가 가능. 확장성이 좋기도 해서 request, response를 한번에 다 처리 가능

1999년 : 트래픽 점점 증가.

커넥션이 많아지면 몇개의 커넥션이 형성되지 않음(C10K 문제라고도 함)

커넥션 형성 , 다양한 모듈 처리, 다양한 request 처리 ==> context switching이 많이 일어났기 때문.

하지만 인간은 문제를 해결하기 위해 끊임없이 고민하는 존재.
그 고민의 결과물이 바로, nginx

2004년 : nginx의 탄생

아파치 서버의 구조적 한계를 보완하기 위해 NGINX를 개발함. 아파치 서버가 감당했던 수많은 connection을 대신해서 감당할 수 있다.

엔진엑스는 그 자체로 웹서버이다. 그래서 정적파일은 그대로 서빙하고 동적 파일 요청때만 아파치 서버와 통신함. 옷!! Proxy??

우선 아래와 같이 프로세서를 생성한다.

  1. Master process(설정파일 읽음)
  2. worker process(listen 소켓을 각자 지정)
    : 클라이언트 부터 요청들어오면 keep-alive만큼 커넥션 형성. 커넥션으로 부터 아무 요청이 없으면 새로운 커넥션 형성 or 다른 커넥션의 요청 처리. 이런 각각의 처리를 “이벤트”라고 하고, 이벤트는 OS커널이 queue형식으로 worker process에 전달해줌. ==> 비동기 방식으로 처리. 하나의 쓰레드로 처리

아파치의 경우 요청이 없으면 방치되는 process인데, nginx는 자원을 끊임없이 활용하는 모습이다.

만약 큐에서 오래걸리는 작업의 경우 thread pool이라는 곳으로 이동시킨뒤 큐의 그 다음작업을 처리함.

큐 안에서 디스크를 읽는 작업(좀 오래걸리는)이 추가되었다고 하자. 이때 thread pool로 보내어 따로 큐가 막히지 않게 한다.

또한 , cpu의 코어만큼 worker process가 생성. 그래서 코어 수만큼 일꾼들이 늘어남. ==> cpu의 context switching을 최소화.

==> event driven model이라고 함. 아파치와 가장 큰 차이점. 그래서 아파치와는 다르게 수많은 connection을 처리할 수 있게 되었다.

그리고!!!
뒷단의 아파치 서버가 늘어날 경우 환경설정을 동적으로 변경하도록 하여 (master process가 환경설정 감지) 수많은 동시 connection을 처리하면서 로드밸런서 역할까지 함!!

출처 : https://www.youtube.com/watch?v=6FAwAXXj5N0&t=73s

profile
'과연 이게 최선일까?' 끊임없이 생각하기

0개의 댓글