Nginx란
여름 방학동안 몰입 교육을 참여하면서 nginx를 사용해봤다 당시에는 front에 연결해서 사용했다고 했는데 나는 프런트 작업을 맏아 자세히 알지 못했다 그래서 Nginx에 대한 개념과 왜 사용하는지에 대해 적어보려고 한다
Nginx 출시 배경
APACHE서버가 1995년 출시 아파치의 작동 구조는 클라이언트에서 요청request가 들어 올때 process를 생성해서 하나의 connection를 생성한다 (unix계열의 os가 네트워크 커넥션을 생성하는 모델을 적용)
process를 만드는 시간이 오래 걸려 미리 프로세스를 만들어 놓는 PREFORK방식을 사용
만들어 놓은 프로세스가 모두 할당시 추가 프로세스 생성
확장성이 좋고 모듈을 사용해서 서버에 빠른 기능을 추가 -> 동적 컨텐츠 처리 가능 또한 요청을 받고 요청을 처리하느 과정을 하나의 서버에서 처리 -> 인기를 끌게 됨
1999년 컴퓨터의 많은 보급으로 인해 서버에 동시에 연결된 connection이 많아졌을 때 더 이상 connection을 연결하지 못하는 경우가 생김 C10K (connection 10000 problem) HW의 문제가 아니라 APACHE 서버 구조 문제
### APACHE 서버 구조 문제
수많은 connection을 위해 수많은 process 유지 -> 메모리 부족, 쉽게 모듈 추가 구조는 프로세스가 차지하는 리소스의 양을 늘림, cpu 부하가 매우 많아짐 context switch가 매우 자주 일어남 -> 서버 구조 부적합
Nginx 출시(2004)
Nginx 초기
초기 nginx는 아파치 서버를 보안하기 위해 나온것이라 nginx + apache 서버를 동시에 사용했다
아파치서버는 nginx만 연결하고 클라인언트를 nginx에 연결
어떻게 nignx는 여러 동시 connection을 유지 할까?
Nginx 구조(이벤트 기반 구조)
간단히 말해서 프로세스를 1:1로 연결하지 않고 한개의 프로세스에 여러개 연결을 함(더 이상 요청이 없다면 다음 connection을 통해서 요청을 추가로 받는다) -> 프로세스를 추가로 만들지 않아도 된다
마스터 프로세스가 워커 프로세서(실질적 처리자)를 생성한뒤에 클라인언트를 연결한다 connection이 되었다고 해서 하나의 connection만 담당하지 않고 추가적인 요청이 없다면 생성한 connection을 연결하거나 기존 connection을 통해 요청을 처리한다
이렇게 새로운 요청을 처리하는것을 이벤트라고 한다
그리고 이 이벤트들은 os커널이 큐형식으로 워커프로세서에 전달 프로세스는 큐형식으로 데이터를 처리한다
일이 없다면 방치되는 아파치 서버에 비해서 항상 일이 있다 -> 효율적 시간이 오래걸리는 작업일 시 따로 수행하는 thread pool에 위임해서 처리한다(뒤에 대기시간이 길어지지 않도록)
워커 프로세스는 cpu코어 수만큼 생성 한다 -> 코어가 담당하는 프로세스 수를 딱 맞게 만들어 context switch를 최대한 적게 일어나도록 한다 cpu 부하를 줄임
단점
개발자가 기능 추가를 위해 워커 프로세서 종료하게 된다면 해당 워커 프로세스가 처리하는 요청을 처리하기 어려움 -> 개발자가 모듈 수정하기 어려움
하지만 단점보다는 장점이 매우 큼
장점
- 동시 커넥션 양 최소 10배 증가
- 동인한 커넥션 수일 때 속도 향상
특징
- 동적 설정 변경 가능
- 개발자가 설정파일 변경 nginx에 적용하면 새로운 워커 프로세스가 생성되고 기존의 워커 프로세스가 더이상 커넥션을 설정하지 못하도록 한다 기존 워커프로세스가 모두 끝나면 기존 워커 프로세스 삭제
- 로드 밸런서
- 서버의 부하를 균등하게 주기위함
- 웹서버
- 정적파일을 대신 처리하므로 서버의 부담을 줄임
- SSL 터미네이션
- 클라이언트와 https통신 서버와 http통신을 한다 비지니스 로직 처리 부하 감소