Linux系统中配置Apache反向代理tomcat服务器 - Apache - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > Web服务器 > Apache

Linux系统中配置Apache反向代理tomcat服务器

发布时间:2014-02-25 来源:服务器之家

公司添加项目,需要架设环境,当时考虑用的nginx转发tomcat,可是分公司那边不会用nignx,只有用apache 反向代理 tomcat 虚拟主机,由于是头一次用 apache 做反向,tomcat集群,特留下过程,方便他人

在网上找了好多文章,其中为经典的我都摘抄了

     Apache HTTP server 和 Tomcat server 整合,一般是希望对于用户只公布 Apache HTTP server 的网址,而 Tomcat 的网址则不公布,扮演一个幕后英雄的角色。访问 Tomcat 的 HTTP 请求,通过 Apache 转发给 Tomcat,Tomcat 处理完后,将 HTTP 回应返回给 Apache,然后 Apache  HTTP 回应发回给用户端浏览器。

Apache HTTP server 和 Tomcat server 直接的 HTTP 数据传输,有很多种方法。

方法一,使用 mod_jk。很多网站上介绍到 Apache HTTP server 和 Tomcat server 整合的时候,都是在介绍  mod_jk.so 的使用,这是一种比较老的方法,并且需要额外下载 mod_jk。Apache 和 Tomcat 的默认配置文件都需要改动。

方法二, URL rewrite,也就是对于指定格式的 URL,转发给某个 Tomcat 的网址。这里所说的指定格式,是指 Apache 所使用的正则表达式,通俗地将,是一种类似 * 的一种比较高级通配符。这种方法不需要下在额外的文件,只需要配置 Apache。

方法三,mod_proxy_ajp,仅在 Apache 2.1 及以后的版本中可用,Apache 自带的一个新功能模块。这时 Apache 使用 Apache JServ Protocol 与 Tomcat 通讯。不需要下在额外的文件,需要改动Apache 和 Tomcat 的默认配置文件都需要改动。

方法四,mod_proxy。其实 mod_proxy 既可以做类似于 Wingate 一样的公司局域网共享上网代理,也可以做反向代理(Reverse proxy)。这里使用的是反向代理功能,用户端浏览器不需要把代理服务器改成这里的 Apache 地址。mod_proxy 是 Apache 自带功能,并且配置比较简单。

yum install gcc –y

wget http://mirror.bjtu.edu.cn/apache//httpd/httpd-2.2.17.tar.gz

wget http://www.oracle.com/technetwork/indexes/downloads/index.html

wget http://labs.renren.com/apache-mirror/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz

我是用一台服务器 做的 环境如下

Centos 5.5 64位 16核cpu  32G 内存

Apache + tomcat (开启四个端口)

#ar zxvf http-2.2.17.tar.gz

#d httpd-2.2.17

#/configure --prefix=/usr/local/apache --enable-modules=so --enable-mods-shared=all --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-rewrite

#make ; make install

#cp support/apachectl /etc/init.d/httpd

#chmod 755 /etc/init.d/httpd

#vim /etc/init.d/httpd

#chconfig –add httpd

#chkconfig –level 345 httpd on

cd ..

chmod +x jdk-x64.bin          #添加执行权限

./jdk-x64.bin             #安装jdk

mv jdk1.6.0_23/ /usr/java      

vim /etc/profile    # 添加java环境变量

#Java Environment

JAVA_HOME=/usr/java

JAVA_BIN=/usr/java/bin

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JAVA_BIN PATH CLASSPATH

source /etc/profile  

#java –version

    java version "1.6.0_23"

    Java(TM) SE Runtime Environment (build 1.6.0_23-b05)

    Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)

#tar zxvf apache-tomcat-7.0.8.tar.gz

#mv apache-tomcat-7.0.8 /usr/local/tomcat73

#vim /etc/profile      # 添加tomcat 环境变量

TOMCAT_HOME=/usr/local/tomcat73

CATALINA_HOME=/usr/local/tomcat73

CATLINA_BASE=/usr/local/tomcat73

/usr/local/tomcat73/bin/catalina.sh start  #添加启动脚本

export TOMCAT_HOME  CATALINA_HOME  CATALINA_BASH TOMCAT_BIN

#source /etc/profile

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule rewrite_module modules/mod_rewrite.so

   把apache 虚拟主机前边的# 去掉

           Include conf/extra/httpd-vhosts.conf

   添加 Include conf/extra/httpd-vhosts.conf  如下

<VirtualHost *80>

     ServerAdmin crazylinux@163.com

     ProxyRequests Off

     Proxypass / balancer://proxy/

     <Proxy balancer://proxy>

         Order Deny,Allow

         Allow from all

         BalancerMember http://127.0.0.1:8844         #tomcat  端口 (要用的端口,预设值的  可以随便设置)

         BalancerMember http://127.0.0.1:8855         #tomcat  端口

         BalancerMember http://127.0.0.1:8866          #tomcat  端口

         BalancerMember http://127.0.0.1:8877          #tomcat  端口

     </Proxy>

</VirtualHost>

保存修改  启动apache 服务

#/usr/local/apache/bin/apachectl -k start

修改 tomcat ,添加虚拟主机 按端口走 8844 8855 8866 8877 按照预设值的

#vim /usr/local/tomcat73/conf/server.xml 只修改红色字体

  <Service name="Catalina0">

<Connector port="8044" protocol="AJP/1.3" redirectPort="8443" />

    <Connector port="8844" />

    <Engine name="Catalina0" defaultHost="localhost" jvmRoute="jvm1">

      <Logger className="org.apache.catalina.logger.FileLogger" />

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase" />

      <Host name="localhost" appBase="webapps0" />

    </Engine>

  </Service>

  <Service name="Catalina1">

<Connector port="8055" protocol="AJP/1.3" redirectPort="8443" />

    <Connector port="8855" />

    <Engine name="Catalina1" defaultHost="localhost" jvmRoute="jvm2">

      <Logger className="org.apache.catalina.logger.FileLogger" />

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase" />

      <Host name="localhost" appBase="webapps1" />

    </Engine>

  </Service>

  <Service name="Catalina2">

<Connector port="8066" protocol="AJP/1.3" redirectPort="8443" />

    <Connector port="8866" />

    <Engine name="Catalina2" defaultHost="localhost" jvmRoute="jvm3">

      <Logger className="org.apache.catalina.logger.FileLogger" />

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase" />

      <Host name="localhost" appBase="webapps2" />

    </Engine>

  </Service>

  <Service name="Catalina3">

<Connector port="8077" protocol="AJP/1.3" redirectPort="8443" />

    <Connector port="8877" />

    <Engine name="Catalina3" defaultHost="localhost" jvmRoute="jvm4">

      <Logger className="org.apache.catalina.logger.FileLogger" />

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase" />

      <Host name="localhost" appBase="webapps3" />

    </Engine>

  </Service>

然后 创建 tomcat web 目录在/usr/local/tomcat73/   webapps0 webapps1 webapps2 webapps3 并在每个目录里面添加 index1.jsp 并添加 每个端口的对应号

启动tomcat

#/usr/local/tomcat73/bin/start.sh

#/usr/local/apache/bin/apachetl –k restart

  查看端口  netsant –ntlp

[root@localhost tomcat73]# netstat -ntlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  

tcp        0      0 0.0.0.0:964                 0.0.0.0:*                   LISTEN      2902/rpc.statd     

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2849/portmap       

tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      3155/cupsd         

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      3178/sendmail: acce

tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      11977/1            

tcp        0      0 :::8866                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8066                     :::*                        LISTEN      15836/java         

tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      15836/java         

tcp        0      0 :::8009                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8844                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8044                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8877                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8077                     :::*                        LISTEN      15836/java          

tcp        0      0 :::80                       :::*                        LISTEN      15987/httpd        

tcp        0      0 :::8080                     :::*                        LISTEN      15836/java         

tcp        0      0 :::22                       :::*                        LISTEN      25432/sshd         

tcp        0      0 :::8855                     :::*                        LISTEN      15836/java         

tcp        0      0 :::8055                     :::*                        LISTEN      15836/java         

tcp        0      0 ::1:6010                    :::*                        LISTEN      11977/1 

看到了 80  8844 8855 8866 8877  那tomcat 虚拟主机  和 apache都启动了 访问下试试吧

本文出自 “奋斗的小子” 博客,请务必保留此出处http://crazyming.blog.51cto.com/1048571/503637

-----------------------------------------------------------------------------------

用apache代理实现整合多个tomcat

要求:

  运行多个tomcat,通过apache侦听的端口进行区分。

  对于每个tomcat,配置各自需要服务的虚拟主机

  使用Apache的Proxy进行代理转发,转到对应的tomcat上面,重点在端口不同

  取消jk连接,减少复杂度。虽然损失了一些Apache对静态文本的性能,但整体看还是值得的

  结果:

  tomcat的server.xml里面配置了各自的虚拟主机,比如 www.aaa.com 和 oa.aaa.com。第一个是主域名,第二个是二级域名。tomcat端口为8080。第二个tomcat配置了一个 sales.aaa.com 用来支持销售,端口为8081。详细的配置文件请参考tomcat的虚拟主机配置,这里就不写了。

  测试各个虚拟主机的运行是否正常,使用 http:// oa.aaa.com:8080/ 这样的方式进行测试。

apache的 httpd.conf配置

打开代理所需要的.so支持模块,在httpd.conf里面,取消下面四行的注释:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

制作各自的虚拟主机

若需要内部端口整合

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

现在我们编辑第一个tomcat配置文件,端口为默认的8080

<Engine name="Catalina" defaultHost=www.aaa.com>
<Host name=www.aaa.com appBase=="/www/aaa.com/htdocs" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"
<Host name=www.cba.com appBase=="/www/cba.com/htdocs" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />

源码编译安装proxy-ajp模式的
# tar xvjf httpd-2.2.0.tar.bz2
# cd httpd-2.2.0

安装apr
# cd srclib/apr
# ./configure --prefix=/server/soft/apr
# make
# make install

安装apr-util
# cd ../apr-util/
# ./configure --prefix=/server/soft/apr-util
    --with-apr=/server/soft/apr
# make
# make install
# cd ../../

安装apache
# ./configure --prefix=/server/soft/apache
    --enable-so
    --enable-rewrite=share
    --enable-proxy=share
    --enable-proxy-ajp=share
    --enable-dav=share
    --with-apr=/server/soft/apr
    --with-apr-util=/server/soft/apr-util/
# make
# make install


</Engine>


注意:网站文件请分别放在/www/*/htdocs/ROOT目录

 Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"   />
</Engine>

编辑第二个tomcat配置文件,端口修改为8081

<Engine name="Catalina" defaultHost=localhost>
<

注意:网站文件放在tomcat安装文件目录的默认ROOT目录

localhost这里可以不用修改,因为只有一个网站,我们就可以不用域名代替

附出错分析:

如果编译安装没有编辑代理模块的解决办法

方法如下:

编译的时候要打开WITH_PROXY_MODULES选项,但我又不想重新安装apache,所以使用以下步骤达到此目的。
1、重新编译带有proxy模块的apache,但不安装。

进入源代码目录
#cd /usr/loacl/src/httpd2.2.9
#make WITH_PROXY_MODULES=yes

2. 分别编译生成代理模块

    cd modules/proxy

   /usr/local/apache/bin/apxs -c -i -a  mod_proxy.so proxy_util.c

   /usr/local/apache/bin/apxs -c -i -a  mod_proxy_ajp.so mod_proxy_ajp.c
   /usr/local/apache/bin/apxs -c -i -a  mod_proxy_connect.so mod_proxy_connect.c
   /usr/local/apache/bin/apxs -c -i -a  mod_proxy_http.so mod_proxy_http.c
   /usr/local/apache/bin/apxs -c -i -a  mod_proxy_ftp.so mod_proxy_ftp.c

这样就编译进了apache配置文件

编译过程中或者会出错,因为权限原因,需要给755权限

chmod 755 /usr/local/apache/modules/*.so

查看httpd.conf文件显示已经添加了代理模块

以下是httpd.conf的部分显示

# Example:
# LoadModule foo_module modules/mod_foo.so
LoadModule php5_module        modules/libphp5.so
LoadModule proxy_module   modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module  modules/mod_proxy_http.so
LoadModule proxy_ftp_module   modules/mod_proxy_ftp.so
#

已经添加进了apache,现在需要重新启动apache,就可以正常配置代理方式了

#配置(prefix是安装路径,enable-mods-shared=all表示编译配置所有so文件)

./configure --prefix=/usr/local/apache --enable-mods-shared=all

 php编译案例:

./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/php5 --disable-debug --enable-ftp --enable-inline-optimization --enable-magic-quotes --enable-mbstring --enable-safe-mode --enable-wddx=shared --with-gd --with-gettext --with-regex=system --with-zlib --with-mcrypt --enable-sockets

单独编译apache可以进行这样的操作

[root@localhost apache]#./configure --prefix=/usr/local/apache --enable-so --enable-mods-shared="proxy proxy_http proxy_ftp proxy_connect headers"
编译
[root@localhost apache]# make
检查编译后的是否有编译出so文件
[root@localhost apache]# cd /usr/local/apache/modules
[root@localhost modules]#]# ls
httpd.exp       mod_proxy_ajp.so       mod_proxy_connect.so mod_proxy_http.so
mod_headers.so mod_proxy_balancer.so mod_proxy_ftp.so      mod_proxy.so
如果存在以上文件则说明编译成功
安装
[root@localhost apache]# make install
启动APACHE
[root@localhost apache]# /usr/local/apache/bin/httpd -k start
测试如果输出IT works那么就ok了

附:

tomcat 404页面设置方法在web.xml里面加入

     <error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
      </error-page>

添加404.jsp页面文件,重新启动tomcat可生效