Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7

前置条件为Apache 2.2,Tomcat 7都是通过apt-get install来安装的版本。

$ sudo apt-get install apache2

$ sudo apt-get install tomcat7

1.开启ApacheAJP协议支持,Apache 2.2已经默认在/var/lib/apache2/module目录下面包含了AJP协议模块,只要打开支持就可以了。

$ sudo a2enmod proxy_ajp

$ sudo a2enmod proxy

2.编辑VirtualHost,在Ubuntu下面这个目录在/etc/apache2/sites-available下面

可以看到default.confdefault-ssl.conf两个类似的文件,我这边的default.conf莫名的被重命名成了000-default.conf,倒也无妨。

$ sudo vim /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80></VirtualHost>

之间增加

ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
ServerName localhost

注意,此处的8009端口,要对应下面的Tomcat 7中配置的AJP的端口。

3.修改Tomcat 7的配置文件

$ sudo vim /var/lib/tomcat7/conf/server.xml

去掉被注释掉的,如果没有则增加

<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

注意是增加或去掉原来的配置信息,不是修改默认的8080端口上的“HTTP 1.1”部分

另外注意,如果直接去掉注释,那么根据The AJP Connector中的介绍说明(注意address部分),如果没有指定IP地址的话,默认是绑定任意地址,这样就导致外网也可以访问这个端口。因此出于安全考虑,我们需要增加这个address的设置,并且绑定到127.0.0.1。最终结果如下:

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" address="127.0.0.1" redirectPort="8443" />

4.重启Tomcat 7Apache 2

$ sudo service apache2 restart

$ sudo service tomcat7 restart

5.验证是否成功

TomcatROOT目录(/var/lib/tomcat7/webapps)下面创建一个index.jsp里面随便写点东西即可,不需要是JSP,比如可以写 "Hello JSP"
然后访问http://127.0.0.1/index.jsp如果能正常显示出来,则代表配置成功。

6.如果重启Apache2出现:

Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName.

/etc/apache2/apache2.conf文件最后加上:

#ServerName XXX (XXX 为domain name)
ServerName localhost

7.出于安全原因,禁止外网访问Tomcat8080端口

只允许Tomcat在本地的8080端口监听即可,修改

$ sudo vim /var/lib/tomcat7/conf/server.xml

添加 address="127.0.0.1"

<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" />

重启Tomcat7

$ sudo service tomcat7 restart

8.Apache2Tomcat进行反向代理的时候,会发生重定向问题。

配置参考
在Ubuntu 12.04 LTS上安装OpenGrok浏览Android源码
具体的Apache2的配置文件如下:"/etc/apache2/sites-available/default"

#for Tomcat 7 openGrok
ProxyPass /AndroidXRef/ ajp://127.0.0.1:8009/AndroidXRef/
ProxyPassReverse /AndroidXRef/ ajp://127.0.0.1:8009/AndroidXRef/
ServerName localhost

则在正常访问http://www.mobibrw.com/AndroidXRef的时候是正常的,但是在点击里面按钮的时候会报告404跳转错误。ProxyPass后面必须携带"/",否则就会出现404问题。

产生这个错误的原因是:Apache2进行代理的时候更改了URL路径,而Tomcat7并不知道URL发生变化了,因此没有在跳转时候携带Apache2增加的跳转地址。

解决方法是在Tomcat7的配置文件/var/lib/tomcat7/conf/server.xml中的Host字段中增加

<Context path="/AndroidXRef" docBase="source/"/>

即可。

如下所示:

<Host name="localhost"  appBase="webapps"
	unpackWARs="true" autoDeploy="true">

	<Context path="/AndroidXRef" docBase="source/"/>
 
	<!-- SingleSignOn valve, share authentication between web applications 
		Documentation at: /docs/config/valve.html --> 
	<!-- 
		<Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
	-->
	<!-- Access log processes all example. 
		Documentation at: /docs/config/valve.html 
		Note: The pattern used is equivalent to using pattern="common" --> 
	<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" /> 
</Host>

发布者