Overview
最近在为我们的一篇论文做Online Server
,我们使用了Java的Struts框架搭建了Server,并且部署到了Tomcat上,这也带来了一个问题。服务器上本来已经有了Apache
,并且占用了80
端口,加上Tomcat
之后使用域名必须加上Tomcat
的端口号访问,使用起来很不方便,Online Server
的网址看起来也很奇怪。
整合Apache
和Tomcat
有好多种方法,这里我们使用Apache
反向代理的方式。其他方法概览请查看这里。
1. 服务器信息
下面以我们的云服务器为例说明这个过程,信息如下:
服务器域名 : www.nohup.cc
Apache端口号: 80
Tomcat端口号: 8888
Tomcat上的应用程序: hudson
Apache程序路径:/etc/apache2
当我们使用域名访问服务器时,服务器会默认把请求转发到80
端口的服务器,在我们这里就是Apache
服务器。因此访问Apache
上的网站时,可以直接使用域名,比如可以通过 www.nohup.cc 直接访问本站点;而访问Tomcat
上的网站时,需要添加端口号访问,比如访问hudson
,需要使用 www.nohup.cc:8888/hudson才可以访问。
2. 配置Apache
我们通过配置Apache
来使用反向代理,步骤如下:
进入
Apache
文件目录:cd /etc/apache2
修改
Apache
配置文件apache2.conf
,在文件末尾添加一下几行:# 导入需要用到的两个模块 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so # 下面的两条用来配置访问hudson的反向代理 ProxyPass /hudson http://www.nohup.cc:8888/hudson/ ProxyPassReverse /hudson http://www.nohup.cc:8888/hudson/
重启
Apache
:sudo apache2ctl -k restart
或者使用下面的命令重启
sudo service apache2 restart
前者报错信息比较直接,直接打印到了屏幕上。
2.1
可能出现的问题
如果你得到下面的信息:
[Mon Oct 26 09:26:39.080381 2015] [so:warn] [pid 21343] AH01574: module proxy_module is already loaded, skipping [Mon Oct 26 09:26:39.080615 2015] [so:warn] [pid 21343] AH01574: module proxy_http_module is already loaded, skipping
说明你的
Apache
服务器已经导入了这两个模块,不需要重复导入,删掉LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
这两句就可以了。
你也可能得到的是下面的报错信息:
apache2: Syntax error on line 222 of /etc/apache2/apache2.conf: Cannot load modules/mod_proxy.so into server: /etc/apache2/modules/mod_proxy.so: cannot open shared object file: No such file or directory Action '-k restart' failed. The Apache error log may have more information.
错误信息很明确,查看
/etc/apache2/mods-enabled
文件夹,发现里面并没有proxy.*
和proxy_http.*
文件,但是/etc/apache2/mods-available
文件夹里面是有的,说明apache
已经安装了这些模块,但是并未开启。
使用下面的命令开启mod_proxy
和mod_proxy_http
模块:sudo a2enmod proxy sudo a2enmod proxy_http
现在再看
/etc/apache2/mods-enabled
文件夹,里面已经有了proxy.*
和proxy_http.*
文件,重启apache
让配置生效,就不会再报错了。
现在就可以使用www.nohup.cc/hudson来访问Tomcat
上的hudson
程序了...
3. 配置Apache
过滤特定的请求
考虑下面的需求:
我们想要把www.nohup.cc的请求全部转发到tomcat上处理,我们可以修改Apache
配置文件apache2.conf
:
# 下面的两条用来配置所有请求的反向代理
ProxyPass / http://www.nohup.cc:8888
ProxyPassReverse / http://www.nohup.cc:8888
这样,当我们访问www.nohup.cc
时,请求就会被自动转发到tomcat
。
假定我们在Apache
上还有一个网站apache_website
,可当我们访问www.nohup.cc/apache_website
时,会被定位到http://www.nohup.cc:8888/apache_website
,tomcat
上没有这个网站,自然也就访问不到。我们通过修改Apache
配置文件apache2.conf
,告诉Apache
,如果是/apache_website
,就不要转发给tomcat
了:
# 下面这条配置使得apache在转发请求时,过滤掉apache_website这个站点
ProxyPass /apache_website !
重启就可以生效。
实际上,在使用中,我们通常会使用Apache
的过滤功能过滤掉静态资源(如html,图片,CSS等),这些请求由Apache
处理的话速度要快很多,而动态的页面才转发给tomcat
处理。
关于这些问题的配置请查看可以文末的链接。
[...]二、配置Apache2转发JavaWeb工程至Tomcat[...]