nginx 와 apache tomcat 연동하기
가장 많이 사용하는 Java 기반 WAS 인 아파치 톰캣을 nginx 와 연동해 보겠습니다.
연동 방식
tomcat 은 AJP Connector 라는 전용 프로토콜로 연동을 지원하며 전용이다 보니 속도가 매우 빠르지만 다음과 같은 문제가 있습니다.
- apache httpd 전용이며 별도의 모듈(mod_jk) 설치 필요
- nginx 나 Caddy 같은 차세대 웹 서버와 사용할 수 없음
- C 로 작성된 모듈이므로 OS 가 변경되면 새로 컴파일 및 설치 필요합니다. 이로 인해 docker 같은 container 를 사용할 경우 문제가 될 수 있습니다.
- reverse proxy 방식에 비해서 설정이 까다로움
이때문에 최근에는 AJP Connector 를 사용하지 않고 HTTP Connector 를 Reverse proxy 방식으로 연동해서 사용하며 본 예제에서도 Reverse proxy 방식으로 연동합니다.
tomcat 설치
tomcat 9 다운로드
wget https://mirror.navercorp.com/apache/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.zip
unzip 으로 압축 해제
unzip apache-tomcat*zip
tomcat proxy 설정
tomcat 이 nginx 나 apache httpd 같은 Proxy Server 뒤에서 동작하려면 프락시 설정을 해주어야 합니다.
이를 제대로 설정하지 않으면 web application 이 다음 메서드를 호출할 때 오작동하게 됩니다.
ServletRequest.getServerName()
: Returns the host name of the server to which the request was sent.ServletRequest.getServerPort()
: Returns the port number of the server to which the request was sent.ServletRequest.getLocalName()
: Returns the host name of the Internet Protocol (IP) interface on which the request was received.ServletRequest.getLocalPort()
: Returns the Internet Protocol (IP) port number of the interface on which the request was received.
어떻게 동작하는지 확인하기 위해 다음 내용을 webapps/ROOT/test.jsp 로 저정하고 브라우저에서 호출해 봅시다.
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Proxy test</title>
</head>
<body>
<ol>
<li>getServerName: <b><%=request.getServerName() %></b></li>
<li>getServerPort: <b><%=request.getServerPort() %></b></li>
<li>getLocalName: <b><%=request.getLocalName() %></b></li>
<li>getLocalPort: <b><%=request.getLocalPort() %></b></li>
</ol>
</body>
</html>
의도와 달리 web server 의 IP 가 출력되며 localname 은 tomcat 이 구동되는 서버의 이름이 출력됩니다.
이 문제는 tomcat 에 proxy 관련 설정을 해주면 되며 톰캣은 이를 위해서 proxyName, proxyPort 라는 attribute 를 지원하므로 이 속성을 설정해주면 됩니다.
conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"·
proxyName="tomcat.lesstif.com" proxyPort="80"·
/>
웹 서비스는 80, 443 2개를 사용하는데 proxyPort 는 하나만 지정 가능하므로 문제가 될수 있습니다.
문제를 방지하려면 web server 에서 강제로 https 로 전환(force redirection to https) 하도록 설정하면 됩니다.
nginx 연동
SELinux 설정
port Context 에 Tomcat 의 HTTP Connector port 추가 필요.
semanage port -a -p tcp -t http_port_t 8080