1

我有两台独立的服务器:一台 Apache 公共服务器和一台内部 Tomcat。我希望我们的用户能够使用我们的 Tomcat 应用程序,而无需通过公共 Apache 服务器公开我们的实现细节(实际端口、服务器名称、上下文),如下所示:

http://credits.publicdomain.com/servlet

代替

http://tomcat.internaldomain.com:8082/CreditsApp/servlet

如何以这种方式配置我的 Apache 服务器以屏蔽对 Tomcat 应用程序的请求?使用诸如 mod_rewrite 或 mod_proxy 之类的 Apache 模块是最直接的方法吗?

我已经为 Apache 中的 VirtualHost 尝试了这种配置,它适用于第一个 servlet。但是,它似乎禁用了 Tomcat 以保持会话从第一个 servlet 到您之后去的任何其他 servlet:

ServerName credits.publicdomain.com

ProxyRequests Off
ProxyPreserveHost On

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>                        

ProxyPass        / http://tomcat.internaldomain.com:8082/CreditsApp/
ProxyPassReverse / http://tomcat.internaldomain.com:8082/CreditsApp/

我是否在我的 Tomcat 服务器中遗漏了一些额外的配置,以便在没有 servlet 之间的上下文的情况下工作?

4

2 回答 2

1

mod_jk是 Tomcat 与 Apache 之间的桥梁,因此您可以专注于您的应用程序,而 Apache 作为前端,可以处理 https 和身份验证等。它会将某些 URL 转发给 Tomcat 中的“workers”。所以你需要告诉Apache加载mod_jk,你需要配置worker.properties,Apache需要知道哪个worker做什么,你需要在Tomcat中定义一个Service。

httpd.conf 中的这些指令配置 mod_jk:

JKWorkersFile conf/workers.properties
JKLogFile /var/log/tomcat/mod_jk.log JKLogLevel 信息

/etc/httpd/conf/workers.properties 中的 JKWorkersFile 基本上定义了套接字

 workers.tomcat_home=/var/tomcat4
 workers.java_home=/usr/java/jdk
 ps=/
 worker.list=worker1,worker2
 worker.worker1.port=8009
 worker.worker1.host=localhost
 worker.worker1.type=ajp13
 worker.worker2.port=8010
 worker.worker2.host=localhost
 worker.worker2.type=ajp13

httpd.conf 的这个片段会将所有内容(即 /* )委托给 worker1:

<VirtualHost 192.0.34.72>
      ServerAdmin webmaster@ example.com
      DocumentRoot /www/www.example.com/webapps/ROOT
      ServerName www.example.com
      ErrorLog logs/public_errors
      LogLevel debug
      CustomLog logs/public_access combined
      JkMount /* worker1
      <Directory "/www/www. example.com/webapps/ROOT">
          Options Indexes FollowSymLinks Indexes
          AllowOverride None
          Order allow,deny
          Allow from all
     </Directory>
      <Location "/WEB-INF/">
          AllowOverride None
          deny from all
      </Location>
      <Location "/META-INF/">
          AllowOverride None
          deny from all
      </Location>
</VirtualHost>

Tomcat 会有这个服务:

<service name="public">
    <connector classname="org.apache.coyote.tomcat4.CoyoteConnector" port="8009" minprocessors="5" maxprocessors="75" enablelookups="true" redirectport="8443" acceptcount="10" debug="0" connectiontimeout="0" useurivalidationhack="false" protocolhandlerclassname="org.apache.jk.server.JkCoyoteHandler" /> 
    <engine name="Standalone" defaulthost="localhost" debug="0">
        <logger classname="org.apache.catalina.logger.FileLogger" prefix="catalina_log." suffix=".txt" timestamp="true" /> <realm classname="org.apache.catalina.realm.UserDatabaseRealm" debug="0" resourcename="UserDatabase" />  
        <host name="localhost" debug="0" appbase="/www/www.example.com/webapps" unpackwars="true" autodeploy="true">
            <logger classname="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" /> 
        </host>
    </engine>
</service>

以上示例来自我的笔记,请查看更新文档:http: //tomcat.apache.org/connectors-doc/generic_howto/workers.html http://tomcat.apache.org/connectors-doc/webserver_howto/apache。 html

于 2013-05-03T21:20:24.747 回答
1

最好和最有效的方法是使用 mod_jk:http: //tomcat.apache.org/connectors-doc/

我在几个项目中使用过它,发现它非常易于使用、有效、灵活和高性能。这也是在 Apache 后面堆叠 Tomcat 的事实上的官方解决方案。

于 2013-05-03T20:58:48.487 回答