네트워크

Nginx 서버

ingwang22 2020. 9. 21. 00:17
728x90

1. Nginx가 하는 일

 

1-1. 웹서버(HTTP Server)

 

우리 보통 아는 웹서버처럼 클라이언트(앱, 브라우저 등등)으로부터 요청이 들어올때 요청에 맞는 정적파일(html, css, javascript) 을 리턴해주는 역할을 합니다.

 

1-2. reverse proxy (소프트웨어 로드 밸런서)

Nginx가 가짜 웹서버로 동작하며 클라이언트로부터 Nginx 로 요청이 들어오면 Nginx 가 직접 응답하는게 아니라 이 요청을 등록된 다른 서버로 전달하는 역할을 한다.

 

Nginx 설정파일인 /etc/nginx/nginx.conf 파일에는 server라는 블록이 있다.(프록시 서버) 프록시 서버에 포트를 할당하고 location 블록을 이용하여 url 에 대한 리다이렉션 설정을 해주면 된다.

특히 Vue와 같은 페이지 하나만 사용하는 SPA 에서는 /user/checkout 와 같이 라우터를 통해 상대경로로 접근할때에는 페이지가 정상적으로 나오지만, 새로고침이나 직접 경로를 입력해서 들어갈경우 404 에러가 뜰것이다. 이는 Nginx가 등록된 root에서 /user/checkout 이라는 파일을 찾지만 그 파일이 존재하지 않기 떄문에 그런 에러가 발생하는 것이다. try_files를 이용하여 이에 대한 설정을 해주면 된다.

 

서버에 접속하고 Http Response Header를 까보면 Server attribute에 nginx로 되있는걸 볼 수 있다.

 

2. Nginx 가 Hot 한 이유

 

Nginx는 Apache 와 가장 많이 비교되는데 Apache는 멀티 스레드 구조다.

즉 하나의 스레드가 클라이언트 요청 하나 를 처리해주는 구조이므로(당연히 소켓 단위다.)

사용자가 많아지면 자연스럽게 스레드, 메모리 CPU 낭비가 심해지게 된다.

그림으로 보면 아래과 같은 구조일것이다.

 

반면 Nginx는 비동기 이벤트 처리 방식이다.

한개의 프로세스만 생성하고 그 프로세스 내부에서 비동기방식으로 연결을 처리한다.

 

실제 ps를 떠보면 마스터 프로세스라는 것이위에 있고 4개의 worker process가 있다는 것을 볼수 있다.(/etc/nginx/nginx.conf에서 worker_process 값을 변경하면 프로세스 개수를 바꿀수있다.)

 

그림으로 보자면 다음과 같다.

이 방식은 작은 규모의 서비스에 굉장히 적합하다. 그러나 사용자가 굉장히 많거나, 작업 하나하나가 오래 걸리는 I/O 처리일경우 큐에 계속해서 요청이 쌓일 거고 성능이 저하될 것이다. 따라서 대규모 서비스나 복잡한 처리나 대용량 데이터 처리에는 적합하지 않은 구조이다.

 

 

추가 +

3 . C10K Problem 관점으로 비교

 

C10K problem 은 동시에 많은 수의 클라이언트의 요청이 들어왔을 때 최적화하는 문제이다. 여기서 C10K 이란 10000개의 연결(Connection)을 의미하고 웹서버가 얼마나 많은 수의 클라이언트를 감당할 수 있는가를 의미한다.

 

기존 Apache 방식으로 10000개의 연결을 하기 위해서는 10000개의 소켓이 필요하고 소켓을 여는 10000개의 쓰레드가 필요하다. 쓰레드당 1MB 의 메모리가 필요하다고 하면 10000MB = 약 10GB 가 필요하다(대부분의 PC가 4G RAM, 8G RAM을 사용하지 않는가? 근데 10GB 를 혼자서 다 먹는다고?) 또한 코어가 4개 있다고 해도 2500개의 쓰레드가 코어마다 걸릴거고 컨텍스트 스위칭 오버헤드가 2500회 발생할것이다. 즉 C10K Problem의 메모리 공간 복잡도가 연결수 N에 따라 선형으로 증가하는 O(N)의 구조이다.

 

반면 Nginx는 비동기 이벤트기반으로 동작한다. 많은 요청이 들어와도 효과적으로 처리가 가능하다. 연결이 10000개 여도 정해진 수의 프로세스(worker_procss)가 이 연결을 이벤트로 등록해뒀다가 완료되는 이벤트부터 처리해주는 형식입니다. 즉 C10K Problem의 메모리 공간 복잡도가 항상 O(1)입니다.

 

아래는 Apache와 Nginx 의 비교입니다. 10 * 100 의 부하를 줬을때 Apahce같은 경우 처리 할수 있는 연결의 limit 를 넘어가면 Failed Request가 발생하는 것을 볼수 있습니다. 그에 반해 Nginx는 Failed한 request 또한 없다는 것을 볼수 있습니다.

 

 

그렇다고 해서 Apache가 Nginx 보다 항상 나쁜것은 아니다. 웹서버 성능을 C10k 관점에서만 판단하는 것은 아니기 때문입니다. 실제로 Apache는 지원하는 모듈이 Nginx보다 많으며 오래된 서버인만큼 안정성 확장성, 호환성이 장점으로 들수 있습니다. 또한 Apache에서도 2.4 버전부터는 Nginx 와 유사하게 event MPM 방식을 지원한다고 한다. 

자신의 서비스에 맞게 웹서버를 고르고 이에 맞는 서버 설정을 해주면 될것 같다.