가장 많이 사용하는 Java 기반 WAS 인 아파치 톰캣을 nginx 와 연동해 보겠습니다.


연동 방식

tomcat 은 AJP Connector 라는 전용 프로토콜로 연동을 지원하며 전용이다 보니 속도가 매우 빠르지만 다음과 같은 문제가 있습니다.

  1. apache httpd 전용이며 별도의 모듈(mod_jk) 설치 필요
  2. nginx 나 Caddy 같은 차세대 웹 서버와 사용할 수 없음
  3. C 로 작성된 모듈이므로 OS 가 변경되면 새로 컴파일 및 설치 필요합니다. 이로 인해 docker 같은 container 를 사용할 경우 문제가 될 수 있습니다.
  4. 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



Ref