Overview

最近在为我们的一篇论文做Online Server,我们使用了Java的Struts框架搭建了Server,并且部署到了Tomcat上,这也带来了一个问题。服务器上本来已经有了Apache,并且占用了80端口,加上Tomcat之后使用域名必须加上Tomcat的端口号访问,使用起来很不方便,Online Server的网址看起来也很奇怪。
整合ApacheTomcat有好多种方法,这里我们使用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来使用反向代理,步骤如下:

  1. 进入Apache文件目录:

    cd /etc/apache2
    
  2. 修改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/
    
  3. 重启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_proxymod_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_websitetomcat上没有这个网站,自然也就访问不到。我们通过修改Apache配置文件apache2.conf,告诉Apache,如果是/apache_website,就不要转发给tomcat了:

# 下面这条配置使得apache在转发请求时,过滤掉apache_website这个站点
ProxyPass /apache_website !

重启就可以生效。

实际上,在使用中,我们通常会使用Apache的过滤功能过滤掉静态资源(如html,图片,CSS等),这些请求由Apache处理的话速度要快很多,而动态的页面才转发给tomcat处理。
关于这些问题的配置请查看可以文末的链接。

参考网址