우테코 팀 프로젝트에서 Nginx를 도입했다! Nginx가 웹서버로 좋다고 하는데 왜 그런지 Apache와 비교하며 좀 더 자세히 알아보자.
❓Web Server는 어떤 역할을 하나요?
-
Web Server : 정적 데이터 처리 ↔ WAS : 동적 데이터 처리
-
우리 프로젝트에서는 Reverse Proxy 역할을 한다.
-
Proxy : 대신하다
-
Proxy Server : 클라이언트와 서버간의 중계 서버
- 캐시, 보안 (SSL https 적용한 것), 트래픽 분산 (로드 밸런싱) 기능
-
Forward Proxy VS Reverse Proxy
Forward Proxy와 Reverse Proxy 구분 기준은 위치!
Client - Foward Proxy - Internet - Server
Client - Internet - Reverse Proxy - Server
-
Reverse Proxy
-
Forward Proxy
- 쉽게 말해 Client 단에 붙어있다고 생각하면 된다.
- 서버 개발자는 관여하지 않는 위치이다.
- (예) 클라이언트 (노트북)에서 설정할 수도 있다.
- (예) Internet Service Provider에서 Forward Proxy 역할을 하기도 한다. (쉽게 말해 Wifi를 제공해주는 LG u+에서 캐싱을 해줄 수 있다는 의미이다.)
제이미 테코톡
-
💡 Web Server ≠ Reverse Proxy
- 우리 프로젝트에서 Web Server는 Reverse Proxy 역할을 하는 것!
- Reverse Proxy 역할을 하지 않는 Web Server도 있다.
- (일반적인 경우는 아니지만) WAS에서 Reverse Proxy 역할을 수행 할 수도 있다.
❓Reverse Proxy를 도입했을 때의 이점이 있나요?
- 기본적으로 Reverse Proxy 위치에서 도입할 수 있는 기술들이 곧 이점
- Client에게 실제 서버 ip를 숨길 수 있다.
- 보안적으로 안전
- Client는 Reverse Proxy가 실제 Server라고 생각하고 접속하게 된다.
- 우리 프로젝트에서 적용한 Reverse Proxy에서의 기능
- 보안 (SSL, 실제 서버의 ip 숨기기 - redirect)
- 캐싱 (to do)
Apache
요청마다 Thread or Process 생성
전략에 따라 Thread or Process 다르다.
MPM (Multi Process Module - Apache에서 요청하는 처리 전략)
- prefork
- 자식 프로세스 - Single Thread
- 하나의 요청이 하나의 프로세스를 차지한다.
- 그 프로세스 안에는 하나의 Thread가 있다.
- 여분의 Child Process를 미리 만들어서(prefork) 요청이 들어올 때 새로 만들지 않게 동작한다.
- 높은 성능이 필요할 때 사용 (PHP)
- 하나의 프로세스가 정지해도 다른 프로세스에게 영향을 주지 않는다.
- worker
- 자식 프로세스 - Multi Thread
- 하나의 요청이 하나의 Thread를 차지한다.
- prefork에 비해 경량화된 것
- 자원을 상대적으로 적게 사용한다. (Thread가 자식 프로세스의 자원을 공유하기 때문)
- event
- Nginx와 유사한 Event Driven 전략
- 나중에 추가된 전략
Apache의 한계
많은 요청을 처리하기 힘들다.
- 요청마다 Thread or Process를 처리해야 하는데 자원은 한정적이다.
- 메모리 ⬆️ (Thread or Process 가 차지하는 메모리)
- CPU 사용량 ⬆️
- 요청이 많아지면 성능이 저하된다. (속도가 느려진다.)
Nginx
Event Driven + 비동기 처리
요청 → Request Queue에 저장 (Event Loop) → 처리 (비동기)
Event Driven 구조
이벤트에 대한 반응으로 동작하는 구조 ↔ Apache
- Event 생성자
- Event 채널
- Event 소비자
Event 생성자 ↔ Event 소비자 : 느슨한 결합 (서로 알 필요가 없다.)
(Nginx에서도 Event를 만드는 쪽과 실제 로직이 동작하는 쪽은 서로 알 필요가 없음)
Master Worker 구조
Nginx에 사용되는 프로세스에는 3가지 종류가 있다.
- Master Process
- config 파일을 읽고 worker process를 생성/관리
- Worker Process
- Helper Process
- Cache Loader : 최초로 캐시를 로딩해줌
- Cache Maanger : 주기적으로 캐시를 관리해줌
Nginx의 특징
- 적은 양의 자원으로 많은 양의 트래픽을 처리할 수 있다.
- 요청에 따라 추가적으로 자원을 사용하지 않기 때문에 많은 요청이 들어왔을 때 느려지지 않는다. ↔ Apache
- 하지만 너무 많은 요청을 받으면 처리하지 못하는 것은 Apache와 마찬가지이다.
- 비동기로 Context Switching이 적다.
❓Apache, Nginx를 각각 언제 사용할까?
Apache
- process base
- 매우 복잡한 CGI 처리, 동영상 데이터 전송, DB 처리 실행
- 우리가 현재 알고 있는 Web Server는 정적 데이터 처리를 담당하고 있다.
- 하지만 옛날에는 WAS 없이 Web Server에서 동적인 데이터를 처리한 적이 있다.
- 요게 CGI 기술
- JAVA Servlet이 활성화되지 않는 때
- 즉 현대에 많이 사용하는 Web Server가 아니라 과거에 Web Server에서 복잡한 작업을 처리할 때 유리하게 만든 서버임!
Nginx
좋은 글 감사합니다! 정리가 잘 되어있어 이해가 쏙쏙 잘되네요 👍