12-23 00:00
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Web App / Express] Node.js (Express Framework) 앞단에 Nginx 사용하기 본문

Programming/Web App

[Web App / Express] Node.js (Express Framework) 앞단에 Nginx 사용하기

cinema4dr12 2015. 11. 7. 23:02

Nginx를 앞단에 둠으로써 Express가 사용하는 실제 포트를 숨기고 Nginx의 80포트를 통해 Reverse Proxying 을 함으로써 저런 보안 이슈를 방지할수도 있고 Nginx의 우수한 기능 활용할 수 있다. 실제 Static File 과 같은 경우에는 Node.js 보다는 Nginx가 훨씬 성능이 뛰어나다고 한다.

유의할 점은, Nginx 1.0.x버전은 HTTP 1.1을 아예 지원하지 않고 (TCP Module 사용 예외) Nginx 1.1.x버전은 HTTP 1.1을 지원하지만 Websocket은 지원하지 않기 때문에 Socket.IO와 같은 모듈을 사용할 때 Websocket 방식으로 연결을 시도할 경우에는 Nginx를 거쳐서 연결을 시도하지 않고 직접 연결을 하거나 TCP Module을 사용해야 한다. 그럼 Nginx  Reverse Proxy로 설정하는 방법을 알아보자.

Ubuntu 11.04 Natty에서 패키지 인스톨로러를 통해 Nginx를 설치한 경우로 설명하도록 한다.


참고로 Ubuntu에서 Nginx 설치는 Terminal에 다음과 같이 입력한다:


$ sudo apt-get update

$ sudo apt-get install nginx


먼저


$ sudo nano /etc/nginx/sites-available/example


이렇게 사용하고 싶은 이름 (일반적으로 도메인 이름, 여기선 example) Nginx 설정 파일을 열고


server {

  listen 80;

  server_name example.com;

  location / {

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header Host $http_host;

    proxy_set_header X-NginX-Proxy true;


    proxy_pass http://127.0.0.1:3000/;

    proxy_redirect off;

  }

  gzip on;

  gzip_comp_level 2;

  gzip_proxied any;

  gzip_min_length  1000;

  gzip_disable     "MSIE [1-6]\."

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

}


이렇게 입력하고, CTRL+X를 눌러 빠져나오고, Y를 눌러 파일을 저장한다.

$ cd /etc/nginx/sites-enabled/
$ ln -s /etc/nginx/sites/available/example example


이렇게 하면 방금 만든 Nginx 설정파일이 적용된다. 설정을 변경한 이후에는 Nginx를 반드시 재시작 해줘야 변경한 것이 적용이 되므로


$ sudo /etc/init.d/nginx restart


를 쉘에서 실행하여 재시작을 한다.


혹시 아직 만든 Node.js App이 없다면 테스트용으로


var http = require('http');


http.createServer(function (req, res) {

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

    res.end('Hello World\n');

}).listen(3000, "127.0.0.1");


console.log('Server running at http://127.0.0.1:3000/');


위와 같이 입력하고 이름을 app.js로 저장한다.


Shell에서


$ node app.js


이렇게 테스트 App을 실행하면, http://localhost:3000으로는 직접 연결해서 Hello World 를 볼 수도 있고,

http://localhost 로도 같은 Hello World를 볼 수 있다. 실제 Production 에서는 방화벽에서 3000포트를 허용하지 않고 80포트만 Inbound 해주면 Nginx 를 통해서만 앱에 접근할 수 있게 된다.

Comments