Apache webserver 和 Tomcat:同时运行多个 tomcat webapps 和 apache webserver 应用程序

Apache webserver 和 Tomcat:同时运行多个 tomcat webapps 和 apache webserver 应用程序

webapps我们有一个 Debian X64 服务器,目前有一个 tomcat 实例,其中当然有 3 个WAR文件。此外,我们还有一个 Apache Web 服务器,其中运行着一个 CMS 系统。最后一个项目是MaintenanceWeb 应用程序,当我们在服务器上工作且服务不可用时会显示它。

我们面临的问题是:

  1. Tomcat 或 Apache 网络服务器中只有一个始终在端口 80 上主动运行。
  2. 对于 Tomcat 应用程序,必须通过不同的上下文路径来访问应用程序。
  3. 我们无法在多个域名下运行所有​​内容,只能在单个服务器下运行。

我长期想做的事情是:

  1. 使用 Tomcat(首选)或 Apache Web 服务器作为负载平衡器,它将根据域名中继请求。因此,如果有人调用 url www.xyz.com,那么它应该调用XYZ我们拥有的 Web 应用程序。相同的 Web 应用程序名称和域名纯属巧合。
  2. 将 Web 应用程序与整个网格绑定在一起Maintenance,当任何域不活动、无响应或繁忙时将调用它。

我创建了一张图(很可怕.. :-()),它更清楚地解释了这项任务。

在此处输入图片描述

正如您现在所看到的架构,这是我的问题。

  1. 这是一个好方法吗?如果不是,请告诉我哪里可以做得更好。
  2. 我正在尝试执行的任务叫什么?网格配置,负载平衡?
  3. 如何将所有可以通过不同 URL 引用但指向正确的 Web 应用程序或网站的 Web 应用程序、网站绑定在一起。
  4. 我对 Apache tomcat 和 Linux 管理有深入的了解,但对 Apache webserver 了解不多。有人能帮我解决这个问题吗,帮我做一些规划,告诉我需要什么,这样我才能执行它。

请注意,我们已在 DNS 中为所有基于 Web 应用程序和 Web 服务器的网站注册了域名。

我希望我已经添加了足够的信息,如果有任何需要,请告诉我。任何帮助都很好。非常感谢。:-)

答案1

考虑到您只有一个IP和一台服务器,我会:

将一个 apache 实例放在基于名称的虚拟主机上侦听端口 80(因为您只有一个 IP,如果您打算使用 HTTPS,请注意最终的 SSL 问题,请检查此处:https://wiki.apache.org/httpd/NameBasedSSLVHosts

因此,每个子域名都会有一个虚拟主机,假设您的域名是 example.com,您将拥有:

www.app1.com
[...]
www.appN.com

cms.example.com
maintenance.example.com

在管理应用程序子域的虚拟主机上,您可以根据需要使用 mod_jk、mod_proxy_ajp 或 mod_proxy_http 配置反向代理。对于 tomcat,我会选择 mod_jk。

这样,你的 3 个问题就都解决了。

这也涵盖了您的第一个长期计划,第二个计划:

将维护 Web 应用程序与整个网格绑定在一起,当任何域不活动、无响应或繁忙时将调用该 Web 应用程序。

您可以通过多种方式实现这一点。例如,在 Apache 上使用自定义错误页面来处理 500/503 错误,该页面会重定向到您的 maintenace.example.com。这可能是一个问题

至于你的最后一个问题:

1 这是个好方法吗?如果不是,请告诉我哪里可以做得更好。

我想我也提到了这一点

2 我正在尝试执行的任务叫什么?网格配置,负载平衡?

虚拟主机(具有最终的负载平衡,请参阅下文)

3 如何将所有 Web 应用程序、网站绑定在一起,这些 Web 应用程序、网站可以通过不同的 URL 引用,但会指向正确的 Web 应用程序或网站。

这是由 Apache 虚拟主机和代理处理的。您甚至可以重写,这样就不必在 URL 中使用上下文路径。这也可以是一个问题。

4 我对 Apache tomcat 和 Linux 管理有深入的了解,但对 Apache webserver 了解不多。有人能帮我解决这个问题吗,帮我做一些规划,告诉我需要什么,这样我才能执行它。

我想我也提到了这一点。

附注:我会使用至少两个 tomcat,但最好每个应用程序使用两个 tomcat。至少两个,这样万一 tomcat 挂了,你也能应付。每个应用程序两个,这样你的应用程序就可以彼此隔离(在不同的 JVM 中运行)。如果出现问题,这可以非常方便地指向特定的应用程序。

希望这可以帮助。

答案2

我最终通过将其更改为以下配置解决了这个问题:

Tomcat的server.xml:

 <Connector port="8080" proxyPort="80" redirectPort="443" protocol="HTTP/1.1" compression="force" compressionMinSize="1024" 
               connectionTimeout="20000"  maxPostSize="5242880"
               URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>


 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"  maxPostSize="5242880" SSLEnabled="true" maxThreads="200" compr$
              compressionMinSize="1024" scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
               keystoreFile="keystore.jks" keystorePass="PASSWORD" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"/>

  <Connector port="8010" protocol="AJP/1.3" redirectPort="80" URIEncoding="utf-8"
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
/>
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat">
   // Multiple webapps hosted
    </Engine>

在 jk.conf 中添加了以下内容:

<IfModule jk_module>
        JkWorkersFile   /PATH/to/workers.properties
        JkLogFile       /var/log/apache2/mod_jk.log
        JkLogLevel      notice
        JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
        JkOptions       +ForwardURIProxy
        JkMountFile     /path/to/uriworkermap.properties
</IfModule>

工人.属性:

 worker.list = worker_app1
worker.worker_app1.type = lb
worker.worker_app1.balance_workers = app1_instance1
worker.worker_app1.sticky_session = true
worker.worker_app1.sticky_session_force = false
worker.worker_app1.method = busyness

worker.app1_instance1.type = ajp13
worker.app1_instance1.host = 127.0.0.1
worker.app1_instance1.port = 8010
worker.app1_instance1.host = localhost
worker.app1_instance1.lbfactor = 1
worker.app1_instance1.socket_timeout = 40
worker.app1_instance1.socket_keepalive = true
worker.app1_instance1.reply_timeout = 30000

uriworkermap.properties:

/|/* = worker_app1;

已将其添加000-defaultsites-enabled

// This is the tomcat domain. 
<VirtualHost *:80>
ServerName www.domain_tomcat_webapp.de
ServerAlias domain_tomcat_webapp.de
ProxyRequests on
ProxyPreserveHost On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

<Location / >
Order allow,deny
Allow from all
</Location>
</VirtualHost>

就是这样。然后我启动了 tomcat 并重新启动了 Apache web 服务器,现在它就可以正常工作了。

相关内容