CS

Nginx와 Apache의 차이?

wwns 2023. 3. 20. 21:02
반응형

실습 나온 사내에서 Nginx를 사용하지 않고 Apache2에 서버를 그냥 올리고 사용하고 있었다.

나도 사실 Nginx를 왜 사용해야 하며 무슨 차이가 있는지 잘 몰랐지만, Nginx를 위에 얹어서 트래픽을 관리하는 로드밸런서의 역할로 사용하는 것이 조금 상용화? 되어있기에 무작정 Nginx를 적용하는 게 더 좋은 거다라고만 생각하고 있었다.

왜 Nginx 안쓰시나요 물어봤다가 역질문을 받아 C10K의 문제를 해결하기 위해 나왔다 정도만 알고 있지 정확한 작동원리에 대해 설명을 하지 못했기에.. 미팅 때 정리해서 알려달라고 하셨고 열심히 알아보았고 미팅 때 잘 설명드렸더니 재미있다고 하셨다.!

 

시간이 될 때 블로그로도 남겨야겠다싶었는데 미루다가 2개월이 지나고서야 글을 쓴다.

최근에 MS Azure로 교육 받으러 다녀온 일이 있었는데 더 확실한 질문을 통해 개념을 잡을 수 있었던 터라 늦게 쓰는 게 좋은 걸지도 모르겠다.

 

참고로 우아한테크코스 피케이의 테코톡을 참고해서 정리했다.! 아주 유명한 강의이니 관심이 있는 사람은 한 번쯤은 보았을 것이다!


2023년 1월 기준 웹 사용 비율 조사

https://w3techs.com

웹 사용 비율을 조사한 사이트가 있어서 참고해 왔다. 1, 2위를 근소한 차이로 다투고 있는 게 Nginx와 Apache이다. 둘은 어떤 차이를 가지고 있고 어떤 상황에서 사용을 하는지 알아보고자 한다.


Nginx란 무엇인가?

Nginx란 리버스 프록시, 로드밸런스, http/https 제어, 캐시 등의 기능을 제공하는 웹 서버이다.

Apache와 다르게 이벤트 기반 구조(Event Driven Model)로 출시되었으며 위와 같이 아파치와 1, 2위를 다투는 웹 서버이다.

Nginx가 나오게 된 배경과 아파치 서버와 또 어떤 차이점을 가지고 있는지 알아보면서 두 웹 서버에 대해 알아본다.


Apache 웹 서버 - (Apache Http Server)

client - server 사이 request 시 connection 생성

최초의 아파치 서버는 클라이언트의 요청이 들어오면 커넥션을 형성하기 위해 매번 새로운 프로세스를 생성했다.

  • 아파치 서버는 클라이언트의 요청이 들어오면 커넥션을 형성
  • 프로세스를 생성하는 오버헤드가 워낙 크기 때문에 요청이 들어오기 전 미리 프로세스를 생성해두는 pre-fork 방식을 채택하여 사용.
  • 프로세스가 커넥션을 형성하며 이 커넥션은 Keep-AliveKeep-Alive시간 동안 유지됨
  • 커넥션을 형성하는데는 리소스가 많이 소비되는 편이기에 일정 시간 동안 keep-alivekeep-alive를 유지하려고 함

keep-alive 유지

하지만

아파치 서버의 이런 구조가 추가적인 개발이 쉽고 뛰어난 확장성을 갖춘다는 장점이 있었다.

필요한 기능들을 모두 모듈로 만들어 탑재할 수 있었고, 다양하고 많은 모듈이 만들어져 빠르게 탑재(개발이 빠르고 편함)

이 덕분에 아파치 서버가 동적 콘텐츠를 핸들링할 수도 있었음. (WAS의 역할까지 가능, Apache Tomcat이 나온 것도?)

 

따라서, 아파치 서버 하나만으로도 클라이언트의 요청을 받고, 응답을 만들어 처리하는 모든 과정을 소화할 수 있었다.


C10K 문제의 발생 (1만 커넥션 문제)

 

  • Connection이 1만 개가 쌓이면 리소스가 부족하여 새로운 Connection이 불가능하다

점차 컴퓨터가 보급되고 상용화되면서 클라이언트가 많아지니 서버에 동시에 몰리는 커넥션이 많아졌고 이때 서버가 터지면서 문제가 발생했고 이를 C10K 문제라고 불렀다. 

 

위에서 봤듯이 각 클라이언트마다 매번 커넥션을 만드는 게 비효율적이니 (프로세스를 새로 할당하면 오버헤드도 엄청나고) Keep-Alives 헤더를 사용해 지정한 시간 동안 커넥션을 유지하도록 설계하였다.

그렇기 때문에 동시에 연결된 커넥션 수가 쌓여가다 보니 리소스가 부족해 서버에서 더 이상 커넥션을 형성하지 못하게 된 것

 

아파치 서버의 구조 상 많은 커넥션을 동시에 유지하고 감당하기에 좋은 구조가 아니었다.

이를 보완하기 위해 나타난 것이 Nginx이다.


Nginx의 탄생

초창기 Nginx는 아파치 서버와 함께 사용하기 위한 용도로 탄생했다. 웹 서버이긴 했지만 아파치 서버를 완전히 대체할 목적이 아니었다. 대게 아파치 서버 앞단에 Nginx를 두는 것으로 동시 커넥션의 부하를 분산시켰다.

웹 서버를 잘 모르는 사람들은 Nginx와 Apache서버 둘 중 하나를 선택해서 사용한다고 생각하고 1, 2위를 다투는 서버라 둘 다 비슷한 거 아니냐고 생각하는 사람들이 있을 수 있다. 그런 사람들이 이 글과 테코톡을 보고 박수를 치며 깨달았으면 좋겠다. (나는 둘을 같이 사용하는 것을 알고 있었지만 테코톡을 보고 박수가 절로 나왔다..)

 

그렇다면

어떻게 앞단에 두고 활용하는 지를 알기 전에 Nginx의 특징을 정리해 본다.

  • 이벤트 기반 비동기 처리 방식
    • 프로세스가 이벤트에 반응하며 커넥션을 새로 만들지 않음
  • worker라는 프로세스를 생성해 이벤트들을 큐에 담아 처리하는 방식으로 적은 프로세스를 사용
    • 적은 프로세스로 인해 관리하는 CPU 부하 감소
  • 오래 걸리는 작업에 대해선 스레드 풀을 이용하여 스레드 풀의 스레드를 사용하도록 함
    • worker 프로세스에 이벤트가 쌓이지 않도록 함

특징만 봐도 지금까지 나왔던 문제점들을 보완하기 위해 나타났다는 게 느껴지길 바란다.

 

추가로 참고하면 이해를 도울 수 있는 일반적인 서버 인프라 구축 설계를 첨부한다.!  서버를 고민하면 보통 이 틀을 처음에 생각하고, 클라우드에 올리면 Nginx를 (AWS의 경우) LB(L4)와 API GateWay(L7)를 사용해 부하 분산을 한다.

https://opencourse.tistory.com/155

App Servers가 Apache 서버들이 되고, 요청수가 많아짐에 따라 서버를 증대하는 구조다.

나는 초기 서버 설계를 하면 딱 위의 구조로 생각을 하는 것 같고, 점점 기술 스택들을 늘려가는 방식으로 사고하는 것 같다. (Docker관리, Build, 로드밸런싱, k8s ...)

 

다시 돌아와서 Nginx는 Apache와 함께 웹 서버로 사용해도 되지만, Nginx 자체로도 웹 서버의 역할을 수행할 수 있어서, 정적 콘텐츠를 Nginx가 반환하고 아파치 서버는 개발자가 원하는 비즈니스 로직만 처리(WAS)하게 구성할 수 있었다.


Nginx의 특징

위에서 정리한 Nginx 특징에 대해 자세히 알아본다.

  • 이벤트 기반 비동기 처리 방식

  • master process가 nginx 설정에 따라 worker process를 생성하고 worker process가 커넥션을 유지
    • 커넥션에 아무런 요청이 없으면 이벤트에 따라 새로운 커넥션을 형성하거나 이미 만들어진 커넥션으로부터 요청을 받아 처리
    • 이벤트 큐에 담긴 이벤트를 처리하는데, 이 이벤트들은 비동기 방식으로 대기
    • 프로세스가 아무 일 안 하고 노는 일 없이 계속 일을 한다는 장점

 

  • 적은 worker process 사용을 통한 CPU 부하 감소

  • 보통 CPU의 코어 수만큼의 worker process를 생성한다
    • 이는 CPU가 관리하는 프로세스가 바뀔 때 발생하는 콘텍스트 스위칭 횟수를 획기적으로 줄여 부하 감소
  • 한 worker process에서 여러 connection을 처리하기 때문에 프로세스 생성에 대한 리소스 비용 감소
    • 동시 커넥션이 최소 10배 증가(일반적으로 100~1000배)증가

 

  • 오래 걸리는 작업에 대해선 스레드 풀을 이용하여 스레드 풀의 스레드를 사용하도록 함

  • Disk I/O와 같은 작업은 해당 작업만 처리하는 역할을 하는 스레드를 미리 만들어 스레드 풀에 넣어놓고 처리를 위임
  • 대부분의 요청은 0.1초면 처리 가능한데 Disk I/O와 같이 오래 걸리는 작업이 들어오면 이벤트가 대기하는 시간이 길어짐

Nginx와 Apache 성능 비교

dreamhost.com

  • 메모리 사용량: 동시 커넥션수가 증가하면 Apache 서버는 메모리가 크게 증가
  • 초당 처리량: Nginx는 Apache에 비해 초당 처리량이 훨씬 높음

정리

  • Apache의 장점
    • OS 호환성 및 모듈 추가에 대한 확장성에 용이
    • Nginx의 경우 Window를 완벽하게 지원하지 못하고 있다고 함
    • 동적 모듈을 지원 – 서버 구성이 자유로움
    • Nginx의 경우 모듈을 커스텀하기엔 문제가 발생하기 쉬워 모듈 개발은 까다롭다고 함
  • Nginx의 장점
    • 비동기 이벤트 기반 처리 -> 하나의 프로세스를 활용
    • 적은 프로세스 사용으로 CPU 부하 감소 -> 컨텍스트  스위칭, 프로세스 할당 리소스 감소
    • 스레드 풀을 활용한 이벤트 blocking 방지

결론: 같이 써서 Nginx로 부하를 분산하고 Apahce로 개발친화적인 로직을 개발해 나가자!


참고

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

https://hyeon9mak.github.io/nginx-vs-apache/

 

Nginx vs Apache

우아한테크코스 피케이의 테코톡을 참고해서 정리한 내용이다!

hyeon9mak.github.io

 

반응형