Nginx, Apache

강현구·2022년 4월 10일
0

Apache

특징과 장점

아파치 서버에서는 요청이 들어오면 커넥션을 생성하기 위해 프로세스를 생성한다.
새로운 클라이언트의 요청이 들어올 때마다 새로운 프로세스를 만든다.
(이는 Unix 계열 OS가 네트워크 커넥션을 형성하는 모델을 그대로 적용한 것이다.)

그런데 프로세스를 만드는 것이 시간이 오래걸리는 작업이고,
이 때문에 요청이 들어오기 전에 프로세스를 미리 만들어 놓는 prefork 방식을 사용한다.
새로운 요청이 들어오면 미리 만들어 놓은 프로세스를 가져다 쓰는식으로 하고,
미리 만든 프로세스를 모두 사용하면 추가로 프로세스를 만들게 된다.

이러한 구조는 개발하기 쉽다는 장점이 있다. -> 확장성!
다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할 수 있다.
요청을 받고 응답을 처리하는 과정을 하나의 서버에서 처리하기 좋았다.

단점과 문제

하지만 점차 인터넷 트래픽이 늘어나 요청이 많아지다보니 더 이상 서버에 커넥션을 형성하지 못하는 문제 발생!
: C10K 문제 (Connection 10,000개의 문제!)

  • 동시에 연결된 커넥션 수
    요청을 처리하기 위해 서버가 한 시점에 얼마나 많은 클라이언트와 커넥션을 형성하는지에 대한 지표
    한 클라이언트는 하나의 커넥셔을 이용해서 여러 요청을 보낼 수 있다.
    한 커넥션은 긴 시간 동안 유지될 수 있다.
  • 초당 요청 처리 수
    말 그대로 서버가 얼마나 빨리 요청을 처리할 수 있는지를 나타내는 지표
    따라서 위의 두가지 지표는 서로 같지 않다.

요청을 보낼 때 이미 만들어진 커넥션이 있다면 재활용하는 방법을 사용
http의 header에 keep-alive가 있는데 이 헤더에 적힌 시간만큼 클라이언트와 서버는 커넥셔을 유지한다.
그런데 클라이언트의 숫자가 많아지면, 그만큼 동시에 연결되어 있는 커넥션 수는 더욱 많아지게된다.
이렇게 만들어진 동시 커넥션이 10000개를 넘어가는 순간 서버는 더 이상 커넥션을 형성하지 못하는 상황이 발생.
이 때, 하드웨어적인 문제는 없었다.
충분히 문제를 커버할 수 있는 레벨이고 웹페이지의 컨텐츠 용량을 감안했을 때, 컴퓨터의 성능은 충분히 좋았다.
문제는 아파치 서버의 구조 자체!
아파치 서버에서 커넥션을 처리하기 위해 프로세스가 할당될 것이고 이는 곧 메모리 부족 현상으로 이어진다.
게다가 여러가지 기능을 추가할 수 있는 기능이 오히려 프레세스가 차지하는 리소스이 양을 늘려 단점으로 작용.
많은 커넥션에서 요청이 들어오면 CPU코어는 계속해서 프로세스를 바꿔가면서 일을해야 했다.
(= 컨텍스트 스위칭을 굉장히 많이 한다, CPU가 감당해야할 일이 많음.)

=== 결론적으로 수많은 동시 커넥션을 감당하기에는 아파치서버의 구조가 부적합하다.
이러한 구조적인 문제를 개선하기 위해 Nginx가 나오게된다 (아파치의 성능 개선을 위한 방법으로 출현한다.)

Nginx

특징과 장점

처음 Nginx는 아파치 서버의 앞단에 위치하여 아파치 서버가 감당하는 동시 커넥션을 유지할 수 있는 장치로 둔다.
이를 통해 아파치 서버의 부하를 크게 줄일 수 있었다.
Nginx는 그 자체로 웹 서버로 작동했으며, 정적파일에 대한 요청을 바로 스스로 처리하고 동적파일에 대한 요청을 받았을 때만 뒤의 서버와 커넥션을 만든다.
Nginx는 마스터 프로세스가 존재한다. 마스터 프로세스에서 설정파일을 읽고 그 설정에 맞게 워커 프로세스를 생성한다.
이 워커 프로세스가 실제 일을 하는 프로세스이고, 이 프로세스가 만들어질때 각자 지정된 listen 소켓을 배정받는다.
이 소켓을 통해 새로운 클라이언트로 요청이 들어오면 커넥션을 생성하고 그 요청을 처리한다.(keep alive만큼 유지)
커넥션이 형성되었다고 해서 해당 커넥션 하나만 한정적으로 담당하지 않는다.
형성된 커넥션에 요청이 없으면, 새로운 커넥션을 형성하거나 이미 만들어진 다른 커넥션으로부터의 요청을 처리한다.

Nginx에서는 커넥션 형성, 제거 그리고 새로운 요청의 처리를 이벤트라고 부른다.
이 이벤트들은 OS커널이 큐 형식으로 워커 프로세스에게 전달해준다.
이 각각의 이벤트는 큐에 담긴 상태로 워커 프로세스가 처리할 때까지 비동기 방식으로 대기한다.
이를 워커프로세스는 한개의 프로세스로 이벤트를 꺼내가며 처리한다.

이렇게 구성이 되면 워커프로세스가 쉬지 않고 일을 하게된다.
요청이 없을 때 프로세스를 방치하고 있는 아파치 서버보다 서버 자원을 훨씬 효율적으로 사용한다.

하지만,,
만약 이 요청 중에 시간이 오래 걸리는 작업이 있을 경우에?????
이러한 오래 걸리는 작업을 따로 수행하는 스레드 풀(Thread pool)을 만들어 둔다.
워커 프로세스는 특정 이벤트의 수행이 오래 걸릴것 같으면 이를 스레드 풀에 위임하고 다른 이벤트를 처리한다.

워커 프로세스는 보통 CPU의 코어 수 만큼 생성
이를 통해 코어가 담당하는 프로세스를 바꾸는 횟수를 줄일 수 있고, CPU의 부가 작업으로 인한 부하를 줄인다.
(CPU의 컨텍스트 스위칭 사용을 줄인다.)

=== Nginx가 채택한 evnt-driven model(이벤트 기반구조)이고 아파치 서버와 가장 큰 차이점이다.

  • 장점
    동시 커넥션 양 최소 10배 증가 (일반적으로 100~ 1000배 증가)
    동일한 커넥션 수 일때, 속도 2배 향상
    동적 설정 변경

단점

개발자가 기능 추가를 했다가 돌아가고 있는 워커 프로세스를 종료하게 되는 상황이 생길 수 있는데,
이럴 경우 해당 워커 프로세스가 관리하고 있던 커넥션과 요청을 더 이상 처리할 수 없게 되는 일이 발생한다.
그래서 개발자가 직접 모듈을 만들기가 까다롭다.

Nginx로의 전환

2008년쯤부터 아파치는 점유율을 잃고, Nginx의 점유율이 상승하기 시작
-> 스마트폰이 나오기 시작하면서 사람들이 인터넷을 더 많이 사용할 뿐만아니라 동시커넥션을 많이 생성하게 된다.
또한 웹의 컨텐츠 용량이 커지면서 브라우져가 리소스를 빨리 가져오기 위해서 여러개의 TCP 커넥션을 동시에 연결해서 keep alive상태를 유지했다.
이에 따라 Nginx의 특징이 장점으로 부각!

Nginx 활용 관련 Keyword

웹서버, 로드밸런서일 뿐만아니라 웹서버의 가속기 역할을 함
1. SSL 터미네이션

Nginx는 서버와 보통 같은 네트워크 안에서 있기 때문에 보안상의 위험이 적다
따라서 Nginx가 외부 통신에서 넘어온 요청을 복호화한 이후에 서버와 통신할때는 추가적인 암호화없이 http로만 통신한다.
서버의 부담을 줄여준다.

  1. 캐싱

    http를 사용하기 때문에 전달하는 컨텐츠를 캐싱할 수 있다.

  2. 이외의 역할 및 기능

  • HSTS(HTTP Strict Tansport Security)
  • CORS 처리
  • TCP/UDP 커넥션 부하 분산
  • HTTP/2
    ...

Reference : [10분 테코톡] 🤫 피케이의 Nginx

info : server 설정 템플릿 (https://github.com/h5bp)

profile
한걸음씩

0개의 댓글