首页 > 代码库 > 高性能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 |
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实现负债均衡反向代理实现