공사중

쉽게 정리한 네트워크 | Apache와 Nginx의 요청 응답 구조 본문

개발 | 네트워크

쉽게 정리한 네트워크 | Apache와 Nginx의 요청 응답 구조

행운개발자 LuckyDeveloper 2020. 11. 1. 13:33

본 포스팅은 아래의 주제를 다룹니다.

  • How Apache Works?
  • How Nginx Works?

How Apache works?

Apache HTTP Server는 멀티 프로세스 + 멀티 스레드 방식을 사용합니다. 항상 여유로운 수의 프로세스/스레드를 생성해두기 때문에 요청이 들어왔을 때 프로세스/스레드가 생성되는 것을 기다리지 않아도 됩니다. 서버를 최초 실행할 때 몇 개의 프로세스를 생성할지 전달받습니다. 서버는 모든 프로세스에 속해있는 유휴 쓰레드의 수를 파악하고, 이 값이 사전에 설정한 범위 내에 있도록 프로세스를 fork하거나 kill합니다. 평소에는 요청 하나에 스레드 하나가 대응하는 구조입니다. 하나의 프로세스에서 관리할 수 있는 스레드의 수는 정해져있기 때문에, 사용자의 접속이 증가하면 프로세스를 fork합니다. 일단 여기까지만 보고도 멀티 프로세스 + 멀티 스레드 방식라고 이해할 수 있습니다.  

 

조금만 덧붙이자면 아파치는 여러 가지 다양한 기능과 다양한 확장 등으로 모든 종류의 웹앱 개발에 범용적으로 적용되는 것을 목표로 개발되었습니다. 가격이 비싼 것뿐만 아니라 범용적인 성격이기 때문에 fork를 할 때마다 CPU와 메모리 사용량이 많이 증가하는 문제가 있습니다. 

  • 사용자의 요청에 Process/Thread를 생성해서 대응

How Nginx works?

Nginx는 멀티 프로세스 + 싱글 스레드 방식을 사용합니다. low memory usage와 high concurrency를 위해asyn event-driven 방식을 사용해서 single thread에서 요청에 응답합니다. Nginx는 하나의 master process가 다수의 worker process를 관리합니다. master process는 workeer process를 관리하는 일만 수행하고, worker process에서 사용자의 응답에 대응하는 방식을 취합니다. (멀티 프로세스) 각각의 worker process에 대해서는 single thread 방식으로 동작합니다. 각각의 worker는 초당 수천개의 동시 접속과 요청을 처리할 수 있습니다.   

  • Master Process ( Worker Process 관리만 수행 )
  • Worker Process ( Single Thread로 구성. 사용자의 요청에 응답 )

Worker Process

nginx는 프로세스나 스레드에 대한 지속적인 생성/파괴 패턴이 없기 때문에 CPU 사이클을 절약합니다. nginx가 하는 일은 다음과 같습니다.

  • 네트워크와 스토리지의 상태 확인
  • 새로운 연결을 초기화
  • 런 루프에 추가
  • 완료될 때까지 비동기적으로 처리
  • 완료되면 연결이 할당 해제되고 런 루프에서 제거됨

연결 요청이 CPU 집약적인 경우( 많은 TCP/IP 처리, SSL 수행 또는 압축) worker process의 수는 CPU 코어의 수와 일치하는 것이 권장됩니다. 연결 요청이 disk I/O 집약적인 경우 worker process의 수는 CPU 코어의 수의 1~2배가 권장됩니다. 


참조