-
nginx (1) 특징 공부하기Web/Backend 2020. 10. 1. 02:50
nginx - 뜨고있는 apache와 같은 웹 서버 프로그램
" 더 적은자원으로 더 빠른 서비스 "
- apache 보다 동작이 단순하고 동시접속처리에 특화되어있다.
- 2018년 5월 기준, nginx는 23%, Apache는 25% Apache는 하락세이고 nginx 상승세라고 한다.
역할
1. 정적파일을 처리하는 HTTP 서버로서의 역할
2. Reverse proxy server로서의 역할
"로드밸런싱과 보안"
클라이언트의 요청을 각 Application server에 배분해준다.
클라이언트에서는 80포트로만 요청이 들어오는데, 이 들어오는 요청을 8080, 8081 등 여러 Application server로 보내준다.
일반적으로 리버스 프록시는 각 application server에 요청을 배분해서 부하를 분산하고 (load balancing) 캐시 서버로서의 역할을 하지만 WAS에 리버스 프록시를 두는 이유는 주로 요청에 대한 버퍼링이다.
단일 프로세스가 처리할 수 있는 요청수를 제한하는 서버에서는 통신 속도가 느린 클라이언트(A)가 있으면 nginx가 없는 경우 A 때문에 1개의 프로세스가 응답 대기 상태가 된다. 리버스 프록시는 응답을 버퍼링 해 Server가 각 클라이언트와 통신을 신경쓰지 않고 지연 없이 처리할 수 있게 한다.
- NGINX Use Case 1 외부에서 들어오는 Request들에 대해서 Gateway의 역할을 해준다. 외부와의 통신은 https로 서버 내부에서는 http로 통신 하는 등 SSL적용도 가능하다.
- NGINX Use Case 2 API Gateway의 역할로 각각 path에 맞는 서버로 Redirection 시켜준다. MSA 구조에서 쓰이는 형태이다.
- NGINX Use Case 3 Reverse Proxy로 작동을 해 각 서버에 Load Balancing을 해주는 역할을 한다.
(nginx.conf 파일에서 location 지시어를 사용하여 요청을 배분한다.)
3. Mail proxy server
4. Generic TCP/UDP proxy server
잠깐 Proxy에 대하여
프록시란?
프록시(Proxy)란 '대리'라는 의미를 갖고 있으며, 서버와 서버사이의 중계기역할을 한다.
보안상의 이유로 직접 통신할 수 없는 두 점사이에서 대리로 통신을 수행하는 기능을 가리켜 '프록시'라고 하며, 프록시서버로 부른다.1. 순방향 Proxy (Forward Proxy)
기업 내부망 PC or 서버들이 인터넷에 접속할 때, 먼저 Proxy 서버를 거쳐서 인터넷에 연결되는 방식이다. 순방향 Prxoy로 크게 두 가지 장점을 얻을 수 있다.
- 보안 : Proxy Server에서 In/Out bound 패킷에 대한 보안 정책(Content filtering 등)을 적용할 수 있다.
- 성능 : Proxy Server는 내부에 Cache를 유지하며 이미 한번 통신한 외부 서버의 이미지, 파일, 그 외정보들을 저장할 수 있다. 내부 사용자가 원격 서버에 접속 시, cache에 데이터가 있으면 물리적으로 먼 곳까지 갈 필요없이 Proxy 서버가 데이터를 제공하여 빠른 통신을 지원한다.
순방향 Proxy 구조 2.역방향 Proxy (Reverse Proxy)
외부에서 내부 서버가 제공하는 서비스 접근 시, Proxy 서버를 먼저 거쳐서 내부 서버로 들어오는 방식이다. Reverse Proxy 사용으로 얻는 장점은 크게 아래와 같다.
- 보안 : 외부 사용자는 실제 내부망에 있는 서버의 존재를 모른다. 모든 접속은 Reverse Proxy 서버에게 들어오며, Reverse Proxy는 요청에 맵핑되는 내부 서버의 정보를 알고 요청을 넘겨준다. 따라서 내부 서버의 정보를 외부로부터 숨길 수 있다.
- 로드밸런싱 : Proxy 서버가 내부 서버의 정보를 알고 있으므로 로드밸런싱을 통해 부하 여부에 따라 요청을 분배 할 수 있다.
Reverse Proxy 구조 <출처> medium.com/sjk5766/nginx-reverse-proxy-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-e11e18fcf843
Apache 와 nginx의 동작방식 비교
-Apache
하나의 클라이언트 = 하나의 쓰레드/프로세스
요청마다 새로운 프로세스 또는 쓰레드를 생성하여 처리.
MPM(Multi Processing Module : 다중처리모듈) 방식 , Prefork와 Work방식이 있음
요청마다 쓰레드가 생성되므로 접속하는 사용자가 많으면 그만큼 쓰레드가 생성되어 CPU와 메모리 자원의 소모가 큼.
스레드/프로세스 기반 구조
스레드/프로세스 기반 구조
- ServerSocket으로 request A가 들어오면 Thread를 할당해 준다.
- Thread는 그 socket을 가지고 read, write 작업(I/O) 등을 수행한다.
- 이 와중에 ServerSocket으로 request B가 들어오면, context switching이 일어난다.
- 새로 들어온 request에 Thread를 배분하고, 또 이 socket을 가지고 read, write 작업을 수행한다.
- 그러면서 A의 작업을 하기 위해 중간에 다시 context switching 하고, 그러다 다시 B 작업하려고 context switching을 하며 I/O
Prefork MPM
prefork
실행중인 프로세스를 복제하여 처리하는 방식이다.
각 프로세스는 한번에 한 연결만 처리하고, 요청량이 많아질수록 프로세스를 복제하여 동작한다.
프로세스를 복제하는 방식이기 때문에 메모리가 왕창 소비된다.
connection 수 = 프로세스 수 라고 보면 된다.Worker MPM
worker
Prefork 방식은 한개의 프로세스가 한개의 스레드로 처리되지만, Worker방식은 한개의 프로세스가 여러 쓰레드를 사용하여 요청을 처리한다.
쓰레드를 사용하기 때문에 Prefork 방식보다 메모리 소모가 적고, 통신량이 많을 때 유리하다.문제점
- Apache는 접속마다 Process 또는 Thread를 생성하는 구조이다.
동시 접속 요청이 10,000개라면 그 만큼 Process or Thread 생성비용이 들 것이고 대용량 요청을 처리할 수 있는 웹서버로서의 한계를 드러내게 된다.Nginx
"단일쓰레드 비동기 처리"
Nginx 는 Event-Driven 방식으로 동작한다.
한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비동기 방식으로 효율적으로 작업을 처리한다. 따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.(context switching 비용도 적고 cpu 소모도 낮음)
여러개의 커넥션을 몽땅 다 Event Handler를 통해 비동기 방식으로 처리해 먼저 처리되는 것부터 로직이 진행되게끔 한다.
더 자세히 알아보자면, Event-Driven 방식은 작업을 하다 I/O, socket read/write 등 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행한다. 즉, CPU 와 관계없는 I/O 들을 전부 Event Listener로 미룬다. 그러다 진행중인 I/O 등의 작업들이 끝나면 이벤트가 발생하여 그 다음 작업을 처리하게 된다.
CPU Bound : CPU 자원을 사용하는 일들을 처리하는 일들
I/O Bound : Disk, Network, DataBase와 관련된 일들Event-Driven 방식 (비동기 처리 방식)
병렬처리 동작방식 Nginx는 event-driven 즉, 이벤트 구동방식으로 클라이언트 요청 병렬처리를 진행한다. 이는 입출력 이벤트를 감지해 처리가 필요할때 시그널을 통해 처리한다.
기본적으로 싱글 프로세스 기반으로 이벤트를 받는 reactor와 이벤트를 실제 처리를 위한 worker로 전달하기위한 handler등으로 구성되어 처리단위로 동작하게된다.event-driven
- Reactor는 event가 들어오면 알맞는 handler로 dispatch를 해준다.
- Handler는 이 dispatch된 event를 받아서 처리하는 역할을 수행
Event-Driven 방식은 Reactor pattern을 사용한다고 한다.
Reactor pattern이란 이벤트 처리(event handling)디자인 패턴으로, 하나의 Reactor가 계속 이벤트를 찾고 이벤트가 발생(trigger)하면 해당 이벤트 처리기(event handler)에게 이를 알린다.즉,
Reactor : Reacator는 별도의 스레드에서 실행되며 발생한 I/O 이벤트는 dispatching되어 해당 이벤트 처리기로 보내 처리한다.
Handlers : Reactor로부터 I/O 이벤트를 받아 실제 작업을 수행한다.( 정리하자면 I/O와 관련된 작업들은 callback 함수 방식으로 처리한다는 건가 )
동기(Synchronous) : A가 B에게 데이터를 요청했을 때, 이 요청에 따른 응답을 주어야만 A가 다시 작업 처리가 가능 (하나의 요청, 하나의 작업에 충실)
비동기(Asynchronous) : A의 요청을 B가 즉시 주지 않아도, A의 유휴시간으로 또 다른 작업 처리가 가능한 방식
nginx 구조
Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행됩니다. Master Process는 설정 파일을 읽고, 유효성을 검사합니다. 그리고 Worker Process를 관리합니다. 모든 요청은 Worker Process에서 처리합니다. Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용합니다. Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정됩니다.
--- 설치해보고 환경설정 및 테스트 해보기 ---
참고
Nginx 이해하기 및 기본 환경설정 세팅하기
NGINX Nginx의 개요 엔진엑스(Nginx)는 Igor Sysoev라는 러시아 개발자가 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache 보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화��
whatisthenext.tistory.com
https://jongmin92.github.io/2019/03/05/Java/java-reactor-pattern/
(reactor pattern에 대한 자세한 설명)
'Web > Backend' 카테고리의 다른 글
스프링부트 @Component 와 @Configuration , @Bean (0) 2021.01.31 Springboot - ApplicationTest에서의 에러 // test 건너 뛰기 (0) 2020.11.04 JWT ( JSON WEB TOKEN ) 란 ?? (0) 2020.10.03 스칼라 서브쿼리, 연관 서브쿼리 동작원리 및 실행순서 (0) 2020.08.10 JPA 사용법 차근차근 알아보기(1) - Entity, save (0) 2020.07.28