У меня есть сценарий, в котором все запросы к серверу Tomcat (сервер приложений) должны проходить через Apache 2.2 (веб-сервер). Оба сервера находятся на 2 разных машинах. Две машины не находятся в одном домене или сети по соображениям безопасности.
Я должен использовать параметр виртуального хоста, как показано ниже, потому что он уже использовался другими разработчиками в моей компании, полностью протестирован и работает нормально.
<VirtualHost *:*>
#Full Computer Name with port if its not 80
ServerName Full_Name_OF_Computer
ServerAlias Full_Name_OF_Computer
LogFormat "%h %l %u %t \"%r\" %s %b %D" app
CustomLog logs/app-access.log app
SSLProxyEngine On
RewriteEngine on
RewriteLogLevel 5
RewriteLog logs/rewrite.log
# Root URL handling
RewriteRule ^\/app\/?$ /app/launch.jsp [R,L]
RewriteRule ^\/app\/?$ ajp://Full_Name_OF_Computer:8009/app [P,L]
# Dynamic content
RewriteRule ^/app/(.+\.(?:jsp|do|rpc).*)$ ajp://Full_Name_OF_Computer:8009/app/$1 [P,L]
# This must be the location where application is deployed
# SHOULD THIS BE THE LOCATION WITH IN THE APPLICATION SEVER OR THE LOCATION PATH TO THE APPLICATION SERVER FROM WEB SERVER??
Alias /app "D:\apache-tomcat-7.0.63\webapps\app"
<Directory "D:\apache-tomcat-7.0.63\webapps\app">
Options FollowSymLinks
AllowOverride None
Allow from all
ExpiresActive on
ExpiresDefault "access plus 2 months"
ExpiresByType application/x-javascript "access plus 2 months"
ExpiresByType application/javascript "access plus 2 months"
ExpiresByType text/javascript "access plus 2 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType image/gif "access plus 2 months"
ExpiresByType image/jpeg "access plus 2 months"
ExpiresByType image/png "access plus 2 months"
ExpiresByType image/x-icon "access plus 2 months"
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript text/json application/x-javascript
</Directory>
</VirtualHost>
Это отлично работает для меня, если я установил сервер apache и tomcat на одном компьютере. Однако, если я устанавливаю сервер Apache и Tomcat на разных машинах (по мере необходимости), я вношу несколько изменений в HTTPD.conf, и после этого я не могу получить доступ к приложению через Apache. Приложение доступно с веб-сервера через URL-адрес приложения (через порт 8080).
Может ли кто-нибудь помочь мне указать, что я делаю неправильно?
После изменения WebServerFullName, ApplicationServerFullName и сетевого пути к папке развертывания приложений на Tomcat параметры нового виртуального хоста:
<VirtualHost *:*>
#Full Computer Name with port if its not 80
ServerName Web_Server_Ful_Name
ServerAlias Web_Server_Ful_Name
LogFormat "%h %l %u %t \"%r\" %s %b %D" app
CustomLog logs/app-access.log app
SSLProxyEngine On
RewriteEngine on
RewriteLogLevel 5
RewriteLog logs/rewrite.log
# Root URL handling
RewriteRule ^\/app\/?$ /app/launch.jsp [R,L]
RewriteRule ^\/app\/?$ ajp://ApplicationServerFullName:8009/app [P,L]
# Dynamic content
RewriteRule ^/app/(.+\.(?:jsp|do|rpc).*)$ ajp://ApplicationServerFullName:8009/app/$1 [P,L]
# This must be the location where application is deployed
# SHOULD THIS BE THE LOCATION WITH IN THE APPLICATION SEVER OR THE LOCATION PATH TO THE APPLICATION SERVER FROM WEB SERVER??
Alias /app "\\ApplicationServerFullName\cim$\apache-tomcat-7.0.63\webapps\app"
<Directory "\\ApplicationServerFullName\cim$\apache-tomcat-7.0.63\webapps\app">
Options FollowSymLinks
AllowOverride None
Allow from all
ExpiresActive on
ExpiresDefault "access plus 2 months"
ExpiresByType application/x-javascript "access plus 2 months"
ExpiresByType application/javascript "access plus 2 months"
ExpiresByType text/javascript "access plus 2 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType image/gif "access plus 2 months"
ExpiresByType image/jpeg "access plus 2 months"
ExpiresByType image/png "access plus 2 months"
ExpiresByType image/x-icon "access plus 2 months"
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript text/json application/x-javascript
</Directory>
</VirtualHost>
Я сомневаюсь в сетевом пути к папке развертывания приложения на Tomcat, потому что, поскольку 2 компьютера не находятся в одной сети, администратор сети должен был указать мне странный путь, учитывая знак доллара ($) в нем, \ ApplicationServerFullName \ cim $ \ apache-tomcat-7.0.63 \ webapps \ app (хотя доступно с WebServer через браузер)
Другие подробности:
Tomcat Server.xml Настройки AJP:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Журнал ошибок:
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy_ajp.c(45): proxy: AJP: canonicalising URL //ApplicationServerFullName:8009/app/launch.jsp
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(1532): [client 10.16.1.3] proxy: *: found reverse proxy worker for ajp://ApplicationServerFullName:8009/app/launch.jsp
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy.c(1036): Running scheme ajp handler (attempt 0)
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy_ajp.c(726): proxy: AJP: serving URL ajp://ApplicationServerFullName:8009/app/launch.jsp
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(2018): proxy: AJP: has acquired connection for (*)
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(2074): proxy: connecting ajp://ApplicationServerFullName:8009/app/launch.jsp to ApplicationServerFullName:8009
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(2200): proxy: connected /app/launch.jsp to ApplicationServerFullName:8009
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(2451): proxy: AJP: fam 2 socket created to connect to *
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(224): Into ajp_marshal_into_msgb
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[0] [Accept] = [text/html, application/xhtml+xml, */*]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[1] [Accept-Language] = [nl-NL]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[2] [User-Agent] = [Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[3] [Accept-Encoding] = [gzip, deflate]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[4] [Host] = [Web_Server_Ful_Name]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(290): ajp_marshal_into_msgb: Header[5] [Connection] = [Keep-Alive]
[Fri Aug 14 18:27:07 2015] [debug] ajp_header.c(461): ajp_marshal_into_msgb: Done
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy_ajp.c(270): proxy: APR_BUCKET_IS_EOS
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy_ajp.c(275): proxy: data to read (max 8186 at 4)
[Fri Aug 14 18:27:07 2015] [debug] mod_proxy_ajp.c(290): proxy: got 0 bytes of data
[Fri Aug 14 18:27:07 2015] [error] (OS 10054)An existing connection was forcibly closed by the remote host. : ajp_ilink_receive() can't receive header
[Fri Aug 14 18:27:07 2015] [error] ajp_read_header: ajp_ilink_receive failed
[Fri Aug 14 18:27:07 2015] [error] (120006)APR does not understand this error code: proxy: read response failed from (null) (*)
[Fri Aug 14 18:27:07 2015] [debug] proxy_util.c(2036): proxy: AJP: has released connection for (*)
Rewrite.log
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (2) init rewrite engine with requested uri /app/launch.jsp
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (3) applying pattern '^\\/app\\/?$' to uri '/app/launch.jsp'
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (3) applying pattern '^\\/app\\/?$' to uri '/app/launch.jsp'
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (3) applying pattern '^/app/(.+\\.(?:jsp|do|rpc).*)$' to uri '/app/launch.jsp'
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (2) rewrite '/app/launch.jsp' -> 'ajp://ApplicationServerFullName:8009/app/launch.jsp'
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (2) forcing proxy-throughput with ajp://ApplicationServerFullName:8009/app/launch.jsp
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] [Web_Server_Ful_Name/sid#79a028][rid#7aed50/initial] (1) go-ahead with proxy request proxy:ajp://ApplicationServerFullName:8009/app/launch.jsp [OK]
Access.log
10.16.1.3 - - [14/Aug/2015:18:27:07 +0200] "GET /app/launch.jsp HTTP/1.1" 503 323 0
Может ли кто-нибудь помочь мне с этим, поскольку у меня заканчивается время для этой реализации, и я довольно много искал в Интернете аналогичную проблему, но я не могу найти никакого решения.
Заранее большое спасибо.
Ошибка была связана с тем, что порт AJP для tomcat был недоступен извне.
После открытия порта я просто разместил статический контент на сервере, на котором размещался Apache, поэтому мне не нужно было отображать сетевой путь на WebServer.