首页 > 代码库 > 高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现

高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现

  httpd作为前端的反向代理,那有两种选择,一是利用"proxy_module"这个代理框架下的"proxy_http_module"与"proxy_ajp_module"这两个代理模块,这两个代理模块是独自工作的,二是利用“mod_jk”模块实现httpd的反向代理至后端tomcat。


下面通过以下架构部署httpd+tomcat实现方向代理:

反向代理系统架构规划如下:

服务器角色
服务器IP
httpd
eth0:172.16.100.1/16 eth1:192.168.56.10/24
Tomcat1

eth0:192.168.56.11/24

Tomcat2eth0:192.168.56.12/24
statichost(httpd)
eth0:192.168.56.13/24

配置过程如下:

Tomcat服务安装配置:

(1)安装JDK

# rpm -ivh jdk-7u9-linux-x64.rpm 
--安装JDK后生成的文件
# cd /usr/java/ ; ll
total 4
lrwxrwxrwx  1 root root   16 Sep 27 09:09 default -> /usr/java/latest
drwxr-xr-x 10 root root 4096 Sep 27 09:09 jdk1.7.0_09
lrwxrwxrwx  1 root root   21 Sep 27 09:09 latest -> /usr/java/jdk1.7.0_09

--配置JDK环境变量
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_09
export PATH=$PATH:$JAVA_HOME/bin
--执行使环境变量生效
# . /etc/profile.d/java.sh
--测试如下:
# java -version
java version "1.7.0_45"        --jdk版本
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

(2)安装tomcat

--解压tomcat包至/usr/local下
# tar xf apache-tomcat-7.0.67.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv apache-tomcat-7.0.67 tomcat
--配置tomcat环境变量
# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
# . /etc/profile.d/tomcat.sh
--测试如下:
# catalina.sh version
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.7.0_09
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.67
Server built:   Dec 7 2015 13:07:11 UTC
Server number:  7.0.67.0
OS Name:        Linux
OS Version:     2.6.32-431.el6.x86_64
Architecture:   amd64
JVM Version:    1.7.0_09-b05
JVM Vendor:     Oracle Corporation

--为tomcat提供srv启动脚本
# vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
# 
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS=‘-Xms64m -Xmx128m‘
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

case $1 in
start)
  $CATALINA_HOME/bin/catalina.sh start;;
stop)
  $CATALINA_HOME/bin/catalina.sh stop;;
restart)
  $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
  $CATALINA_HOME/bin/catalina.sh start;;
*)
  echo "Usage: `basename $0` {start|stop|restart}"
  exit 1
  ;;
esac

# chmod +x /etc/init.d/tomcat
# chkconfig --add tomcat
# service tomcat start

--检查tomacat默认监听端口如下所示:
# ss -tunlp | grep java
tcp    LISTEN     0      100                   :::8080                 :::*      users:(("java",19525,42))
tcp    LISTEN     0      1       ::ffff:127.0.0.1:8005                 :::*      users:(("java",19525,47))
tcp    LISTEN     0      100                   :::8009                 :::*      users:(("java",19525,43))

tomcat添加虚拟主机(tomcat1和tomcat都使用相同步骤配置)

# vim /usr/local/tomcat/conf/server.xml
在server------>service--------->engine中定义
 <Host name="www.samlee.com"  appBase="/web"        --在Host中定义主机名、根目录位置
            unpackWARs="true" autoDeploy="true"> 
 <Context path="" docBase="/web/ROOT" reloadable="true" />   --定义虚拟路径,此处为空即没有指定,文档目录
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
   prefix="samlee_access_log." suffix=".txt"
   pattern="%h %l %u %t &quot;%r&quot; %s %b" />    --定义虚拟主机的日志信息
  </Host>
   
<Engine name="Catalina" defaultHost="www.samlee.com" >  --再此出将默认虚拟主机更改为自己定义的主机

--创建网站主目录 
# mkdir -pv  /web/ROOT/{lib,classes,WEB-INF}  --创建tomcat所需要的目录

建立测试访问测试页:

# vim /web/ROOT/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA </font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("abc","abc"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html


访问测试如下所示:

技术分享

技术分享



httpd服务安装配置:

系统环境:

# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

# uname -r
2.6.32-431.el6.x86_64

httpd版本及模块检查:

# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64

# httpd -M | grep proxy
Syntax OK
 proxy_module (shared)             --反向代理主模块
 proxy_balancer_module (shared)   
 proxy_ftp_module (shared)
 proxy_http_module (shared)        --http协议的反向代理模块
 proxy_ajp_module (shared)         --ajp协议的反向代理模块
 proxy_connect_module (shared)

配置使用mod_proxy反向代理至后端tomcat

第一种方式:http模式

# vim /etc/httpd/conf.d/mod_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on

ProxyPass / http://192.168.56.11:8080/
ProxyPassReverse / http://192.168.56.11:8080/

<Location />
  Order Allow,Deny
  Allow from all
</Location>

第二种方式:ajp模式

# vim /etc/httpd/conf.d/mod_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on

ProxyPass / ajp://192.168.56.11:8009/
ProxyPassReverse / ajp://192.168.56.11:8009/

<Location />
  Order Allow,Deny
  Allow from all
</Location>

配置完成后重启httpd服务:

# service httpd restart

访问测试如下所示:

技术分享



配置使用mod_proxy反向代理及负载均衡至后端tomcat

第一种方式:http模式

# vim /etc/httpd/conf/httpd.conf 
#DocumentRoot "/var/www/html" --将此行注释掉,使用虚拟主机实现
# vim /etc/httpd/conf.d/mod_http.conf 
<Proxy balancer://webcluster>  --定义集群名称
  BalancerMember http://192.168.56.11:8080 loadfactor=1 --添加集群节点,loadfactor代表权重
  BalancerMember http://192.168.56.12:8080 loadfactor=1
  ProxySet lbmethod=byrequests  --负载均衡的调度方法
</Proxy>
 
NameVirtualHost *:80  \\启用虚拟主机
<VirtualHost *:80>
  ServerName www.samlee.com
  ProxyVia on  --添加via信息
  ProxyRequests off  --关闭正向代理
  ProxyPreserveHost on   --支持虚拟合租记
  ProxyPass  / balancer://webcluster stickysession=JESSIONID  --将httpd请求至后端主机
  ProxyPassReverse / balancer://webcluster stickysession=JESSIONID--将httpd请求至后端主机
</VirtualHost>

第二种方式:ajp模式

# vim /etc/httpd/conf/httpd.conf 
#DocumentRoot "/var/www/html" --将此行注释掉,使用虚拟主机实现
# vim /etc/httpd/conf.d/mod_http.conf 
<Proxy balancer://webcluster>  --定义集群名称
  BalancerMember ajp://192.168.56.11:8009 loadfactor=1 --添加集群节点,loadfactor代表权重
  BalancerMember ajp://192.168.56.12:8009 loadfactor=1
  ProxySet lbmethod=byrequests  --负载均衡的调度方法
</Proxy>
 
NameVirtualHost *:80  \\启用虚拟主机
<VirtualHost *:80>
  ServerName www.samlee.com
  ProxyVia on  --添加via信息
  ProxyRequests off  --关闭正向代理
  ProxyPreserveHost on   --支持虚拟合租记
  ProxyPass  / balancer://webcluster stickysession=JESSIONID  --将httpd请求至后端主机
  ProxyPassReverse / balancer://webcluster stickysession=JESSIONID--将httpd请求至后端主机
</VirtualHost>

<Location /lbmanager>        --定义反向代理监控页面
        SetHandler balancer-manager
</Location>
ProxyPass /lbmanager !

访问测试如下所示:

技术分享

技术分享

上述参数解释:

ProxyPass {On|Off|Full|Block}

用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为off,即不启用此功能,On表示每个请求和响应报文均添加Via:, Full表示每个Via:行都会添加当前Apache服务器版本号信息;Block表示每个代理请求中的Via:都会被移除

ProxyRequests {On|Off}

是否开启Apache正向代理功能;启用此项时是为了代理http协议必须启用mod_proxy_http模块。同时,如果为Apache设置了proxypass,则必须将ProxyRequests设置为Off

ProxyPreserveHost {On|Off}

如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无须打开此功能

ProxyPass [path] !|url [key=value key=value ..]

将后端服务器某URL与当前服务器的某虚拟路径关联起来做为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某url路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。

mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保持至连接池中已备进一步使用。连接池大或其他设定可以通过在ProxyPass中使用key=value的方式定义。也可以使用PassSet定义。常用的key如下所示:

min连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小

max

连接池的最大容量,每个MPM都有自己独立的容量;其值与MPM本身无关,如prefork的总是为1,而其他的则取决于TheradsPerChild指令的值
loadfactor用于负载均衡集群配置中,定义对后端服务器的权重,取值范围为1-100
retry当apache将请求发送至后端服务器得到错误响应时等待多次时间以后再重试。单位是秒钟
如果proxy指定的是balacner://开头,即用与负载均衡时,其还可以接受一些特殊的参数,如下所示:

lbmethod

apache实现负载均衡的调度算法,默认为byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载均衡进行调度
maxattempts放弃请求之前实现故障转移的次数,默认为1,其最大值不应大于总结点数

nofailover

取值为On或Off,设置On时表示后端服务器故障时,用户的session将损坏;因此在后端服务器不支持session复制时可将其设置为On
stickysession调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID


配置使用mod_jk反向代理及负载均衡至后端tomcat

安装mod_jk

# yum -y groupinstall "Development Tools" "Server Platfrom Development"  --安装编译环境
# yum -y install httpd-devel  --安装httpd开发包
-安装tomcat-connectors连接工具
# tar xf tomcat-connectors-1.2.41-src.tar.gz -C /usr/src/
# cd /usr/src/tomcat-connectors-1.2.41-src/native/
# ./configure --with-apxs=`which apxs`
# make && make install

确认httpd的mod_jk模块是否编译成功

# ls -l /usr/lib64/httpd/modules/mod_jk.so 
-rwxr-xr-x 1 root root 1215715 Oct  6 17:14 /usr/lib64/httpd/modules/mod_jk.so

配置mod_jk配置文件如下所示:

# vim /etc/httpd/conf.d/mod_jk.conf
LoadModule jk_module modules/mod_jk.so              --装载mod_jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties  --指明运行时配置的文件的位置
JkLogFile log/mod_jk.log                            --指定log位置的路径
JkLogFile debug                                     --指定日志级别,根据需求自定义
JkMount /* WebCluster                               --将所有httpd请求转发至后端WebCluster集群中,名称自定义
JkMount /jk_status statA                            --启用jk状态监控页面

使用mod_jk定义后端主机及集群配置:

# vim /etc/httpd/conf.d/workers.properties
worker.list=WebCluster,statA            --定义工作列表
worker.TomcatA.type=ajp13               --定义后端TomcatA主机类型
worker.TomcatA.port=8009                --定义后端主机的监听端口
worker.TomcatA.host=192.168.56.11       --定义后端主机地址
worker.TomcatA.lbfactor=5
worker.TomcatB.type=ajp13
worker.TomcatB.port=8009
worker.TomcatB.host=192.168.56.12
worker.TomcatB.lbfactor=5
worker.WebCluster.type=lb                --定义WebCluster组的类型
worker.WebCluster.sticky_session=0       --定义WebCluster集群会话类型为0代表关闭会话保持,为1反之
worker.WebCluster.balance_workers=TomcatA,TomcatB  --将后端主机TomcatA,TomcatB加入至WebCluster组中
worker.statA.type=status                 --定义statA状态页面的类型

type有三种类型:
ajb13:用于负载调度
status:tomcat自身所带的监控页面,类似于httpd的status
lb:集群类型

修改tomcat主配置文件,在Engine修改如下所示:

tomcat节点:  
   <Engine name="Catalina" defaultHost="www.samlee.com" jvmRoute="TomcatA"> \\添加jvmRoute指令
tomcat节点
    <Engine name="Catalina" defaultHost="www.samlee.com" jvmRoute="TomcatB"> \\添加jvmRoute指令
  
--重启tomcat服务
# service tomcat restart

最后重启httpd服务:

# service httpd restart

访问测试如下所示:

技术分享

查看jk状态监控页:

技术分享






本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1859095

高性能Web服务之Httpd+Tomcat实现负债均衡反向代理实现