티스토리 뷰

- 아래는 Apache + IIS 를 혼용하여 사용하는 경우의 특정 케이스에 대한 처리 내용이며 Proxy 에 대한 내용을 담고 있으며 여타 사이트들의 정보들을 나름의 방식으로 이해하기 위해 재정리 한 부분입니다.

- 제목에 명시된 내용에 대한 해결 방법은 Reverse Proxy 를 사용한 방법입니다.

- Proxy
    ○ 서버와 클라이언트 사이에 존재하며 사용자가 어떤 요청을 하였을 때 해당 Proxy 를 통하여
    응답을 내려받게 된다. Proxy 를 통한 데이터들은 캐싱이 되므로 저장된 데이터일 경우 요청된 원격지 서버까지 갈 필요가 없으므로 응답 시간이 절약되며 불필요한 통신을 하지 않기 때문에 그로인해 외부와의 트래픽 감소, 네트워크 병목현상을 방지하는 효과를 얻을 수 있다.

- Reverse Proxy
    ○ 사용자가 example.domain.co.kr 을 호출하게 되면 Reverse Proxy 가 이 요청을 받아 설정된 Proxy 주소로 요청, 처리 후 사용자쪽으로 전달하는 구조를 말한다.
    이러한 처리 구조를 갖게 된 가장 큰 이유는 보안 때문이다.
    example.domain.co.kr 서비스를 Reverse Proxy 없이 WAS 를 최앞단에 놓고 서비스 할 경우
    WAS 가 뚫리게 되면 보통 DB 서버가 함께 연결되어 있는 Java 서비스 환경 구조상 한순간 모든 정보가 노출될 수 있다.
    그렇기 떄문에 보안을 위해 실제 서비스는 내부망에 위치 시킨 후, Proxy 에 의해 허용된 Port 를 통해 해당 서비스와 통신하여 처리하는 Reverse Proxy 방식이 사용된다.
    리눅스 환경에서는 SELinux 의 정책으로 인해 웹 서버를 허용된 톰캣 포트에만 접근 (8080, 8009) 시킬 수 있으므로 웹 서버가 해킹 당해도 톰캣 서버까지는 연결이 불가능하다.

    Reverse Proxy 환경에서는 WAS 에서 Remote Addr 을 조회하여도 Reverse Proxy  IP 를 얻게 되므로 Client IP 를 얻기 위해서는 X-Forward-For (XFF) Http Header 를 참고해야 한다.

    Reverse Proxy 역시 캐싱이 가능하며, 로드밸런싱도 수행가능하다. 또한 Server 의 역할을 하기 때문에 Server Side Proxy 기법이라고도 한다.

- Forward Proxy
    ○ 사용자가 example.domain.co.kr 을 호출하게 되면 Forward Proxy 가 이 요청을 받아
    example.domain.co.kr 에 연결하여 그 결과를 사용자에게 전달한다. 
    보통 Forward Proxy 의 경우에는 캐싱 기능이 있으므로 요청 데이터가 캐싱되어있을 경우
    example.domain.co.kr 로 재요청하지 않고 저장된 데이터를 바로 응답을 해줄 수 있기에 
    빠른 처리 시간과 함께 불필요한 네트워크 요청이 줄어 들게 되는 이점이 있다. 
    (Proxy 의 역할 그 자체인듯…?)

- 처리 케이스
    ○ 현재 서버 및 애플리케이션 구성
        § IIS 에 80 포트로 3개의 도메인에 대한 서비스가 존재 (ASP 언어)
            § a.domain.co.kr
            § b.domain.co.kr
            § c.domain.co.kr

    ○ 신규 애플리케이션 및 구성 환경
        § a.domain.co.kr 에 대한 애플리케이션이 기존 IIS 에서 Apache 로 변경 (+JAVA 언어)
        § a.domain.co.kr 에 대한 context 가 별도 존재하며 context 별 war 가 별도로 존재
            § / -> front
            § /api -> api 관련
            § /admin -> admin 관련

    ○ 특이사항
        § b.domain.co.kr, c.domain.co.kr 은 IIS 의 80 포트
        § a.domain.co.kr 은 Apache 의 80 포트
        § a.domain.co.kr 의 3개 context 는 모두 80 포트로 처리 되어야 함
        § a.domain.co.kr 은 Tomcat 사용 8080 으로 서비스되었다고 가정

- 처리 방법
    ○ 아래 내용은 동일 IP & 도메인 기반의 처리 방법
    ○ IIS 포트 변경
        § b.domain.co.kr -> 9091
        § c.domain.co.kr -> 9092

    ○ Apache 설치
        § 설치형 or Binary 형태로 Apache Web Server 설치
            § 아래는 Apache 2.2 버전 기준으로 설명

        § /conf/httpd.conf 수정
            § 경로 변경
                ® ServerRoot "Apache설치경로/Apache2"
                ® DocumentRoot "Apache설치경로/Apache2/htdocs"
                ® Directory "Apache설치경로/Apache2/htdocs" -- root directory
                ® Script Alias /cgi-bin/ "Apache설치경로/Apache2/cgi-bin"
                ® Directory "Apache설치경로/Apache2/cgi-bin" -- cgi directory
            § Proxy 관련 모듈 사용설정
                ® 아래 명시된 모듈들의 주석을 해제하여 사용토록 한다.
                    ◊ mod_proxy.so
                    ◊ mod_proxy_http.so
                    ◊ mod_proxy_ajp.so
                    ◊ mod_proxy_balancer.so
            § VirtualHost Conf 파일 Include (주석해제)
                ® # Virtual hosts
                Include conf/extra/httpd-vhosts.conf

        § /extra/httpd-vhosts.conf 수정

            #Apache 2.4 이후부터는 명시하지 않아도 되지만 그 이하 버전에서는 꼭 명시
            NameVirtualHost *:80

            #b.domain.co.kr 요청에 대한 처리
            <VirtualHost *:80>
                ProxyPreserveHost On
                   ServerName domainB
                ServerAlias b.domain.co.kr
                ProxyPass / http://b.domain.co.kr:9091/
                ProxyPassReverse / http://b.domain.co.kr:9091/
            </VirtualHost>

            #c.domain.co.kr 요청에 대한 처리
            <VirtualHost *:80>
                ProxyPreserveHost On
                ServerName domainC
                ServerAlias c.domain.co.kr
                ProxyPass / http://c.domain.co.kr:9092/
                ProxyPassReverse / http://c.domain.co.kr:9092/
            </VirtualHost>

            #a.domain.co.kr 요청에 대한 처리
            <VirtualHost *:80>
                ProxyPreserveHost On
                ServerName domainA
                ServerAlias a.domain.co.kr

                #127.0.0.1 은 domain host 가 설정되어 있다면 b, c 도메인처럼 domain 으로 명시 가능
                #ProxyPass /api http://a.domain.co.kr:8080/api
                #ProxyPassReverse /api http://a.domain.co.kr:8080/api

                ProxyPass /api http://127.0.0.1:8080/api
                ProxyPassReverse /api http://127.0.0.1:8080/api

                ProxyPass /admin http://127.0.0.1:8080/admin
                ProxyPassReverse /admin http://127.0.0.1:8080/admin

                ProxyPass / http://127.0.0.1:8080/
                ProxyPassReverse / http://127.0.0.1:8080/
            </VirtualHost>


    ○ ProxyPass 와 ProxyPassReverse 의 차이
        § 도메인: http://entrance.domain.co.kr
        § httpd-vhosts.conf 설정
            § ProxyPass /api http://api.domain.co.kr/
            § ProxyPassReverse /api http://api.domain.co.kr/

        § 위와 같이 설정되어있다고 가정하였을 때
            § http://entrance.domain.co.kr/api/list/1 과 같이 호출을 한다면 내부적으로 Proxypass 에 의해
            http://api.domain.co.kr/list/1 
            로 변환되어 요청이 처리 될 것이다.
            이 때, 내부적인 처리로직에 의한 리다이렉트 등의 이유로
            http://api.domain.co.kr/list/1/something/happen 
            처럼 리턴이 될 경우, ProxyPassReverse 설정에 의해서
            http://entrance.domain.co.kr/api/list/1/something/happen
            으로 매칭이 되어 처리 된 후, Client 쪽 전달헤더에도 해당 주소가 전달 될 것이다.

            하지만, ProxyPassReverse 설정이 없다면 http://api.domain.co.kr/list/1/something/happen
            와 같이 리다이렉트 되는 순간 브라우저는 위의 URL 을 바라보게 되고
            이는 http://api.domain.co.kr 의 노출과 함께 정상적인 처리를 할 수 없게 (api.domain.co.kr 에 대한 바인딩이 없다면) 되는 상황이 발생 할 수 있다.
            그러므로 Reverse Proxy 를 사요할 경우 ProxyPass, ProxyPassReverse 를
            함께 사용하는 것을 권장한다고 한다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함