Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Javascript
- callback function
- AngularJS
- git
- Python
- 오픈소스
- Microsoft
- 빅데이터
- NoSQL
- 크로스브라우징
- 마이크로소프트
- 인턴
- 테스트
- 콜백 함수
- CSS
- github
- node.js
- JQuery
- 제이쿼리
- 자바스크립트
- Ajax
- 마소
- npm
- CoffeeScript
- 개발환경
- MongoDB
- 750R
- non-blocking
- 웹디자인
Archives
- Today
- Total
Inspired World
Node.js (Express Framework) 앞단에 Nginx 사용하기 본문
Node.js의 창시자인 Ryan Dahl에 의하면
"You just may be hacked when some yet-unknown buffer overflow is discovered. Not that that couldn't happen behind nginx, but somehow having a proxy in front makes me happy".
"아직 발견되지 않은 버퍼 오버플로우 취약점에 의해서 해킹 당할 수 있습니다.
Nginx를 앞단에 둠으로써 이런 취약점에 의해서 해킹을 완전히 막아주지는 않지만, 저는 Nginx을 Proxy서버로써 앞단에 두는 것이 좋다고 생각합니다."
좀 의역을 한 부분이 없잖아 있지만, 중요한 포인트는 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 설치는
하시면 됩니다.
먼저
이렇게 사용하고 싶은 이름 (일반적으로 도메인 이름, 여기선 example) Nginx 설정 파일을 열고
CTRL + X 를 눌러 빠져나오고
Y를 눌러 파일을 저장합니다.
설정을 변경한 이후에는 Nginx를 반드시 재시작 해줘야 변경한 것이 적용이 되므로
혹시 아직 만든 Node.js 앱이 없다면
테스트용으로
위와 같이 입력하고 이름을 app.js로 저장합니다.
쉘에서
이렇게 테스트 앱을 실행해주면
http://localhost:3000으로는 직접 연결해서 Hello World 를 볼 수도 있고
http://localhost 로도 같은 Hello World를 볼 수 있습니다.
실제 Production 에서는 방화벽에서
3000포트를 허용하지 않고
80포트만 Inbound 해주면 Nginx 를 통해서만 앱에 접근할 수 있게 됩니다.
"You just may be hacked when some yet-unknown buffer overflow is discovered. Not that that couldn't happen behind nginx, but somehow having a proxy in front makes me happy".
"아직 발견되지 않은 버퍼 오버플로우 취약점에 의해서 해킹 당할 수 있습니다.
Nginx를 앞단에 둠으로써 이런 취약점에 의해서 해킹을 완전히 막아주지는 않지만, 저는 Nginx을 Proxy서버로써 앞단에 두는 것이 좋다고 생각합니다."
좀 의역을 한 부분이 없잖아 있지만, 중요한 포인트는 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 설치는
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 앱이 없다면
테스트용으로
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로 저장합니다.
쉘에서
node app.js
이렇게 테스트 앱을 실행해주면
http://localhost:3000으로는 직접 연결해서 Hello World 를 볼 수도 있고
http://localhost 로도 같은 Hello World를 볼 수 있습니다.
실제 Production 에서는 방화벽에서
3000포트를 허용하지 않고
80포트만 Inbound 해주면 Nginx 를 통해서만 앱에 접근할 수 있게 됩니다.
'Node.js' 카테고리의 다른 글
Node.js로 쉽게 oEmbed 사용하기 (0) | 2014.04.23 |
---|---|
Express.js에 Gzip 적용하기 (0) | 2014.04.18 |
Node.js 개발 생산성을 높이기 위한 도구 "Supervisor" (5) | 2012.03.13 |
Node.js 에서 NODE_ENV 값으로 배포/개발 환경설정하기 (6) | 2012.03.02 |
JavaScript 및 Node.js에서 XSS 공격 막기 (0) | 2012.03.01 |
Comments