nginx를 이용한 Reverse Proxy 서버 구축.
안녕하세요. 서버 개발자 JAKE AN입니다.
Proxy Server란 무엇인가에 대해서 설명하고 나서 실제 서버에 간단하게 적용하는 코드를 설명하겠습니다.
1. Proxy 서버를 사용하는 이유?
Proxy는 Proxy 서버를 통해서 다른 네트워크에 직접적이지 않고 간접적으로 접속할 수 있도록 해주는 컴퓨터 프로그램입니다.
서버로 들어오는 request를 중계하는 역할을 합니다. 일반적으로 proxy는 프로그램으로써 서버를 기반으로 작동하기 때문에 Proxy 서버라고 불립니다.
Proxy 서버는 중계하는 1) 목적 2) 위치 3) 방법 에 따라서 다양한 종류로 나뉘게 됩니다.
주로 Proxy 서버를 구축하는 이유는 다음과 같습니다.
1) 보안 : 익명의 사용자가 직접적인 Web Server로의 접근을 한다라고 하면 문제가 발생할 수 있기 때문에 직접적이지 않고 한 단계를 더 거침으로써 보안적인 부분에 대해서 사용이 됩니다.
2) 속도 : Proxy서버는 사용자의 요청을 cache를 사용하여 가지고 있다가, 동일한 요청이 오면 이중작업 요청을 위한 처리를 안해도 되고 cache에서 다시 사용할 수 있게 만들어 준다. 이렇게 하면 서비스의 속도와 불필요한 리소스 낭비를 막게된다.
3) ACL : Server로 접근하는 접근자에 대한 접근을 허용할 것인지 말 것인지에 대해서 정책적으로 정의를 할 수 있게 됩니다.
4) Log/Audit : 네트워크로 접근하는 접근자에 대한 사용정보를 레포팅할 수 있습니다.
5) 접근 우회 : 보안상의 이유로 서버에 대한 접근을 할 수 있는 통로를 최소화하기위해서 포트막아 놓는 경우가 있는데, 이러한 제한이 있으면 우회해서 다른 서비스를 이용할 수 있게끔 요청을 전달하는 역할을 한다.
2. Proxy 서버의 종류
일반적인 Proxy 서버의 종류는 사용 목적에 따라서 3가지로 분류가 됩니다.
2-1. Forward Proxy
가장 일반적으로 가장 많이 사용하는 프록시 방식입니다. 클라이언트와 Web Server 사이에 Forward Proxy가 위치 시킵니다.
이 상태에서 클라이언트에서 특정한 서비스에 대한 요청을 하면 그 서비스를 처리하는 타겟 서버로 중계 전달을 해줍니다.
2-2. Reverse Proxy
기본적인 구성은 바로 위의 Forward Proxy와 구성 배치는 같습니다. 하지만 다른점은 같은 서버내에 다른 서비스 처리를 하는 곳으로 보내진다는 점이 다릅니다.
즉, 외부에서는 a-1라는 요청을 보내면 a-1를 그대로 받아서 다른 서비스 형태인 a-2에도 전달이 가능하고 a-3도 가능합니다. 겉으로 보이는 요청과 다른 형태의 내부 처리가 가능하게끔 전달해주는 역할을 하게 됩니다.
이점은 애플리케이션의 서버정보가 외부로 부터 감추어주고, 하나의 요청으로 여러가지 형태로 처리도 가능한 분산처리도 가능하게 할 수 있다는 장점이 있습니다.
그림으로 보면 www.abc.com/mail 을 요청했는데 결국엔 mail.a.com으로 처리가 전달되는 형태가 됩니다.
2-3. Open Proxy
Open Proxy는 인터넷으로 한국에서 접근이 불가능한 사이트 예를 들어, 정치 외교적인 문제로 중국 내부에서만 볼 수 있는 사이트를 접속해본 경험이 있으신 분들은 아실 수 있는 일반적인 인터넷 접속을 하기 위한 Proxy입니다.
본인의 IP를 숨기고, Proxy 서버가 있는 해당 국가의 IP로 대신 접속해서 대신 결과를 받아오는 형태의 Proxy Server입니다.
3. Nginx를 이용해서 서버의 보안과 속도 향상
보통 사용자들의 서비스에 대한 요청이 서버에 들어오게되면 그냥 서비스를 열어 놓은 포트로 그대로 서비스를 하는 경우가 있는데,
이런 서버의 구축은 추후에 서버의 Scale up, out 또는 서비스의 기능적 확장을 고려하는 경우에 확장에 대한 많이 이슈를 발생 시킬 수 있습니다.
또한, 보안적인 문제도 하나의 Proxy Server를 거치지 않기 때문에 요청의 주소와 서비스의 주소가 같아버리는 보안적 취약점이 나타나게 됩니다.
해킹을 통한 비정상적인 요청을 통해 서버를 망가뜨리려는 일이 발생할 수 있기 때문에 중간에서 중계기능을 새로이 설정해서 해결할 수 있기 때문에 보안적으로도 상당히 중요한 Proxy Server 구축입니다.
보안적인 부분, 확장성에 대한 부분, 속도에 대한 부분 을 고려해서 여기서는 우분투 14.04 LTS OS를 기반으로한 서버를 구축하는 간단한 설치 코드를 설명하고 마치겠습니다.
//nginx 설치 방법
$ sudo apt-get update
$ sudo apt-get install -y nginx
//nginx 설정방법.
$ sudo touch /etc/nginx/sites-available/nginx의 설정파일명.conf
$ sudo ln -s /etc/nginx/sites-available/nginx의 설정파일명.conf /etc/nginx/sites-enabled/nginx의 설정파일명.conf
$ sudo mkdir /var/log/프록시서버log폴더명
$ sudo vi /etc/nginx/sites-available/nginx의 설정파일명.conf
/etc/nginx/sites-available/nginx의 설정파일명.conf
server {
listen AA;
access_log /var/log/프록시서버log폴더명/access.log;
error_log /var/log/프록시서버log폴더명/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://전달할 주소:BBBB;
}
}
$ sudo mv /etc/nginx/sites-available/default /etc/nginx/default.conf.backup
$ sudo /etc/init.d/nginx reload
//nginx 제거 방법
$ sudo service nginx stop
$ sudo apt-get remove nginx
$ sudo apt-get purge nginx
이상입니다.
이 코드는 AA번 포트로 들어온 요청을 BBBB번 포트로 다시 reverse proxy의 형태로 넘겨주는 방식에 대한 코드입니다.
Reference :
http://www.joinc.co.kr/w/Site/System_management/Proxy