2012년 12월 25일 화요일

nginx - Reverse Proxy 설명 - 1



오늘은 저의 전공에 맞게 조금 기술적인 이야기를 해볼까 합니다. 바로 Reverse Proxy 서버로 많이 사용되는 Nginx에 대해 소개하려고 하는데요, 프로그램 소개에 앞서 Reverse Proxy가 무엇인지 먼저 짚고 넘어가도록 하겠습니다.

일반적으로 웹 서비스나 모바일 백엔드(back-end) 시스템은 외부 인터넷과 연결이 되어 있고, 대부분 서버-클라이언트 모델로 동작합니다. 즉, 모바일 앱이나 웹 브라우저 등의 클라이언트에서 요청을 보내면 서버 컴퓨터에서 처리를 한 뒤 응답하는 방식이죠. Reverse Proxy는 서버 컴퓨터에서 이러한 응답을 받아서 내부 프로세스에 넘겨주는 역할을 합니다. 예를 들어 서버 컴퓨터에 Reverse Proxy 서비스에서 HTTP 요청을 받아 Django나 PHP, Node.js 등 내부 HTTP 처리 프로세스로 넘겨주도록 설정해둘 수 있습니다.

그냥 곧바로 요청을 처리하지 않고 Reverse Proxy를 거쳐서 처리하는 이유는 크게 2가지가 있습니다. 첫째로는 보안 이슈입니다. 대부분의 Reverse Proxy는 기본적인 악의적 공격들을 방어해주는 기능을 포함하고 있습니다. 둘째로, 로드 밸런싱(load balancing)이나 서비스 마이그레이션 등이 용이하다는 점입니다. 요청을 받아 특정 서비스로 전달해주는 지점이 하나밖에 없으므로, Reverse Proxy 설정만 바꾸어주면 바로 요청을 처리할 서비스가 변경됩니다. 여러 서비스(혹은 프로세스)를 띄워놓고 어떤 서비스 혹은 프로세스를 사용할지 그때그때 쉽게 설정해줄 수 있고, 버그를 수정한 버전의 서비스를 띄운 뒤 자연스럽게 이전 서비스를 죽일 수도 있습니다.

이제 Reverse Proxy들중 Apache의 mod_proxy와 더불어 가장 많이 사용되는 Nginx를 어떻게 설정하는지에 대해 살펴보겠습니다. 필자는 우분투(Ubuntu) 리눅스 배포판을 사용하므로 이에 맞추어 설명하도록 하겠습니다. 먼저 Nginx를 설치하고 실행합니다.

$ sudo apt-get install nginx
$ sudo /etc/init.d/nginx start
Nginx 프로세스가 실행된 것을 확인하고 나면 브라우저에서 해당 서버로 HTTP 요청을 보냈을 때 Welcome to Nginx 메시지를 확인할 수 있습니다. 그 다음으로 해줘야할 일은 Reverse Proxy 설정을 해주는 일입니다. Nginx의 설정 파일을 다음과 같이 생성합니다. (아래example 부분은 마음대로 변경해도 됩니다)

$ sudo touch /etc/nginx/sites-available/example.conf
$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.conf
$ sudo mkdir /var/log/example
$ sudo vi /etc/nginx/sites-available/example.conf
만약 내부(localhost)의 HTTP 서비스가 8000번 서버에서 돌아가고 있고, 외부 HTTP 요청을 내부 서비스로 넘겨주도록 처리하려면 /etc/nginx/sites-available/example.conf 파일을 다음과 같이 설정합니다.

server {
    listen 80;
    access_log /var/log/example/access.log;
    error_log /var/log/example/error.log;

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8000;
    }
}
아마도 이 상태로 Nginx를 재시작 하게되면 /etc/nginx/sites-available/default와 HTTP 요청이 겹치면서 우리가 만든 설정이 무시될 것입니다. 따라서 default 파일을 sites-available 디렉터리 밖으로 빼서 백업을 해주면 우리의 설정을 적용할 수 있습니다.

$ sudo mv /etc/nginx/sites-available/default /etc/nginx/default.conf.backup
$ sudo /etc/init.d/nginx reload
일반 HTTP 요청 이외에도 HTTPS(보안 인증된 HTTP)나 SMTP(이메일 전송 프로토콜)과 같은 다양한 요청에 대해서도 프록시 설정이 가능합니다. 다른 프로토콜 요청에 대해서는 이 글에서는 다루지 않습니다.

댓글 없음:

댓글 쓰기