본문 바로가기
개발

Apache Reverse Proxy(Apache - Tomcat 연동)

by 고양이양말 2023. 6. 2.

* 현재 환경 : https://example.com 도메인으로 모두 SSL이 적용되어 있는 상태

- Apache(https://example.com:443) : 홈페이지(html)

- Tomcat(https://example.com:8443/adm) : 관리자(spring)

- Spring Boot(https://example.com:5054) : 홈페이지에서 호출하는 API

 

* 목표

1. https://example.com 접속시에는  홈페이지 화면 

2. 관리자 접속시에는 https://example.com:8443/adm 으로 접근하는 것이 아니라 https://example.com/adm 으로 접근

3. API 호출 시 https://example.com:5054 로  호출하는 것이 아니라 https://example.com/api 로 호출

 

* 환경 설정 수정

/etc/httpd/conf/httpd.conf

...
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_http_module modules/mod_proxy_http.so
...
Include conf/extra/httpd-vhosts.conf
...

/etc/httpd/conf/extra/httpd-vhosts.conf (없으면 생성)

<VirtualHost *:443>
#
#       ServerName example.com
#
## 포워드 Proxy 경우 On Reverse Proxy Off
        ProxyRequests Off
#
## HTTP 호스트가 받은 HTTP 요청을 Proxy 요청시 사용 Reverse 경우 On으로 해야함
        ProxyPreserveHost On
#
#       <Proxy *>
#               Order deny,allow
#   Allow from all
#       </Proxy>
#
## Proxy에 연결할 URL 기술 ServerHost:localhost -> Apache -> ProxyPass URL
##        ProxyPass /api https://example.com:5054
#       ProxyPass / https://example.com:8443/
#
## <ProxyPassReverse>
## 1 WAS 가 redirect HTTP 응답을 보냈을 경우 Location, Content-Location HTTP 헤더를 수정
## 2 클라이언트에 전달한다. 러비스 프락시가 이 헤더를 수정하지 않으면
## 3 클라이언트는 redirect 시 제대로 연결할 수 없으므로 꼭 설정해야 한다.
#
##        ProxyPassReverse /api https://example.com:5054
#       ProxyPassReverse / https://example.com:8443/
#    <Location />
#        Order allow,deny
#        Allow from all
#    </Location>


        # 로드밸런싱 - 경로 분기
       <Location /adm>
               ProxyPass https://example.com:8443/adm/
               ProxyPassReverse https://example.com:8443/adm/
       </Location>

       <Location /api>
               ProxyPass https://example.com:5054
               ProxyPassReverse https://example.com:5054
       </Location>

        # SSL
       SSLProxyEngine on
       SSLEngine on
       SSLProxyVerify none
       SSLProxyCheckPeerCN off
       SSLProxyCheckPeerName off
       SSLProxyCheckPeerExpire off

       SSLCertificateFile "[SSL 인증서 경로]/STAR.example.com.crt"
       SSLCertificateKeyFile "[SSL 인증서 경로]/STAR.example.com.key"
       SSLCACertificateFile "[SSL 인증서 경로]/chainca.crt"

       RequestHeader set X-Forwarded-Proto "https"
       RequestHeader set X-Forwarded-Port "443"

</VirtualHost>

 

tip 1) Apache에 홈페이지가 없이 root로 관리자에 연결하고 싶을땐

<Location> 대신 "ProxyPass / https://example.com:8443/", "ProxyPassReverse / https://example.com:8443/"을 사용하면 

https://example.com 접근시 https://example.com:8443 의 화면이 바로 노출된다.

 

tip 2) https://example.com/adm 에서 화면 이동 시 https://example.com/login.do 처럼 url의 prefix가 없어져서 화면을 찾지 못한다. Tomcat을 ROOT.war가 아닌 adm.war로 올려야 한다. 

 

tip 3) SSL이 적용되어 있지 않으면 VirtualHost의 443은 80으로 바꾸고 하단의 SSL 부분은 모두 제거하면 될 것 같다.

 

'개발' 카테고리의 다른 글

ios safari에서 history.back 시 화면 reload  (0) 2023.03.28
국내 테두리 웹 지도 그리기  (0) 2023.03.17
안드로이드 aab google 업로드 오류  (0) 2023.02.08
git Invalid username or password  (0) 2023.01.11
tomcat manager 설정  (0) 2023.01.04