Web

Nginx 와 Apache

JUNGKEUNG 2021. 11. 13. 21:05

Apache


  • Apache 나오기전 유닉스 기반으로 만들어진 웹 서버 NCSA HTTPD을 사용했다. 하지만 버그가 너무 많아서 개발자들이 사용하기에는 불편했고 이를 해결하기 위하여 몇몇 개발자들이 나서서 만든것이 Apache이다.
  • Client에서 요청을 받으면 MPM (Multi Processing Module: 다중처리모듈)이라는 방식으로 처리를 하는데 대표적으로는 Prefork Worker 방식이 있다.

 

 

 

MPM 방식 처리( Multi Processing Module : 다중처리모듈)


Prefork MPM (다중 프로세스)

출처 : https://taetaetae.github.io/2018/06/27/apache-vs-nginx

1. 하나의 자식 프로세스가 하나나의 스레드를 갖는 구조로, 자식 프로세스는 최대 1024개까지 가능하다

2. 스레드간 메모리  공유를 하지 않는다 ( 독립적이지만 메모리를 많이 사용)

3. 실행 중인 프로세스를 복제하여 실행한다 (메모리 영역까지 복제)

4. 응답 프로세스를미리 띄어놓고 클라이언트 요청 시 자식 프로세스가 반응하게 되는 방식

5. 디버깅이 빈약한 플랫폼에서 쉬운 디버깅이 가능하다

6.일반적으로 Sing CPU 또는 Dual CPU에서 성능이 더 좋다

 

 

Worker MPM (멀티 프로세스 - 스레드)

출처 : https://taetaetae.github.io/2018/06/27/apache-vs-nginx

1. Prefork보다 메모리 사용량이 적고 통신량이 많거나 동시 접속자가 많은 사이트에 적합하다

2. 프로세스당 스레드가 최대 64개의 스레드 처리가 가능하고 각 스레드는 한 번에 한 연결을 담당한다

3. 스레드 간에 메모리를 공유한다

4. Worker 방식은 일반적으로 Multi CPU 시스템에서 성능이 좋다

Prefork worker
안전하지 않는 제 3자가 만든 모듈을 사용할 수 있다 통신량이 많은 서버에서 적절한 형태를 가진다
디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다 prefork에 비해 적은 메모리를 사용한다
prefork와 woker의 속도는 비슷하다

 

 

 

Apache의 한계


클라이언트 접속마다 Process 혹은 Thread를 생성하는 구조이다. 1만 클라이언트로 부터 동시접속 요청이 들어온다면 CPU와 메모리 사용이 증가하고 추가적인 Process/Tread 생성비용이 드는 등 대용량 요청에서 한계를 보일것이다.
또한, Apache 서버의 프로세스가 blocking 될 때 요청을 처리하지 못하고 처리가 완료될 때까지 대기상태에 있는데 이를 Keep Alive(접속대기)로 해결이 가능하지만, 효율이 떨어진다.

Keep Alive이란?

한 번 통신이 이루어지면 접속이 끊어 버리지 않고 KeepAliveTimeOut 시간 동안 끊지 않고 다음 접속 대기하는 것이다.

 

 

 

Apache의 장점과 단점


  • Apache의 장점
    • 개발하기 쉽다
    • 다양한 모듈을 만들어서 서버에 빠르게 기능을 추가할수 있다
    • Apache Server는 동적 컨텐츠를 처리할수 있게 되었다
    • 확장성이 좋다는 장점 덕분에 요청을 받고 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋았다.
  • Apache의 단점
    • 메모리 부족 ( 새로운 Proess을 게속해서생성하다보니 메모리가 부족해진다)
    • 무거운 프로그램 (여러가지 기능을 추가할 수 있는 장점이 프로그램을 무겁게 만들었다)
    • CPU 부하 up!!(많은 커넥션이 들어오면 CPU는 게속해서 Proess을 바꿔야 했다)
    • C10K (서버에 동시에 연결된 커넥션이 많아졌을때 커넥션이 생성되지 않는 문제가 발생하는 것을            C10K (Coneection 10000 Problem) 커넥션 만개의 문제라는 의미을 가지고있다.
    • 수많은 커넥션을 처리하는데 아파치는 부적합 하다

 

 

 

NginX


Nginx는 Apache의 보완하고자 나왔고 Apache앞에 Nginx를 두어 동시에 커넥션을 관리 하지 못하는 Apache 대신 Nginx가 관리해서 Apache한테 전달 하는 방식이다.

출처 : https://www.youtube.com/watch?v=6FAwAXXj5N0

Apache는 동시에 Connection이 들어오면 Proess관리가 제대로 안되는 단점이 있다고 위에서 설명을 했다.

그럼 Nginx는 어떻게 관리를 할수 있는것일까?? 바로 NginX에 있는 Woker Proess에 있다

  • Nginx는 Event-Driven 방식으로 동작한다. 즉, 프로그램 흐름이 이벤트에 의해 결정이 된다
  • 한 개 또는 고정된 프로세스만 생성하고, 그 내부에서 비동기로 효율적인 방식으로 task를 처리한다.
  • Apache와 달리 동시접속자 수가 많아져도 추가적인 생성비용이 들지 않는다.
  • 비동기 이벤트 기반으로 요청하여 적은 양의 스레드가 사용되기 때문에 CPU소모가 적다
  • Apache와 달리 CPU와 관계없이 I/O들을 전부 Evnet Listener로 미루기 때문에 흐름이 끊이지 않는다
  • Context Switching 비용이 적다
    • Context: 스레드가 작업을 진행하는 동안 작업정보를 보관 O/S는 A작업을 진행할 때 A스레드의 Context를 읽어오며, B스레드로 전환 할 때 A스레드의 Context를 저장하고 B스레드의 Context를 읽어오는 일련의 반복작업이다.
    • 즉, 스레드가 갯수가 많아질 수록 Context Switching 작업은 더 빈번하게 일어나고 이 때문에 성능이 저하될 수 있다. 

 

 

 

Nginx Woker Proess


Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행된다. Master Process는 설정 파일을 읽고, 유효성을 검사를 하며 Worker Process를 관리를 한다. 모든 요청은 Worker Process에서 처리한다. Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용한다. Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정을한다.

출처 : https://icarus8050.tistory.com/57

 

 

 

Nginx의 장점과 단점


  • Nginx 장점
    • 수많은 커넥션을 처리할 수 있고 가볍다
    • 동적 설정 변경이 가능하다
  • Nginx 단점
    • 개발자가 기능을 추가할 시 잘못 추가하거나 삭제하면 WokerProess가 멈추는 현상이 자주 발생한다

 

 

 

Apache와 NginX 비교


출처 : https://cntechsystems.tistory.com/24

 

 

 

결론


Apache가 좋은지 NginX가 좋은지는 결론을 내릴 수가 없다. 정적 컨텐츠가 많은 트래픽이 많은 웹 사이트를 실행하는 경우 NginX가 현명한 옵션이 될수가 있다. 또는 지원 커뮤니티와 커뮤니터가 제공하는 풍부한 자원ㅇ르 소중히 생각하는 경우 Apache가 편리할수도 있다. 

 

 

 

참고 자료


https://velog.io/@ksso730/Nginx-Apache-%EB%B9%84%EA%B5%90

https://www.youtube.com/watch?v=6FAwAXXj5N0 

https://cntechsystems.tistory.com/24

https://icarus8050.tistory.com/57

'Web' 카테고리의 다른 글

CORS란?  (0) 2022.09.25
인코딩 디코딩  (0) 2021.11.09
DB Connection Pool  (0) 2021.11.05
아스키코드 vs 유니코드  (0) 2021.11.03
XML & JSON & YAML  (0) 2021.10.30