Как открыть порт и напрямую получить доступ к веб-приложению, работающему на Tomcat в CentOS 7? Tomcat работает за обратным прокси-сервером Apache httpd, но я хочу получить прямой доступ к приложениям, работающим в Tomcat, открыв порт для прямого предоставления доступа к каждому приложению в целях тестирования.
Когда я открываю порты 8080 и 8081 в firewalld с помощью firewall-cmd --add-port=8080/tcp
и firewall-cmd --add-port=8081/tcp
, я могу получить доступ к приложениям, работающим на этих портах, когда я ввожу server.ip.addr:8080
или server.ip.addr:8081
, или anydomainontheserver.com:8080
или anydomainontheserver.com:8081
. Эти приложения также доступны, когда я получаю к ним доступ через httpd.
Однако, когда я пытаюсь получить доступ к приложениям, работающим на портах 8082, 8083 и 8084, напрямую, я получаю в ответ ошибки 404. Это происходит, несмотря на то, что приложения, работающие на портах 8082 и 8083, на 100% доступны через httpd по своим доменным именам. А приложение, работающее на порту 8084, в основном доступно через httpd по своему доменному имени. В каждом случае я набирал firewall-cmd --add-port=808x
и пытался получить доступ к приложениям через server.ip.addr:808x
и anydomainontheserver.com:808x
, но в каждом случае получал ошибки 404. Я даже пытался открыть порты для их портов ajp в firewalld и набирать server.ip.addr:80xx
и anydomainontheserver.com:80xx
в браузере, но получал сообщение об ошибке браузера, в котором говорилось, что страницы не могут быть получены без указания номера ошибки.
Итак, как мне получить доступ к приложениям, работающим на портах 8082, 8083 и 8084, напрямую через tomcat для целей тестирования?
При наборе текста 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.
Если вы попробуете переключить прокси-сервер httpd на использование порта HTTP, он все равно будет работать или вы получите ошибку 404?
Если вы получаете ошибку 404 через httpd, когда прокси-сервер использует HTTP, то проблема в вашем HTTP-коннекторе в Tomcat.
Если приложение по-прежнему работает через httpd, когда прокси-сервер использует порт HTTP, то проблема, вероятно, кроется внутри самого приложения.
решение2
Более безопасный способ достижения вашей цели — через SSH-туннелирование. Никаких изменений конфигурации tomcat или proxy не будет. Просто создайте SSH-туннель(и) между вашим клиентом и сервером tomcat, затем получите доступ к порту(ам) локально, как будто эти приложения запущены на вашей локальной клиентской машине. У вас есть три службы, прослушивающие tomcat на портах TCP 8082, 8083 и 8084. Поэтому создайте три SSH-туннеля. Предположим, что IP-адрес tomcat — 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