CentOS 7의 tomcat에서 실행되는 웹앱에 포트를 열고 직접 액세스하려면 어떻게 해야 합니까? Tomcat은 Apache httpd 역방향 프록시 뒤에서 실행 중이지만 테스트 목적으로 각 앱을 직접 노출하는 포트를 열어 tomcat에서 실행 중인 앱에 직접 액세스하고 싶습니다.
firewall-cmd --add-port=8080/tcp
and 를 사용하여 방화벽에서 포트 8080 및 8081을 열면 or , 또는 또는 를 firewall-cmd --add-port=8081/tcp
입력하면 해당 포트에서 실행 중인 앱에 액세스할 수 있습니다 . 해당 앱은 httpd를 통해 액세스할 때도 액세스할 수 있습니다. server.ip.addr:8080
server.ip.addr:8081
anydomainontheserver.com:8080
anydomainontheserver.com:8081
그러나 포트 8082, 8083 및 8084에서 실행되는 앱에 직접 액세스하려고 하면 응답으로 404 오류가 발생합니다. 포트 8082 및 8083에서 실행되는 앱이 해당 도메인 이름을 통해 httpd를 통해 100% 액세스 가능한 경우에도 마찬가지입니다. 포트 8084에서 실행되는 앱은 대부분 도메인 이름을 통해 httpd를 통해 액세스할 수 있습니다. 각각의 경우에 입력하고 및 를 firewall-cmd --add-port=808x
통해 앱에 액세스하려고 시도했지만 각 경우에 404 오류가 발생했습니다. 방화벽에서 ajp 포트에 대한 포트를 열고 브라우저 에 입력을 시도했지만 오류 번호를 지정하지 않으면 페이지를 검색할 수 없다는 브라우저 오류 메시지가 표시되었습니다.server.ip.addr:808x
anydomainontheserver.com:808x
server.ip.addr:80xx
anydomainontheserver.com:80xx
그렇다면 테스트 목적으로 Tomcat을 통해 포트 8082, 8083 및 8084에서 실행되는 앱에 직접 액세스하려면 어떻게 해야 합니까?
입력하면 firewall-cmd --list-all
다음이 제공됩니다.
public (default, active)
interfaces: enp3s0
sources:
services: dhcpv6-client http imaps openvpn smtp ssh
ports: 8009/tcp 8083/tcp 8011/tcp 8084/tcp 8010/tcp 8080/tcp 8081/tcp 8013/tcp 8012/tcp 8082/tcp
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
입력하면 nano /etc/httpd/conf.d/virtualhosts.conf
다음이 제공됩니다.
<VirtualHost *:443>
ServerName www.vpndomain.com
ServerAlias vpndomain.com
ErrorLog /var/log/httpd/vpndomain_com_error.log
CustomLog /var/log/httpd/vpndomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ProxyPass / ajp://server.ip.addr:8009/
ProxyPassReverse / ajp://server.ip.addr:8009/
</VirtualHost>
Listen 444
<VirtualHost *:444>
ServerName www.vpndomain.com
ServerAlias vpndomain.com
ErrorLog /var/log/httpd/vpndomain_com_error.log
CustomLog /var/log/httpd/vpndomain_com_requests.log combined
SSLEngine on
SSLProxyEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ProxyPass / ajp://server.ip.addr:8010/
ProxyPassReverse / ajp://server.ip.addr:8010/
</VirtualHost>
<VirtualHost www.domain1.com:80>
ServerName www.domain1.com
ServerAlias domain1.com
ErrorLog /var/log/httpd/domain1_com_error.log
CustomLog /var/log/httpd/domain1_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8011/
ProxyPassReverse / ajp://server.ip.addr:8011/
</VirtualHost>
<VirtualHost www.domain2.com:80>
ServerName www.domain2.com
ServerAlias domain2.com
ErrorLog /var/log/httpd/domain2_com_error.log
CustomLog /var/log/httpd/domain2_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8012/
ProxyPassReverse / ajp://server.ip.addr:8012/
</VirtualHost>
<VirtualHost www.domain3.com:80>
ServerName www.domain3.com
ServerAlias domain3.com
ErrorLog /var/log/httpd/domain3_com_error.log
CustomLog /var/log/httpd/domain3_com_requests.log combined
ProxyPass / ajp://server.ip.addr:8013
ProxyPassReverse / ajp://server.ip.addr:8013
</VirtualHost>
`nano /opt/tomcat/conf/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="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" 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="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="ermapp_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Upload">
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps_upload" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="uploadapp_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="Public">
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" />
<Connector port="8011" protocol="AJP/1.3" redirectPort="8445" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain1.com" appBase="webapps_public" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain1_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="domain2">
<Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8446" />
<Connector port="8012" protocol="AJP/1.3" redirectPort="8446" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain2.com" appBase="webapps_domain2" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
<Service name="domain3">
<Connector port="8084" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8447" />
<Connector port="8013" protocol="AJP/1.3" redirectPort="8447" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="domain3.com" appBase="webapps_domain3" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="domain3_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
답변1
httpd 프록시는 AJP 포트를 사용하고 있지만 직접 액세스하려고 하면 HTTP 포트를 사용하게 됩니다.
HTTP 포트를 사용하기 위해 httpd 프록시를 전환하려고 하면 여전히 작동합니까, 아니면 404가 발생합니까?
프록시가 HTTP를 사용할 때 httpd를 통해 404를 얻는다면 Tomcat의 HTTP 커넥터에 문제가 있는 것입니다.
프록시가 HTTP 포트를 사용할 때 여전히 httpd를 통해 작동한다면 문제는 앱 자체 내부에 있을 가능성이 높습니다.
답변2
목표를 달성하는 더 안전한 방법은 SSH 터널링을 이용하는 것입니다. Tomcat이나 프록시에는 구성이 변경되지 않습니다. 클라이언트와 Tomcat 서버 사이에 SSH 터널을 생성한 다음 마치 이러한 앱이 로컬 클라이언트 시스템에서 실행되는 것처럼 로컬로 포트에 액세스하면 됩니다. 포트 TCP 8082, 8083 및 8084에서 Tomcat을 수신하는 세 가지 서비스가 있습니다. 따라서 세 개의 SSH 터널을 만듭니다. Tomcat IP 주소가 10.10.10.254이고 사용자가 bob이라고 가정합니다.
클라이언트 시스템에서 다음과 같이 세 개의 SSH 터널을 만듭니다.
$ ssh -fnN -L 8082:localhost:8082 [email protected]
$ ssh -fnN -L 8083:localhost:8083 [email protected]
$ ssh -fnN -L 8084:localhost:8084 [email protected]
세 가지 앱이 웹 앱이라고 가정하고 클라이언트 컴퓨터에서 웹 브라우저를 열고 다음으로 이동합니다.
http://localhost:8082
http://localhost:8083
http://localhost:8084