使用 mod_proxy 从 80 上的 Apache 转发到 8080 上的 Tomcat 6 [关闭]

Posted

技术标签:

【中文标题】使用 mod_proxy 从 80 上的 Apache 转发到 8080 上的 Tomcat 6 [关闭]【英文标题】:Forward connection from Apache on 80 to Tomcat 6 on 8080 with mod_proxy [closed] 【发布时间】:2012-01-10 10:19:43 【问题描述】:

我有一个域名 www.example.com,现在我正在尝试将浏览器连接转发到 http://myserveripaddress:8080/MyAppName,以便让用户在浏览器上键入 www.example.com 时浏览 MyApp。 .

为此,我在 Apache (2.2.20) 的 httpd.conf 文件中编写了这个标签:

<VirtualHost *:80>
    ServerName www.example.com
    ProxyRequest Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://myserveripaddress:8080/MyAppName/
ProxyPassReverse / http://myserveripaddress:8080/MyAppName/    
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>

然后我在tomcat的server.xml文件中使用了以下标签:

... ...

问题是当我在浏览器上输入 www.example.com 时,我得到了这个答案 您无权访问此服务器上的 /。 Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/0.9.8r DAV/2 服务器位于 www.example.com 端口 80

如果我尝试连接到 www.example.com/MyAppName,它可以工作....

最后,我如何在网络浏览器中输入 www.example.com 来连接到 MyApp??


更新于 21.41 CET 1/1/11

这是我的配置:

httpd.conf

<VirtualHost *:80>
    DocumentRoot /var/www/MyAppName
    ServerName www.example.com
</VirtualHost>




<IfModule mod_jk.c>
   JKWorkersFile /etc/apache2/workers.properties
   JkShmFile /var/log/apache2/mod_jk.shm
   JKLogFile /var/log/apache2/mod_jk.log
   JkLogLevel debug
   JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
   JkMount /MyAppName/* worker1
</IfModule> 

我也试过了:

JkMount /* worker1

在 server.xml 中

<Connector port="8009" protocol="AJP/1.3" />


<Host name="www.example.com"  appBase="/var/www/"
       unpackWARs="true" autoDeploy="true" deployOnStartup="true"
       xmlValidation="false" xmlNamespaceAware="false">
       <Context path="" docBase="/var/www/MyAppName"/>

在worker.properties中

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

我的配置是 Apache 2.2.20,Tomcat 6,在 Mac Mini Server OS X Lion 上运行......

如果我尝试访问 www.example.com,我正确地看到了我的 index.html 页面,但是当我单击链接到我的项目中的另一个页面或 Servlet 或 JSP 的按钮时,这就是消息:

404 Not Found Error
Not Found

The requested URL /MyAppName/RegistrationPage was not found on this server.

Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/0.9.8r DAV/2 mod_jk/1.2.30 Server at www.example.com Port 80

此外,如果 JSP 直接在 MyAppName 页面中(而不是在子目录中),它会打印代码,java 引擎不会解释代码。

【问题讨论】:

通常这种部署是使用Tomcat Connectors (mod_jk) 而不是 mod_proxy 完成的。如果没有特别的理由使用 mod_proxy,当然…… 我使用它是因为如果我需要部署另一个tomcat应用程序,我可以添加新的虚拟主机,对吗? mod_jk 不关心有多少应用程序,在 apache 中,您只需为每个 tomcat 应用程序添加另一个虚拟主机,并且对于 Tomcat 中的每个应用程序,您将另一个主机配置为 ... 所以你建议我使用 mod_jk 从 www.example.com 访问 myserveripaddress:8080/MyAppNAme ?此配置的任何链接或网站 mod_jk 不能通过 HTTP 工作,而是通过 AJP 工作,因此您可以安全地禁用 8080 上的 HTTP 连接器。您将需要启用 AJP 连接器。详细信息在我的回答中。 【参考方案1】:

如果没有特定理由使用 mod_proxy 来部署您的应用程序,那么Tomcat Connectors / mod_jk 是更合适的解决方案。

请参考

Tomcat connectors howto

了解如何在 Apache 端设置连接器。请注意,JkMount /examples/* worker1 按上下文挂载 worker(因此示例中的所有内容都将由 Tomcat 处理),在您的配置中,您可能希望通过扩展挂载(甚至只是 *),如下所示:

JkMount  /*.jsp worker1
JkMount  /*.do worker1
JkMount  /*.whatever worker1

这样所有匹配 *.jsp *.do 和 *.whatever 的东西都将由 Tomcat 处理,其余的由 apache 处理。 注意: JkMount 行需要在您的定义中(在某些情况下)。

mod_jk 不使用 HTTP 连接到 Tomcat,因此您可以禁用 HTTP 连接器(默认侦听 8080 的连接器)。您将需要使用server.xml 中的一行来启用 AJP 连接器(不确定是否默认启用):

<Connector port="8009"
            enableLookups="false" redirectPort="8443" 
            protocol="AJP/1.3"/>

要让 Tomcat 识别哪个应用程序应该响应调用,您需要执行 Host configuration 并使用与您的站点名称匹配的 name 定义一个 Host

然后定义一个 apache 虚拟主机,DocumentRoot 匹配 Tomcat 应用程序的 docBaseServerName 匹配 Tomcat 主机名,如下所示:

httpd.conf:

<VirtualHost *:80>
DocumentRoot /var/www/yoursite.com
ServerName www.yoursite.com
</VirtualHost>

server.xml:

<Host name="www.yoursite.com" appBase="/var/www"
   unpackWARs="false" autoDeploy="false" deployOnStartup="false"
   xmlValidation="false" xmlNamespaceAware="false">
   <Context path="" docBase="/var/www/yoursite.com"/>

请注意,此设置不适用于 WAR 文件部署,而是用于解压(分解、提取)的 WAR 文件。 WAR 是一个 ZIP 存档,以防您不知道。

我很抱歉让它有点含糊,但它确实有效,这是在 Apache HTTPD 后面部署 Tomcat 应用程序的正确方法。

如果你用谷歌搜索它,你会找到带有演练的手册,this one 似乎是一个不错的选择。

【讨论】:

所以如果我想让 Tomcat 处理 .jsp 文件和 .html,我需要在 httpd.conf 中编写: JkMount /*.jsp worker1 JkMount /*.html worker1 是的,不幸的是,我还没有听说过每行语法有多个模式 然后在 tomcat 的 server.xml 文件中我写 “webApps/MyAppName”? 对不起... apache 虚拟主机怎么样?我需要在 httpd.conf 中写吗? appBase="/var/www/yoursite.com", 虚拟主机示例将放在答案中

以上是关于使用 mod_proxy 从 80 上的 Apache 转发到 8080 上的 Tomcat 6 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Apache + Node.js + mod_proxy。如何将一个域路由到:3000,将另一个域路由到:80

如何让apache和nodejs共用80端口

在 apache http 服务器上设置 mod_proxy

在 apache http 服务器上设置 mod_proxy

apache的80端口分发

带有 mod_ssl 和 mod_proxy 的 Apache 返回 413 Request Entity Too Large