IT/잡다구리

[Linux] 아파치(80포트) 에서 톰캣(다른 포트) 으로 Proxypass, ReverseProxy

월공 2022. 4. 22. 13:49
728x90
300x250

환경 : Linux, CentOS7 , Apache, Tomcat 2개

하나의 서버에 다중 톰캣 세팅 되어있는 상황 편의상 톰캣1, 톰캣2로 칭하겠음 포트는 각각 다름 (30000,30001)

 

문제 : 각각 다른 톰캣에 , 각 다른 도메인을 연결해야한다.

예전에 작성한 아래 게시물의 도메인 연결 부분에 firewall 방화벽 조정으로 80 포트로 들어오는건 무조건 8080 로 포트포워딩 시켜버려서 해결을 했었으나 톰캣을 2개 이상 쓰면서 얘기는 달라졌다.

https://bug41.tistory.com/165?category=954110

 

예시)

톰캣 1 = site1.com

톰캣 2 = site2.com

톰캣이 다르니 그냥 뒤에 포트번호만 맞게 쳐주면 알아서 잘 들어가짐 (site1.com:3000 , site2.com:30001)

근데 저렇게 서비스하는 사이트가 어딨나?

 

결론은 , 포트번호 굳이 치지않아도 각 도메인 딱 치면 , 각 맞는 톰캣의 포트에 딱 들어가야한다.

 

처음에 톰캣한정으로만 redirect 를 어떻게 해야하나, 기존에 redirect 가 https 로 보내주고있는데 저걸 어떻게 해야하나 고민하다가 , 아파치를 같이 써서 해결하면 편하겠다는 생각이 들어서 그대로 이행해봤는데 성공했다.

 

브라우저에서 웹 도메인을치고 들어가는 기본포트가 80 인점을 이용하였다.

내가 서비스할 서버에서도 site1.com 을 딱 치면 기본포트로 무조건 아파치의 80 을 향하고있다.

아파치의 httpd.conf 에서 proxypass 를 아래와 같이 추가해주면 되겠다.

 

아파치 httpd.conf

<VirtualHost *:80>        
    #DocumentRoot /var/www/html
    ServerAdmin test@test.com
    ServerName site1.com
    ServerAlias site1.com
    ServerAlias www.site1.com

    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass / http://www.site1.com:30000/
    ProxyPassReverse / http://www.site1.com:30000/
</VirtualHost>

<VirtualHost *:80>        
    #DocumentRoot /var/www/html
    ServerAdmin test@test.com
    ServerName site2.com
    ServerAlias site2.com
    ServerAlias www.site2.com

    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass / http://www.site2.com:30001/
    ProxyPassReverse / http://www.site2.com:30001/
</VirtualHost>

 

당연히 톰캣쪽에서도 포트에 맞게 설정이 되어있어야한다. (톰캣2 server.xml 은 생략)

 

톰캣1 server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />  
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Connector port="30000"
        protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

    <Host name="site1.com" appBase="/home/httpd/site1" unpackWARs="true" autoDeploy="true" >
        <Alias>www.site1.com</Alias>
        <Alias>site1.com</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />        
    </Host>


    </Engine>
  </Service>
</Server>

 

이렇게 해주면 site1.com 에 접속해도 80 포트를 타고 바로 30000포트로 보내주는식이 되기때문에 굳이 도메인 뒤에 포트를 붙여주지않아도 접속 잘되는걸 확인할수있다.

728x90
300x250