- Tomcat - Apache 를 Reverse Proxy로 URL 연동하고,
- Let’s Encrypt로 무료 인증서를 발급 받아 SSL 적용하기.
사내 데모서버 구축간에 작성한 내용으로, 자세한 설정이나 DNS는 'company'등의 값으로 대체하였습니다.
Windows 탐색기는 Window앱 설치 버전, NoAgent는 웹브라우저 버전 서비스를 의미하며, 각각 Tomcat에 다른 Port로 서비스 되고 있다는 점만 알고 이해하시면 됩니다.
mod_jk와 mod_proxy 방식의 차이 → 결론: 아파치2.4부터는 성능 비슷, 간편한 mod_proxy.
❓ HTTPS를 사용하기 위해서 각각의 Tomcat에 인증서를 발급/적용 하지 않고, Proxy Server 역할의 Apache를 구성하여 Tomcat과 Apache서버를 연동 후 Apahce에만 SSL를 적용하려 합니다. 웹서버로써의 역할은 고려하지 않았습니다.서비스 할 IP/DNS : 192.168.11.3 (demo.company.co.kr)
서비스 할 Port : 윈도우탐색기:80 , noAgent:82
서비스 톰캣 port : 윈도우탐색기:8080 , noAgent:8282
...
Define SRVROOT "D:/httpd/Apache24"
...
# 80과 82포트 등록
Listen 80
Listen 82
...
# 아래의 .so 라이브러리들은 사용을 위해 주석('#')제거해 준다.
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_http_module modules/mod_proxy_http.so
...
ServerName demo.company.co.kr:80
...
# 아래 Include 주석 해제
Include conf/extra/httpd-vhosts.conf
D:\httpd\Apache24\conf\extra\httpd-vhosts.conf 를 편집합니다.
"3."에서 Include conf/extra/httpd-vhosts.conf를 이용해 사용됩니다.
<VirtualHost *:80>
ServerName demo.company.co.kr
ProxyRequests off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
ProxyPass / http://demo.company.co.kr:8080/
ProxyPassReverse / http://demo.company.co.kr:8080/
</VirtualHost>
<VirtualHost *:82>
ServerName demo.company.co.kr
ServerAlias www.demo.company.co.kr
ProxyRequests off
ProxyPreserveHost On
ProxyPass / http://demo.company.co.kr:8282/
ProxyPassReverse / http://demo.company.co.kr:8282/
</VirtualHost>
win-acme 사용을 위해 .NET Framework 4.6.1 이상 업데이트가 필요함.
❓ Proxy Server인 Apache에 인증서를 적용하고, https:// 로 리다이렉트 되도록 설정하기.
무료인 Let’s Encrypt를 사용하고, 이를 발급/자동갱신 하기 위해 win-acme를 설치합니다.
Let’s Encrypt 인증서 발급 및 자동 적용을 위한 win-acme 설치/사용법
https://jimnong.tistory.com/845 ← 조금 지난 버전이라 순서, 사용법이 약간 다름.
로컬에 인증서 경로를 생성할 때, httpd 어디에 할 지 미리 판단하여 설정해 주어야 자동 갱신을 알아서 할 때 문제가 없을것 같습니다. htdocs 경로에는 두지 말기
...
Listen 80
Listen 82
# 443 추가
Listen 443
...
# 아래 모듈의 주석을 해제하여 Load한다.
LoadModule ssl_module modules/mod_ssl.so
...
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
LoadModule headers_module modules/mod_headers.so
...
# 80 (http)으로 접근시, https://demo...로 Redirect 함
<VirtualHost *:80>
ServerName demo.company.co.kr
Redirect 301 / https://demo.company.co.kr
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
</VirtualHost>
# 80에서 Redirect 되었거나, https://demo...kr/ 인 경우.
<VirtualHost *:443>
ServerName demo.company.co.kr:443
ServerAlias demo.company.co.kr:443
ProxyRequests Off
ProxyPreserveHost On
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLCertificateFile "D:/httpd/demo.company.co.kr-chain.pem"
SSLCertificateKeyFile "D:/httpd/demo.company.co.kr-key.pem"
# Tomcat에게 명시적으로
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass / http://demo.company.co.kr:8080/
ProxyPassReverse / http://demo.company.co.kr:8080/
</VirtualHost>
# No Agent용 Tomcat
<VirtualHost *:82>
ServerName https://demo.company.co.kr:82
ServerAlias https://demo.company.co.kr:82
ProxyRequests Off
ProxyPreserveHost On
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLCertificateFile "D:/httpd/demo.company.co.kr-chain.pem"
SSLCertificateKeyFile "D:/httpd/demo.company.co.kr-key.pem"
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "82"
ProxyPass / http://demo.company.co.kr:8282/
ProxyPassReverse / http://demo.company.co.kr:8282/
</VirtualHost>
...
<Service>
<Connector port="8080" protocol="HTTP/1.1" scheme="https"
connectionTimeout="20000" URIEncoding="UTF-8"
redirectPort="8443" />
...
실행 순서
테스트
No Agent
Windows 탐색기