¿Cómo puedo abrir un puerto y acceder directamente a una aplicación web que se ejecuta en Tomcat en CentOS 7? Tomcat se ejecuta detrás de un proxy inverso httpd de Apache, pero quiero acceder directamente a las aplicaciones que se ejecutan en Tomcat abriendo un puerto para exponer directamente cada aplicación con fines de prueba.
Cuando abro los puertos 8080 y 8081 en firewalld usando firewall-cmd --add-port=8080/tcp
y firewall-cmd --add-port=8081/tcp
, puedo acceder a las aplicaciones que se ejecutan en esos puertos cuando escribo server.ip.addr:8080
o server.ip.addr:8081
, o anydomainontheserver.com:8080
o anydomainontheserver.com:8081
. También se puede acceder a esas aplicaciones cuando accedo a ellas a través de httpd.
Sin embargo, cuando intento acceder directamente a las aplicaciones que se ejecutan en los puertos 8082, 8083 y 8084, obtengo errores 404 en respuesta. Este es el caso a pesar de que las aplicaciones que se ejecutan en los puertos 8082 y 8083 son 100% accesibles a través de httpd a través de sus nombres de dominio. Y la aplicación que se ejecuta en el puerto 8084 es accesible principalmente a través de httpd a través de su nombre de dominio. En cada caso, escribí firewall-cmd --add-port=808x
e intenté acceder a las aplicaciones a través de server.ip.addr:808x
y anydomainontheserver.com:808x
, pero obtuve errores 404 en cada caso. Incluso intenté abrir puertos para sus puertos ajp en firewalld y escribir server.ip.addr:80xx
y anydomainontheserver.com:80xx
en el navegador, pero recibí un mensaje de error del navegador que decía que las páginas no se podían recuperar sin especificar el número de error.
Entonces, ¿cómo puedo acceder a las aplicaciones que se ejecutan en los puertos 8082, 8083 y 8084 directamente a través de Tomcat para realizar pruebas?
Al escribir firewall-cmd --list-all
se obtiene:
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:
Al escribir nano /etc/httpd/conf.d/virtualhosts.conf
se obtiene:
<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>
Y al escribir `nano /opt/tomcat/conf/server.xml se obtiene:
<?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>
Respuesta1
Su proxy httpd utiliza los puertos AJP, pero cuando intenta acceder a ellos directamente, utiliza los puertos HTTP.
Si intenta cambiar el proxy httpd para usar el puerto HTTP, ¿aún funciona o obtiene el 404?
Si obtiene el 404 a través de httpd cuando el proxy usa HTTP, entonces hay un problema en su conector HTTP en Tomcat.
Si todavía funciona a través de httpd cuando el proxy usa el puerto HTTP, entonces el problema probablemente sea interno a la aplicación misma.
Respuesta2
Una forma más segura de lograr su objetivo es a través de túneles SSH. No se realizarán cambios de configuración en Tomcat o proxy. Simplemente cree un túnel SSH entre su cliente y el servidor Tomcat, luego acceda a los puertos localmente como si estas aplicaciones se estuvieran ejecutando en su máquina cliente local. Tiene tres servicios escuchando en Tomcat en los puertos TCP 8082, 8083 y 8084. Para ello, cree tres túneles SSH. Supongamos que la dirección IP de Tomcat es 10.10.10.254 y el usuario es Bob.
Desde la máquina cliente, cree tres túneles SSH como este:
$ ssh -fnN -L 8082:localhost:8082 [email protected]
$ ssh -fnN -L 8083:localhost:8083 [email protected]
$ ssh -fnN -L 8084:localhost:8084 [email protected]
Suponiendo que las tres aplicaciones son aplicaciones web, abra su navegador web en la máquina cliente y navegue hasta:
http://localhost:8082
http://localhost:8083
http://localhost:8084