Why Nginx?

Nginx

Nginx는 Web server software로 Event-driven 방식의 Single thread process로 구성되어 가볍고 빠르다. 이런 특징을 바탕으로 현재 16% 정도의 시장 점유율을 보이고 있다. 이 점유율은 계속적인 증가추세에 있어 하락추세에 있는 아파치를 위협하고 있다.(여전히 아파치의 점유율은 압도적이다.) 넷플릭스를 비롯한 수많은 기업들이 사용하고 있다. Nginx는 다음과 같은 기능들을 제공한다.

  • handling of static files
  • reverse proxy
  • load balancing
  • SSL support
  • FastCGI
  • Virtual Host
  • FLV Streaming
  • MP4 Streaming
  • Web page access authentication
  • gzip
  • URL Rewriting
  • Custom Logging
  • SSI
  • WebDAV

빠르다

스크린샷 2016-11-25 오후 12.15.19.png

그래프는 Nginx가 Apache보다 시간당 처리 요청수가 훨씬 많음을 보여준다. 이는 Nginx의 Event-driven한 비동기적인 특징으로 부터 온다. Asynchrnous, Event-Driven I/O가 빠른 성능을 보일 수 있는 이유는 Why Node.js를 보면 이해할 수 있다.

가볍다

스크린샷 2016-11-25 오후 12.18.41.png

그래프는 아파치의 메모리 사용량이 동시 요청 처리의 증가에 비례하는 것을 보여준다. 요청이 많아질수록 아파치는 메모리에 과부하를 많이 준다. 반면 Nginx는 동시 요청 처리가 아무리 증가해도 일정 수준의, 아주 낮은 수준의 메모리 사용량을 보인다. 이는 CPU 소모량에서도 비슷한 모습을 띈다. 이 역시 Nginx의 Event-Driven한 특징에서 온다. Event-Driven에 기반해 Single thread architecture를 구성했기 때문에 가능한 일이다. 생성하고 관리해야할 쓰레드가 적으니 메모리 소모가 적고, CPU를 점유하고 낭비하는 쓰레드가 없고 쓰레드간의 Context switch와 같은 Overhead도 없으므로 CPU 효율도 좋은 것이다.

Web server

Nignx는 웹 서버 소프트웨어이다. 웹 서버는 http request를 받고 http response를 돌려준다. 보통 웹페이지나 사진, 동영상들을 http response에 담아서 돌려준다. Nginx는 이런 일을 할수 있다. 그러나 어떤 데이터를 보내줄 것인지, 그 데이터를 어떻게 가공해 보내줄 것인지, 특히 Dynamic page를 생성하는 일은 직접하지 않고 서버사이드 스크립트가 담당한다. 이런 서버사이드 스크립트들로 Node.js, Python 등이 있다. 그런데 노드나 파이썬 모두 http library를 내장하고 있으며, Express나 Django와 같은 Web framework를 사용할 경우 아주 쉽게 웹서버(요청, 가공, 응답이 모두 가능한)를 만들 수 있다. 그렇다면 왜 Apache나 Nginx와 같은 웹서버 소프트웨어들을 필요로 할까?

So Why Nginx with Web Framework

Reverse proxy

Nginx는 Reverse proxy server로써의 역할을 한다. Reverse proxy server란 서버 머신의 방화벽과 백엔드 서버 사이에서 클라이언트 요청으르 핸들링 해주는 서버를 뜻한다. Nginx가 Reverse proxy server역할을 함으로써 로드 밸런싱, 가속, 익명성을 통한 보안성 강화의 역할을 할 수 있다.

하나의 서버 머신 안에 여러개의 백엔드 서버 어플리케이션이 동작하고 있을 수 있다. 이때 클라이언트는 서버 머신의 특정 포트(아마도 80포트)로만 접근을 하도록 유도하고, 해당 요청을 어떤 백엔드 서버가 핸들링 할것인지를 Reverse proxy server(여기선 Nginx)가 결정한다.

  • 이 때 Nginx는 백엔드 서버들 간의 요청 처리를 분산 시킴으로서 최적의 반응 성능을 유도하고, 서버 중 한대에서 문제가 발생하면 다른 서버들이 대신 처리할 수 있도록 도와준다.
  • 또한 스태틱 파일 서빙이나 캐쉬 서비스와 같은 요청에 대해선 백엔드 서버를 거치지 않고 바로 응답하기에 응답 가속 효과를 줄 수 있다.
  • 마지막으로, 클라이언트는 하나의 Nginx 포트로만 접근하며 실제 어떤 포트에서 해당 요청을 처리하는지 숨기고, 보안 공격에 대해 1차적인 방어선 역할을 해주어 백엔드 서버 단에서 보안에 대한 부담을 덜게 해준다.

우분투 기준으로 /etc/nginx/sites-enabled/ 에 다음과 같은 conf 파일을 추가함으로서80포트로부터 8000혹은 8080포트로 포트 포워딩을 하는 가장 기본적인 reverse proxy를 설정할 수 있다.(locahost:8000이 아니라 localhost로 접근할 수 있는 것!!)

도메인 네임을 localhost로 했을 경우, default.conf와 충돌이 일어 날 수 있으니, 새로 생성하는 conf 파일 이름을 default.conf로 덮어씌우기 해버리자. 아래의 listens 443 ssl http2; 부분은 아랫 장을 위하여 지금 같이 붙여 넣는다.

server {
        listen 80;
        server_name DOMAIN_NAME;

        location / {
                client_max_body_size 20M;
                proxy_pass http://localhost:8000;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

server {
        listen 443 ssl http2;
        server_name DOMAIN_NAME;

        location / {
                client_max_body_size 20M;
                proxy_pass http://localhost:8000;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

이를 바탕으로, 가장 기본 적으로 쓰이는 Nginx의 기능들을 구체적으로 살펴보자.

Static file serving

우리가 Node.js로 만든 서버가 있다고 가정하자. 클라이언트가 특정 URL, 예를 들어 kimsup10.com/index 로 요청을 보냈을 때, 서버가 해야할 일이 다음과 같다고 가정하자.

데이터베이스로 부터 세개의 이미지 소스를 골라 해당 이미지 소스들을 포함하는 Html 파일을 돌려 보내라.

이 때 서버는 한번의 요청-응답을 수행하는 것이 아니라, 총 네번의 요청 응답을 수행한다. 우선 이미지 소스를 포함한 html파일을 보내고, 이를 받은 브라우저(클라이언트)가 다시 이미지 소스에 대해 요청을 보내면 해당하는 static file을 응답으로 보낸다. 소스가 세 개이기 때문에 총 네번의 응답을 보내야 하는 것이다. 하지만 Nginx를 Node.js 위(앞?)에 Proxy server 로둠으로써 단순히 이미지 소스 요청에 대한 응답만을 보내는 세번의 요청을 Node.js에 보내지 않고 처리할 수 있다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-12-12-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-9-22-55
Nginx을 사용하지 않고 메인페이지는 호출하는 모습
%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2016-12-12-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-9-23-02
Nginx에게 static file을 맡긴 후 메인페이지 호출시에도 온화로운 node.js의 모습

Nginx는 소프트웨어 본래의 목적과 그 특성상 Node.js나 Django보다 훨씬 빠른 Static file serving(이미지, 정적 페이지 등)이 가능하다. 따라서 Nginx를 Node.js 앞에 두면 Node.js는 한번의 응답만 처리하면 되니 백엔드의 부하가 분산되고, 나머지 세개의 응답은 심지어 Nginx가 더 빨리 처리할 수 있기 때문에 시작 요청부터 마지막 응답까지의 속도가 더 빨라진다. Proxy server인 Nginx가 Node-Express의 미들웨어처럼 역할을 하며 부하분산과 속도향상을 동시에 얻을 수 있다.

SSL Support

많은 서비스들이 사용자 정보 보안을 위해서 https를 요구한다. 간단한 페이스북 메신저 챗봇 하나를 만드려 해도 https 서버를 필요로 한다. 이때 SSL offloading을 해야되는데 Nginx와 let’s encrypt를 이용해 손쉽게 https 서버를 구축할 수 있다.

우선, aws ec2 instance 등의 도메인이 아닌 일반 도메인이 필요하다. 그리고 해당 도메인을 자신의 서버 IP로 라우팅 시켜놓아야 한다.

이후 서버가 돌아가는 상태에서, 우분투 기준으로 다음의 명령어면, SSL offloading이 끝난다.

$ apt-get update && apt-get install software-properties-common -y
$ add-apt-repository ppa:certbot/certbot
$ sudo apt-get install python-certbot-nginx
$ sudo certbot --nginx -n -d [domain name] --email [email address]

 

 

Why Nginx?”의 1개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

search previous next tag category expand menu location phone mail time cart zoom edit close