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 |
| Tomcat2 | eth0: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 "%r" %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实现负债均衡反向代理实现
原文地址:http://gzsamlee.blog.51cto.com/9976612/1859095