Nginx vs Apache

문학적인유사성·2022년 2월 28일
0

태환님이 추천을 해주신 youtube 테크 영상 ( 10분 테코톡, 피케이의 Nginx )

Nginx ( 2002 ~ )

웹서버, 리버스 프록시, 로드밸런서, http캐시 ....
이벤트 기반 구조....
웹서버 분야에서 현재 가장 많이 쓰임

Apache

1995

유닉스기반 NCSA httpd (버그가 너무 많아!)

-> 구조 변경, 버그 수정 apache 탄생!! (http server project)

  • 아파치는 요청이 들어오면 커넥션 형성을 위해 프로세스를 생성.
    새로운 클라이언트 > 새로운 프로세스 (=unix 계열 os가 네트워크 커넥션 형성 모듈과 동일)
    -> 프로세스 만드는데 시간이 너무 오래걸려 ㅠㅠ 미리 만들어 두자, 다쓰면 다시 만들지 뭐~ --> Prefork방식 채용
  • 확장성 조.아 ( perl 모듈, php모듈, 다양한 유용한 모듈 ) --> 서버에 빠르게 기능을 추가 ---> 동적 컨텐츠 가능하게 끔 만들게 되었음
  • 응답을 처리하는 과정을 하나의 서버에서 해결하기 좋음 (확장성이 좋기때문)
    --> 아파치가 인기가 많은 이유 였음

1999 인터넷 트래픽의 증가

  • 서버 처리량이 당시 기술로 감당할 수 있었음.
  • 컴퓨터의 보급.
  • 서버에 동시에 연결된 커넥션이 많을 때 더이상 커넥션을 형성하지 못하는 문제가 생김

C10K ( Connection 10000 problem)

  • 동시에 연결된 커넥션 수 : 요청을 처리하기 위해서 서버가 한 시점에 얼마나 많은 클라이언트와 커넥션을 형성 중인 수
  • 초당 요청 처리 수 : 서버가 얼마나 빨리 요청 처리

--> 커넥션을 형성하는데 여러 절차가 필요함.
"그럼 재활용 하자!!!" --> keep alive 헤더

  • 하드웨어는 문제가 없음
  • 웹페이지 컨텐츠 용량에 컴퓨터 성능은 충분

커넥션 형성시 프로세스 할당 --> 메모리 부족
확장성 --> 무거운 프로그램
많은 커넥션 (컨텍스트 스위칭이 많아짐 ) --> CPU 부하 높음

2004 Nginx 이벤트 기반

  • 웹서버이지만 아파치 서버 대체 목적이 아닌 같이 사용하려고 나온 서버
  • 수많은 클라이언트 <--Keep-Alive--> Nginx(앞단) <----> Apache
  • 수많은 동시커넥션을 Nginx가 부하를 줄여줌
  • 정적 파일 요청을 Nginx가 처리
  • Apache의 리소스를 개발자 로직처리에만 힘쓰게끔 도와줌

어떻게 그 많은 프로세스를 유지하는가?

  • 마스터 프로세스 : 설정 파일을 읽고 워커 프로세스를 생성
  • 워커 프로세스 : 실제로 일을 하는 소켓
    -- 각자 지정된 listen 소켓을 배정 받음
    -- 새로운 커넥션의 요청이 들어오면 커넥션을 형성하고 그 요청을 처리 (Keep Alive 만큼 유지)
    -- 아무런 요청이 없으면 새로운 커넥션을 형성, 이미 만들어진 다른 커넥션으로 부터 요청을 처리
    -- Event(커넥션 형성, 커넥션 제어, 새로운 처리)
    -- OS커널이 이벤트를 큐형식으로 워커 프로세스에게 전달!!! (비동기 방식으로 대기, 워커프로세스는 하나의 스레드로 처리)
    -> 계속 일을 할수있음
  • 따로 수행하기 위한 스레드 풀
    -- Disk IO 이벤트가 들어있다면 오래 걸리는데..?
    -- 시간이 오래 걸리는 애들을 처리하기 위해서 만들어둠
  • CPU 코어 개수만큼 워커 프로세스를 생성
    -- 코어가 담당하는 프로세스를 바꾸는 횟수를 줄일수있음
    -- CPU의 컨텍스스위칭을 줄일수있음
  • 개발자 기능추가시 워커프로세스 종료되버림
    -- 커넥션이 날아감

장점

동시 커넥션 양 최소 10배 증가(일반적으로 100배 ~ 1000배 증가)
동일한 커넥션 수일때 속도 2배
동적 설정 변경(개발자가 설정파일 변경)

  • 마스터 프로세스가 새로운 워커 프로세스를 생성하고 기존의 있던 프로세스 요청의 커넥션을 점차 줄인다.
    --> 로드 밸런서의 역할을 가능 ( 동적으로 설정을 변경할수있음 )
  • 동시 커넥션을 유지한채, 기존 요청을 계속해서 처리하면서 뒷단에 서버 추가 wow!!!
  • 동적 설정을 초당 몇십번 바꿔도 ok

2008 스마트폰의 등장

  • 동시커넥션의 많은 생성

  • 다양한 정보 실시간

  • 브라우저도 리소스를 빠르게 가져오기위해서 여러 TCP 커넥션을 동시에 형성 (Keep Alive로 유지)
    Ngnix으로 가즈아ㅏㅏ

  • APache MPMs(Multi processing Module)

  • 안전성 : Prefork

  • 성능향상 : Wrokers thread

2021 Nginx를 어떻게 쓸까?

  • 웹서버의 기능
  • 로드 밸런서의 기능
  • 웹 서버 가속기
    -- SSL 터미네이션 (복호화X, 비지니스 부하 낮춤)
    --- client <-https-> Ngnix <-http-> Server
  • http 프로트콜이용하여 캐싱 가능
    --- 클라이언트쪽에 가깝게 배치하여, 한번 서버로 받은 응답을 다시 리턴
  • HSTS(HTTP Strict Transport Security)
  • CORS
  • TCP/UDP 커넥션 부하분산
  • HTTP/2

결론 (장단점따져서 쓰자)

  • 동시커넥션에서는 아직 Ngnix가 훨씬 월등함
  • 여러 OS에서 아파치가 호환이 훨씬 좋음(윈도우에서 nginx 성능 안좋음)
  • 모듈로 기능 계속 추가시 APache가 너무 좋음

https://github.com/h5bp/server-configs-nginx

profile
Are you nervous? Don't be

0개의 댓글