Spring, .NET, Flask 의 웹서에서 각각 제공해주는 tomcat, kestrel, gunicorn 과 별개로 독자적으로 활동하는 웹서버인 Nginx 의 장점과, 변해가고 있는 현 트랜드에 대해서 정리해보려 합니다.
트래픽이 많은 웹사이트를 위해 확장성을 위해 설계된 비동기 이벤트 기반 구조의 웹서버 소프트웨어
Nginx 개인적으로 여러 시도...? 과 다양한 경험을 해보면서 나름 수준급의 경지에 올랐다고 생각합니다.
웹 서버 점유율 추이 (Graph by Netcraft)
현업 에서도 잠깐 Java Spring 시스템을 운영하기도 했지만, 전세계적으로, 그리고 특히 Java 진영에서는 거의 함께하는 동반자 수준으로 같이 하던 Apahe.
하지만 러시아의 한 개발자가 Nginx 를 만든 후, 뛰어난 성능으로 많은 관심을 받아 왔으며, 2022 년 현 시점에 와서는, Web server 점유율 1 위를 유지하고 있습니다.
Apache 와 Nginx 는 서로 비슷한 역할을 하고 있지만, 두 소프트웨어 만의 차이가 있습니다.
Apache 의 경우는 요청 당 쓰레드, 프로세스가 처리하는 반면에, Nginx 는 비동기 이벤트 기반으로 요청을 처리하게 됩니다.
그러다 보니 대용량의 트래픽을 감당해야 하는 시스템에서는 상대적으로 Apache 보다 Nignx 가 우세한 이점이 있습니다.
|
|
Apach | Nginx |
1. 요청 당 쓰레드 또는 프로세스가 처리 2. Nginx 보다 모듈이 다양함 3. PHP 모듈 등 직접 적재 가능 4. 안정성, 확장성, 호환성 우세 | 1. 비동기 이벤트 기반으로 요청 2. Apach 에 비해 다양한 모델 없음 3. 많은 접속자들 대응 가능 4. 성능 우세 |
Nginx 는 하나의 master process 와 여러 worker process 로 구성됩니다.
master process 는 Configuration file 을 읽고 , worker process 를 관리합니다.
실제 worker 에 해당 하는 여러 Directives 를 명시해서 Worker 로서 등록이 가능합니다.
Configuration file 은 기본적으로 Linux OS 기준 /etc/nginx/nginx.config 경로에 위치합니다.
그리고 해당 파일은 Directives(지시어) 의 묶음으로 나열 됩니다.
Simple Directives 예시 | Block Directives 예시 |
client_max_body_size 20M; | upstream group { |
- Context 로는 main, http, server, location 등이 있고 순서대로 포함 관계를 가집니다.
* 공식 Document 를 읽다보면 각 지시어 Directives 를 사용 가능한 Context 를 지정해 주는 데, 그 때의 Context 가 바로 이것을 의미
1. Simple Static file Server
path/to/html; | - http Context 안에 Server Context 안에 location Context 존재. - location 뒤에 있는 url(/) 로 접속시 서버의 디렉터리 (/path/to/html)에 있는 정적 파일을 제공하겠다는 내용을 담고 있다. |
2. Proxy Server 로 이용하기
http { | - 프록시 서버에 대해서 간략히 설명하면 서버로 들어온 request 가 다른 서버에 전달하고, 그 서버로부터 response 를 전달 받아 클라이언트로 전달하는 중간 매개체. - 8080 포트로 요청받은 내용을 proxy 를 통하여 5000 포트로 Redirect |
3. Load Balancer 로 이용하기
http { | - 하나의 proxy server(Nginx) 에서 여러 WAS +CGI 서버로 적절히 부하를 나누어 연결하는 기술을 Load Balacing 이라함 - Nginx 에서 제공하는 Load Balancing 기법은 3가지 - round-robin : 라운드 로빈 방식으로 동등하게 접속 (기본) - least-connected: 가장 적게 연결된 서버 중심으로 접속 - ip-hash: 고정 ip 방식으로 동일 서버에만 접속 - weight 는 round-robin 방식에서 서버의 부하 가중치 설정 |
1. Proxy 요청 Timeout 늘리기
http { | - Nginx 는 다양한 처리에 Timeout 이라는 linit 이 설정되어 있다. - 예를 들어 was 와 cgi 서버의 프록시 서버로 사용되고 있는 Nginx 에서는 cgi 와 was 로 전달된 요청(request) 에 일정 시간동안 응답(response) 되지 않으면 client 에 504 error 를 발생 시킨다. - 해당 문제는 timeout 설정에 관련된 directives 를 nginx.config 에 기술하여 해결 가능하다. - Timeout 종류는 아래 참고 문서를 참고. |
2. Cline 업로드 파일 용량 제한 늘리기
http { | - 웹 앱을 운영 하다보면 사용자로부터 대용량 업로드 파일을 받아야 하는 경우가 발생한다. - 해당 경우 server context 내부에 아래 문구(directives)를 추가한다. - client_max_body_size 20M |
3. http -> https 자동 Redirect
server { | - 사용자가 도메인 url 을 http 로 접속하더라도 proxy 서버단에서 SSL 인증을 받은 https 443 포트로 redirect 하는 기능 - 80 포트로 들어가는 server block directives 내부에 - 301 https://$host$request_uri 로 return 받게끔 설정 - 443 포트를 받는 server block directives 또한 생성해야 함 |
관련 글 : Nginx Load Balancing 적용기
참고 문서: