月度归档:2017年06月

Apache 代理转发 Tomcat 请求

1.前言

Web 服务器配置时常常会遇到这么个问题:80 端口已经被 Apache 或者 Tomcat 其中之一占用了,另一个怎么使用80端口? 最常见的解决方案是使用 Nginx 作为代理应用服务器,所以本文主要谈的并不是使用 Nginx 来解决这个问题,而是直接使用 Apache 作为代理应用服务器来解决。

2.背景介绍

  • 服务器上原本已经有多个 PHP 站点部署在 Apache 下,使用 80 端口;
  • 现在新增了一个 Java Web 项目,部署在 Tomcat 下, 使用 8080 端口;
  • 两者各自在不同的端口均能正常访问,现在要求 Java Web 项目也要使用 80 端口。

3.Tomcat 配置

Tomcat 无需额外配置,只要如下配置,保证在 IP + port 能正常访问的情况下即可:

Tomcat Server.xml 部分相关配置

<!-- 默认配置,无需修改,检查一下即可 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
    <!-- docBase 配置项目所在绝对路径 -->
    <Context docBase="D:\project\test" path="" reloadable="true" source="org.eclipse.jst.jee.server:test"/>
    
</Host> 

4.Apache 配置

Apache httpd.conf 模块加载

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

# 找到上面三个模块,去掉 # 开启模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

Apache httpd-vhosts.conf 配置

<VirtualHost *:80>
    ServerName test.shelwee.com
    ProxyPass / ajp://127.0.0.1:8009/ 
    ProxyPassReverse / ajp://127.0.0.1:8009/
    ErrorLog "logs/test.shelwee.com.log"  
    CustomLog "logs/test.shelwee.com.log" combined  
</VirtualHost>

配置完毕后,重启 Apache 服务器,然后开启 Tomcat 服务器。

5.代理过程说明

用户通过浏览器访问 test.shelwee.com 之后,Apache 会接收到这个请求,然后通过 AJP 协议转发到本地 8009 端口上,请求数据就能被 Tomcat 处理后返回。

THE END