nginx – reverse proxy 설정

저는 내부망에 총 세대의 서버를 돌리고 있습니다. 실질적으로 메인 서버역할을 하는 윈도우 머신 안에 가상서버로 CentOS(리눅스)와 Xpenology(NAS)를 구동하고 있습니다. 원래는 CentOS 없이 NAS의 웹서버 기능을 통해 모든 것을 해결했는데, 얼마전 CentOS를 셋팅한 후 NAS와 웹서버의 역할을 분리시키기로 했습니다. 실질적으로 하나의 IP에 물려있는 내부 서버를 도메인별로 다르게 접속 할 수 있는 방법이 없는지 찾던 중 reverse proxy 라는 기능을 알게 되었습니다.

사용자가 a.com 에 대해 요청할 때, reverse proxy는 내부 서버(192.168.1.1)에서 데이터를 받아서 사용자에게 전달해 주는 방식입니다. 만약 사용자가 b.com 을 요청할 때 reverse proxy는 해당되는 내부 서버(192.168.1.2)에서 데이터를 받아서 전달해 주겠죠. 이런 구조라고 이해하시면 됩니다. 내부 서버가 직접 데이터를 전달해도 되는데 굳이 이렇게 한 단계 거르는 것은 보안상의 목적이 있기 때문이라 합니다. reverse proxy에 대한 보다 더 자세한 내용은 (저도 제대로 아는 것은 아니기에) 검색을 통해 얻으시길 바랍니다.

아무튼 이 원리를 이용하면, 외부에서 들어오는 접속 도메인에 따라 내부 서버와 연결을 달리해줄 수가 있습니다. 외부IP는 하나인데, 내부에서 웹서버(http:80)가 둘 이상일 경우에 이런식으로 이용하면 굉장히 유용하게 사용될 수 있는 겁니다.

우선 저는 외부에서 들어오는 80번 포트에 대해 CentOS 서버의 내부IP로 연결되도록 공유기상에서 포트포워딩 해놓았습니다. 즉, CentOS 서버가 reverse proxy 역할을 하게 되는 겁니다. 제가 구상해 놓은 내용은 이렇습니다.

nas.comty.kr 로 접속 할 경우 : Xpenology의 내부 IP인 192.168.1.1 로 연결

test.comty.kr 로 접속 할 경우 : CentOS의 내부 IP인 192.168.1.2 로 연결

과정은 매우 간단합니다. nginx의 설정 파일인 /etc/nginx/conf.d/default.conf 를 수정한 후 nginx를 재시작해주면 끝납니다.

*사실, /etc/nginx/ 안에 sites-enabled 디렉토리를 생성하여 그 안에 각 호스트(서버) 설정별 파일을 만들고 nginx 설정에서 이 디렉토리를 include 하는 것이 일반적인 설정법이긴 한데, 원리적으로는 둘 다 틀리지 않습니다. 설정이 다양하고 복잡해질수록 수월하게 관리하기 위해 나눠놓는 것이 더 현명한 방법이긴 합니다만…. 라이트한 사용자로서 귀찮음을 피하기 위해 일단 이게 되는지 확인하려고 진행했는데, 잘 되길래 그냥 두기로 했습니다. 훗날 설정이 복잡해지면 그 때 다시 정리하죠 뭐;;;;;;

vi 등의 편집기를 통해 /etc/nginx/conf.d/default.conf 파일을 열고, 기존의 server_name 설정 값에 test.comty.kr 를 추가합니다. 따로 내부 IP 설정을 하지 않는 것은, 기본적으로 외부에서 들어올 때 CentOS 서버가 열리기 때문입니다. test.comty.kr 는 CentOS의 기본 웹서버로 연결되므로 server_name 만 수정해 주면 됩니다.

1
2
3
4
5
server {
    listen       80;
    server_name  test.comty.kr localhost;
#...하단 생략...

그 다음에는, nas.comty.kr 내용을 추가할 겁니다. 파일 최하단에 아래를 참고하여 원하는 설정값대로 내용을 추가해 줍니다.

1
2
3
4
5
6
7
8
9
10
11
server {
        listen 80;
        server_name nas.comty.kr;
        location / {
                proxy_redirect  off;
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Scheme $scheme;
                proxy_pass http://192.168.1.2/;
        }
}

server_name 이 nas.comty.kr 로 되어 있습니다. 사용자가 nas.comty.kr 도메인으로 접속을 하면, nginx에서 192.168.1.2 의 데이터를 받아서 사용자에게 보내주도록 설정된 것입니다. server_nameproxy_pass 의 내부 서버 IP를 상황에 맞도록 내용을 추가해 줍니다.

마치셨으면 저장 후, service nginx reload 명령으로 nginx 를 재시작해 줍니다. 짠! 끝났습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Comment moderation is enabled. Your comment may take some time to appear.