서버/AWS (Amazon Web Services)

[AWS의 기본 09] NGINX를 node.js의 프록시로 설정하기

날개 2014. 7. 29. 23:40

이번에는 NGINX를 node.js의 프록시로 사용하는 방법을 살펴 봅니다.


node.js의 알려지지 않은 보안 문제가 있을 수 있기 때문에 NGINX와 같은 웹서버를 앞단에 프록시 서버로 사용하는 것을 추천한다고 알려져 있지요.


그 방법을 살펴보겠습니다.



[9] NGINX를 node.js의 프록시로 설정하기


지난 포스팅들에서 이미 EC2 인스턴스에 node.js와 NGINX를 설치는 했습니다만, 함께 사용해 보는 것은 처음인것 같습니다.


먼저 테스트를 위해 예제로 간단한 node.js 소스코드를 만들어 봅니다. (샘플일 뿐이므로 각자 원하는 대로 만들면 되겠네요.)


아래 내용을 홈디렉터리에 'test.js' 라는 이름으로 저장합니다. (샘플일 뿐이므로 원하는 디렉터리에 원하는 이름으로 저장해도 됩니다.)


var http = require ('http');


http.createServer (function (request, response) {


    response.writeHead (200, {'Content-Type': 'text/html'});

    response.end ('<h1>Welcome to node.js</h1>');


}).listen (52222, function () {

console.log ('Listening on 127.0.0.1:52222');

});


한번 실행해 볼까요?

$ node test.js

웹브라우저에서 접속해 봅니다. 포트번호는 52222로 했습니다.

이런... 접속이 되지 않네요. 왜일까요?


바로 EC2 보안 그룹 설정에서 52222포트를 열어두지 않았기 때문입니다.


테스트를 위해 임시로 EC2 보안 그룹에서 지금 사용하고 있는 EC2 인스턴스와 연결된 보안 그룹 선택하고, Inbound 룰에 아래와 같이 'Custom TCP Rule: TCP: 52222: 0.0.0.0/0'을 추가합니다.

[Save]를 눌러 저장합니다.


이제 다시 접속해 보죠.

네, 이제 node.js에 잘 접속 되는 것을 볼 수 있습니다.


그런데, 이렇게 접속하는 것은 node.js에 직접 접속하는 것입니다.


이 글의 목적은 사용자가 node.js에 직접 연결하지 못하고 nginx를 경유해서 접속하게 하는 것이죠.


여기서는 'test'라는 서브 도메인을 통해 접속하도록 설정해 보도록 하겠습니다.


예를들어, 도메인이 'example.com'이라면, 'test.example.com'으로 접속하면, 해당 node.js로 연결되도록 해보겠습니다.


먼저 바로 지난회에 배운, Route 53 도메인 설정으로 들어갑니다.

도메인 호스트 존에서 CNAME 레코드를 하나 추가합니다.


내용은 도메인이 'example.com'이라면, 위와 같이 CNAME으로 Name은 'test.example.com'으로 (실제로는 'test'만 입력하면 되겠죠.), Type은 CNAME, Value는 'example.com'으로 입력해서 추가합니다.


도메인 설정이 끝났으면(전에도 이야기 했듯이 도메인 설정이 반영되는데 10~20분 이상이 걸릴 수 있습니다.), 바로 전 포스팅에서 만든 '/etc/nginx/sites-avaliable' 디렉터리에 아래와 같은 내용으로 설정 파일을 만듭니다.


여기서는 샘플로 'test.conf'라고 하겠습니다.



server {


    listen 80;

    server_name test.example.com;


    location / {

      proxy_set_header Host $http_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;

      proxy_set_header X-NginX-Proxy true;


      proxy_pass http://127.0.0.1:52222/;

      proxy_redirect off;

    }


    log_not_found off;


    gzip on;

    gzip_comp_level 2;

    gzip_proxied any;

    gzip_min_length  1000;

    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;

 }

여기서, listen은 http 표준 포트인 80을 그대로 두면 되고 (필요에 따라 변경), server_name에 접속할 도메인 이름(서브도메인포함)을 적습니다.


proxy_pass에 바로 server_name에 적어둔 도메인으로 접속할 때 넘길 주소와 포트를 적는 것입니다.


이제 이 설정 파일이 적용되도록 '/etc/nginx/sites-available'에 심볼릭 링크를 만들고 NGINX의 설정을 재 로딩 합니다.


$ cd /etc/nginx/sites-enabled

/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/test.conf test.conf 

/etc/nginx/sites-enabled$ sudo service nginx reload

이제 웹브라우저를 열어 서브도메인을 포함한 node.js를 위한 도메인을 입력해 봅니다. 여기서 위에서 만든 'test.js'는 실행해 놓은 상태이어야 합니다.


예를 들어 도메인이 'example.com' 이었으면, 'test.example.com'를 입력합니다.

node.js가 잘 작동하고 있네요.


이제 EC2 관리자 콘솔에서 보안 그룹의 Inbound에 임시로 추가한 52222번 포트를 삭제해 주면, node.js로 바로 접속은 차단되고, 위와 같이 도메인을 통해 NGINX를 통하여 node.js에 간접적으로 연결되게 됩니다.


보안을 위해 반드시 보안그룹에서 node.js 포트는 삭제해 줘야 합니다.


이번 포스팅은 여기까지 입니다.







(1) 이 포스팅은 2014.7.29 기준으로 작성되었습니다. 웹서비스는 서비스 제공 업체에 의해 언제든지 변경될 수 있습니다.

(2) 여기서 사용한 스크린 캡쳐 이미지들의 출처는 따로 표기되지 않으면, http://aws.amazon.com 웹사이트 입니다.

(3) 터미널 화면의 캡쳐 이미지와 웹 브라우저 접속의 예제는 글쓴이의 PC 화면 입니다.