http://akal.co.kr/?p=1173


    [우분투, 민트] nginX에서 reverse proxy(리버스 프록시) 사용하기



    버스 프록시 서버는 일반적으로 네트워크 DMZ(방화벽에 의해 보호되지 않는 영역이라고 생각하시면 됩니다.)에 배치되어 인터넷 사용자에 의한 공격으로부터 내부 서버를 보호하는 보안 기능을 수행함으로써 회사 인트라넷 등의 HTTP 서버를 보호하는 보안 장치로 볼수 있습니다. 노출되어있는 네트워크에 단일화된 서버를 놓고 HTTP 서비스에 대한 단일 액세스 지점을 제공함으로써 여러가지 장점을 제공하게 됩니다.

    리버스 프록시 서버가 배치되면 리버스 프록시 서버와 연관된 URL만 웹 브라우저 사용자에게 공개됩니다. 인터넷의 사용자는 이 URL을 사용하여 리버스 프록시 서버에 액세스합니다. 리버스 프록시 서버는 인터넷 사용자의 이러한 요청을 처리하고 이 요청을 적절한 내부 웹서버로 경로를 재지정합니다. 리버스 프록시 서버는 서버에 지정된 리버스 프록시 서버 액세스에 사용되는 URL을 내부 웹서버의 실제 URL로 맵핑합니다. 또한, 반대의 경우 각각의 내부 서버로부터 인터넷 사용자로 전송되는 모든 트래픽은 단일 네트워크 주소에서 전송됩니다.

    덧붙여, HTTP 서비스를 이용하여 웹서버에서 URL을 매핑하기 때문에 포트포워딩을 이용해서 여러개의 포트를 이용해서 지저분하게 각각의 서버로 연동시키는것이 아니라 단일 Port를 이용해서 들어온 요청에 대해 리버스 프록시 서버가 URL 매핑을 시키기 때문에 웹서비스에 액세스하는 사용자들은 서버별로 각각의 포트번호를 외우거나 찾을 필요가 없습니다. 말로 설명하는 것보다 도식화된 다이어그램을 보면 더욱 쉽게 이해할 수 있습니다. 다음 다이어그램을 참고하십시요.

    Diagram을 통한 리버스 프록시 이해하기
    1. 일반적인 사용의 경우

    개인이나 가정 혹은 소호 비지니스용으로 설치된 웹서버의 경우 아래의 그림처럼 도식화 시킬수 있습니다.
    위와 같은 경우 우리가 가장 쉽게 웹서버를 구현하는 일반적인 방법은 무엇일까요 ? 아마도 공유기를 이용한 포트포워딩 일것입니다. 1,2,3,4 각각의 웹서버에 192.168.0.xxx 의 가상 아이피를 할당하고 Port 80, 88, 8000, 8080등의 포트번호를 이용해서 특정 포트를 요청하면 공유기자체에서 해당포트를 사용하는 웹서버를 요청하는 방법으로 많이들 사용하실겁니다.
    이 경우 URL이 난잡해지고 관리가 귀찮아지는 경향이 있습니다. 일단 일반 사용자들이 http://url:80/, http://url:88/, http://url:8000/, http://url:8080/ 이런식으로 해당 사이트마다 포트번호를 알고 있어야 되기 때문에 서버가 늘어날수록 접근과 관리측면에서도 어려움이 따르게 됩니다.

    2. 리버스 프록시 서버를 사용한 경우

    맨 처음 설명드린 것처럼 위의 일반적인 경우와 그림을 보면 딱 하나가 달라진 점이 리버스 프록시 서버를 담당하는 서버가 네트워크에서 액세스를 받고 URL 매핑에 의해 동일한 Port 80으로 각각의 웹서버로 요청을 하고 응답을 받아 인터넷상의 사용자에게 보내줍니다. 위 그림에서는 웹서버 모두 Port 80을 사용할수 있다는 개념으로 적어둔 것이지 내부적으로 다른 포트를 사용해도 무방합니다. 사용자들에게는 리버스 프록시 서버가 요청하고 응답을 보내주기 때문에 다른 포트번호를 사용한다고해서 사용자들이 그 포트번호를 알 필요도 없고 딱히 관리하기 어렵지도 않습니다.

    위와 같은 다이어그램을 보면 쉽게 다음과 같은 리버스 프록시의 장점을 생각할 수 있습니다.

    1. 서버의 부하를 덜어줄수 있는 로드 밸런싱 처리
    2. 각 서버의 부하를 덜어준 만큼 웹서버 속도 증대
    3. 보안과 익명성
    4. 중앙 집중식 log 작성과 감시
    5. 캐쉬사용

    이외에도 백업서버를 이용한 장애시 긴급 서비스 운영도 생각 해볼수 있습니다.

    nginX를 이용한 리버스 프록시 운영

    그럼 이제 nginX 웹서버를 이용해 실제로 리버스 프록시 서버를 설정하여 운영하도록 해봅니다.

    리버스 프록시를 이용하면서도 SSL 설정을 적용할수도 있습니다. 하지만, 여기서는 가장 기본적인 리버스 프록시를 설정하는 방법에 대해서만 기술하려 합니다. 사실 아직까지 제 서버가 SSL을 설치하지 않아서 제대로 이야기를 풀어나갈 자신이 없어서 다음 기회에 SSL을 적용하고 나면 다시한번 SSL을 적용한 리버스 프록시에 대해 이야기를 풀어보겠습니다.

    1. NGINX 리버스 프록시 서버에서 설정하기

    먼저 리버스 프록시 서버를 담당할 웹서버에서 nginX 설정을 지정해야 합니다.
    /etc/nginx/sites-available에 설정되어 있는 제 설정파일들 입니다. test.akal.co.kr 이라는 가상호스트 URL을 이용해 설정할 생각입니다.

    파일명과 마찬가지로 세가지 URL에 대해서 모두 매핑이 가능합니다. 가상호스트를 이용해서 지정할수도 있고, 완전한 다른 URL을 지정해도 됩니다. 하나의 파일로 생성해도 되지만 유지보수의 편의성과 한눈에 파악하기 좋아서 저는 URL 방식의 파일명을 사용합니다. 아래의 그림과 함께 참고하시면 이해가 쉬우실 겁니다.

    test.akal.co.kr 파일 설정 내용

    nginx는 test.akal.co.kr 을 통해 들어온 요청을 192.168.0.xxx 서버로 전환합니다. 이때 포토번호를 변조하셔도 됩니다. 또한 가상아이피가 아닌 리얼 아이피를 사용하는 곳에서는 리얼아이피를 지정해주셔도 됩니다.

    2. 하단 웹서버 설정하기 (192.168.0.XXX)

    리버스프록시 서버에서 요청을 받고 응답하기 위해서는 하단의 웹서버(192.168.0.xxx)에도 nginx는 설치되어 있어야 합니다. 똑같은 /etc/nginx/sites-available 디렉토리내에 test.akal.co.kr 이라는 가상호스트에 대한 설정을 해줍니다.

    hostname-xxx.akal.co.kr 이라는 서버도 사용하시려면 마찬가지 해당서버에도 마찬가지 작업을 해주어야 합니다. 다른 도메인 서버도 마찬가지 입니다.

    일반적인 nginx 설정입니다. php7.0-fpm이 설정되어 있네요. 이 하단의 웹서버는 리버스 프록시 서버에서 요청한 내용을 듣고 nginx에서 응답을 합니다. 이로써 아주 간단하게 리버스 프록시 서버 설정이 끝났습니다. 너무 쉬웠나요 ?

    기본적인 내용이라 추가되지 않았었는데 혹시 해서 다시 추가합니다.

    nginx는 /etc/nginx/sites-available 에 파일을 작성하고 /etc/nginx/sites-enabled 에서 심볼릭 링크를 걸어두면 실제 nginx 에서는 siteds-enabled 디렉토리에서 include를 하기 때문에 반드시 sites-enabled에 심볼릭 링크를 걸어야 합니다.

    3. 동작여부 확인하기

    동작여부 확인은 너무 쉽습니다. nginx에서 설정한 홈디렉토리에 index.html 혹은 다른 여타 html 파일이나 php 파일을 만들어 놓고 웹브라우저에서 URL 도메인을 쳐보시고 제대로 작동하는지만 확인하시면 확인은 끝입니다.

    언제라고 확답은 못하겠지만 Upstream을 이용한 로드밸런싱이나 SSL과 캐쉬 사용등도 더 열심히 공부해서 추후에 다뤄보겠습니다.

    Posted by beumbae