Wie kann ich einen Port öffnen und direkt auf eine Webanwendung zugreifen, die auf Tomcat unter CentOS 7 ausgeführt wird? Tomcat läuft hinter einem Apache-HTTPD-Reverse-Proxy, aber ich möchte direkt auf die in Tomcat laufenden Apps zugreifen, indem ich einen Port öffne, um jede App zu Testzwecken direkt verfügbar zu machen.
firewall-cmd --add-port=8080/tcp
Wenn ich in Firewalld die Ports 8080 und 8081 mit und öffne firewall-cmd --add-port=8081/tcp
, kann ich auf die auf diesen Ports laufenden Apps zugreifen, wenn ich server.ip.addr:8080
oder server.ip.addr:8081
, oder anydomainontheserver.com:8080
oder eingebe anydomainontheserver.com:8081
. Auf diese Apps kann auch zugegriffen werden, wenn ich über httpd zugreife.
Wenn ich jedoch versuche, direkt auf die Apps zuzugreifen, die auf den Ports 8082, 8083 und 8084 laufen, erhalte ich als Antwort 404-Fehler. Dies ist der Fall, obwohl die Apps, die auf den Ports 8082 und 8083 laufen, zu 100 % über httpd über ihre Domänennamen erreichbar sind. Und die App, die auf Port 8084 läuft, ist größtenteils über httpd über ihren Domänennamen erreichbar. In jedem Fall habe ich und eingegeben firewall-cmd --add-port=808x
und versucht, auf die Apps über zuzugreifen server.ip.addr:808x
, anydomainontheserver.com:808x
habe aber jedes Mal 404-Fehler erhalten. Ich habe sogar versucht, Ports für ihre AJP-Ports in Firewalld zu öffnen und server.ip.addr:80xx
und anydomainontheserver.com:80xx
in den Browser einzugeben, habe aber eine Browserfehlermeldung erhalten, die besagt, dass die Seiten nicht abgerufen werden können, ohne die Fehlernummer anzugeben.
Wie kann ich also zu Testzwecken direkt über Tomcat auf die Apps zugreifen, die auf den Ports 8082, 8083 und 8084 laufen?
Durch Eintippen firewall-cmd --list-all
erhält man:
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:
Durch Eintippen nano /etc/httpd/conf.d/virtualhosts.conf
erhält man:
<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>
Und wenn Sie `nano /opt/tomcat/conf/server.xml eingeben, erhalten Sie:
<?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>
Antwort1
Ihr httpd-Proxy verwendet die AJP-Ports, aber wenn Sie versuchen, direkt darauf zuzugreifen, verwenden Sie die HTTP-Ports.
Wenn Sie versuchen, den HTTPD-Proxy so umzustellen, dass er den HTTP-Port verwendet, funktioniert es dann immer noch oder erhalten Sie die 404-Meldung?
Wenn Sie über httpd die Fehlermeldung 404 erhalten, während der Proxy HTTP verwendet, liegt ein Problem mit Ihrem HTTP-Connector in Tomcat vor.
Wenn es über httpd immer noch funktioniert, während der Proxy den HTTP-Port verwendet, liegt das Problem wahrscheinlich intern bei der App selbst.
Antwort2
Eine sicherere Möglichkeit, Ihr Ziel zu erreichen, ist SSH-Tunneling. Es werden keine Konfigurationsänderungen an Tomcat oder Proxy vorgenommen. Erstellen Sie einfach einen oder mehrere SSH-Tunnel zwischen Ihrem Client und dem Tomcat-Server und greifen Sie dann lokal auf die Ports zu, als ob diese Apps auf Ihrem lokalen Client-Rechner laufen würden. Sie haben drei Dienste, die auf Tomcat auf den TCP-Ports 8082, 8083 und 8084 lauschen. Erstellen Sie daher drei SSH-Tunnel. Nehmen wir an, die IP-Adresse von Tomcat ist 10.10.10.254 und der Benutzer ist Bob
Erstellen Sie vom Client-Rechner aus drei SSH-Tunnel wie folgt:
$ ssh -fnN -L 8082:localhost:8082 [email protected]
$ ssh -fnN -L 8083:localhost:8083 [email protected]
$ ssh -fnN -L 8084:localhost:8084 [email protected]
Angenommen, es handelt sich bei den drei Apps um Web-Apps, öffnen Sie Ihren Webbrowser auf dem Client-Computer und navigieren Sie zu:
http://localhost:8082
http://localhost:8083
http://localhost:8084