태환님이 추천을 해주신 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 스마트폰의 등장
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