使用httpd反向代理模块实现tomcat负载均衡集群(上)

前言

 tomcat介绍:

  tomcat是一个免费开放源代码的web应用服务器,不是一个完整意义上的Java EE服务器;它甚至都没有提供哪怕对一个主Java EE API的实现,但由于遵守apache开源协议,tomcat却有为众多的java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss和JOnAS等。tomcat工作在jdk(Java Development Kit)之上;要想使用tomcat必须先安装jdk,jdk分为open jdk和 Oracle jdk,可根据自己的需要选择相应的jdk来实现tomcat实例。

一、tomcat相关件介绍

1、配置文件介绍

 sever.xml:tomcat核心配置文件;

 context.xml:每个webapp都有其配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC;此配置文件为所有的webapp提供默认配置

 web.xml: 每个webapp部署之后才能被访问;此配置文件则用于为所有webapp提供默认部署方式

 tomcat-users.xml: 用于认证账号配置文件

 catalina.policy: 当使用-secruity启动tomcat实例时通过读取此配置文件来定义其安全运行策略

 catalina.properties: java属性的定义文件,用于设定类加载器路径,以及一些jvm性能调整的相关参数

 logging.properties: 日志相关的配置文件

2、tomcat的组件:

 1.png

顶级类组件:Server,代表一个tomcat实例

服务类组件:Service,将连接器关联至内部的Engine引擎

连接器组件:Connector,常用的有http、https、ajp(Apache JServ Protocol)

容器类组件:Engine,代表一个web container

  包含:host(虚拟主机)、context(主机配置文件)

被嵌套类组件:valve,logger,realm,….

二、配置http代理tomcat

 1、实验环境:

     2.png

tomcat主机:

 node1: 172.16.2.14/24

 node2: 172.16.2.13/24

http主机
 node3: 172.16.2.12/24

软件:

tomcat下载地址:http://tomcat.apache.org/

jdk下载地址(Oracle):http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

3.png

2、安装jdk

[root@node1 tomcat]# rpm -ivh jdk-8u45-linux-x64.rpm   \\jdk无依赖包,直接rpm安装即可
[root@node1 tomcat]# vim /etc/profile.d/java.sh  \\声明环境变量
  export JAVA_HOME=/usr/java/latest
  export PATH=$JAVA_HOME/bin:$PATH
[root@node1 tomcat]# source /etc/profile.d/java.sh  \\重新读取配置
[root@node1 tomcat]# java -version    \\查看java的版本信息,若出现以下信息则表示安装jdk成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

node2安装jdk同node1一样,这里就不在演示了

3、安装tomcat

[root@node1 tomcat]# tar xf apache-tomcat-7.0.63.tar.gz -C /usr/local/  \\加压tomcat软件包
[root@node1 tomcat]# cd /usr/local/
[root@node1 local]# ln -sv apache-tomcat-7.0.63/ tomcat \\为tomcat解压后的文件创建软连接
[root@node1 local]# vim /etc/profile.d/tomcat.sh   \\为tomcat声明环境变量
    export CATALINA_HOME=/usr/local/tomcat 
    export PATH=$CATALINA_HOME/bin:$PATH
root@node1 local]# source /etc/profile.d/tomcat.sh   \\重新读取配置
[root@node1 local]# catalina.sh version  \\查看版本信息,若出现以下信息,则证明部署tomcat成功
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:     /usr
Using CLASSPATH:    /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.63
Server built:   Jun 30 2015 08:08:33 UTC
Server number:  7.0.63.0
OS Name:        Linux
OS Version:     2.6.32-504.el6.x86_64
Architecture:   amd64
JVM Version:    1.7.0_65-mockbuild_2014_07_16_06_06-b00
JVM Vendor:     Oracle Corporation

node2节点安装tomcat跟node1节点一样,这里不在介绍

3.1 启动tomcat访问测试(tomcat默认http协议监听在8080端口,ajp协议监听在8009端口)

[root@node1 ~]# catalina.sh start; ssh node2 'catalina.sh start'

访问测试:

5.png

4.png

3.2 添加虚拟主机:

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

[root@node1 tomcat]# mkdir -pv  /mylinux/ROOT/{lib,classes,WEB-INF}\\创建tomcat所需要的目录
[root@node1 tomcat]# vim /mylinux/ROOT/index.jsp  \\添加默认文档,内容如下:
  <%@ page language="java" %>                                   <html>                                               <head><title>TomcatA</title></head>                                 <body>                                               <h1><font color="red">TomcatA.magedu.com</font></h1>                        <table align="centre" border="1">                  
            <tr>                                                <td>Session ID</td>                                        <% session.setAttribute("magedu.com","magedu.com"); %>                     <td><%= session.getId() %></td>                                </tr>                                               <tr>                                                <td>Created on</td>                                       <td><%= session.getCreationTime() %></td>                           </tr>                                          </table>                                          </body>                                            </html>

重新启动tomcat,访问测试:

[root@node1 tomcat]# catalina.sh configtest  \\检查配置文件是否有语法错误
[root@node1 tomcat]# catalina.sh stop \\停止tomcat
[root@node1 tomcat]# catalina.sh start \\启动tomcat

访问测试:

6.png

3.3 修改node2节点跟node1节点一样,默认页面内容如下:

<%@ page language="java" %>                                   <html>                                               <head><title>TomcatB</title></head>                                 <body>                                               <h1><font color="blue">TomcatB.magedu.com</font></h1>                        <table align="centre" border="1">                  
            <tr>                                                <td>Session ID</td>                                        <% session.setAttribute("magedu.com","magedu.com"); %>                     <td><%= session.getId() %></td>                                </tr>                                               <tr>                                                <td>Created on</td>                                       <td><%= session.getCreationTime() %></td>                           </tr>                                          </table>                                          </body>                                            </html>

访问测试:

10.png

4、配置使用mod_http负载均衡tomcat

4.1安装httpd

[root@node3 ~]# yum -y install httpd  \\直接使用yum安装即可
[root@node3 ~]# httpd -M  \\确保httpd中含有以下proxy模块
 proxy_module (shared)
 proxy_balancer_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared)
 proxy_ajp_module (shared)
 proxy_connect_module (shared)

4.2 启动httpd,访问测试

[root@node3 httpd]# /etc/init.d/httpd start

访问:

8.png

4.3 修改httpd配置文件,内容如下

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

上述参数解释:

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

4.4 重新启动httpd,访问测试

[root@node3 httpd]# httpd -t  \\测试配置文件语法错误
[root@node3 httpd]# /etc/init.d/httpd restart  \\重启启动httpd

访问测试:

9.png 11.png

5、使用mod_ajp实现tomcat负载均衡:

5.1修改httpd配置文件如下:

[root@node3 conf.d]# vim mod_ajp.conf 
    <Proxy balancer://cluster>
      BalancerMember ajp://172.16.2.14:8009 loadfactor=1  \\修改使用ajp协议
      BalancerMember ajp://172.16.2.13:8009 loadfactor=1  \\修改使用ajp协议
      ProxySet lbmethod=byrequests
    </Proxy>
    
    NameVirtualHost *:80
    <VirtualHost *:80>
      servername www.test.com
      ProxyVia On
      ProxyRequests off
      ProxyPreserveHost on
      ProxyPass  / balancer://cluster stickysession=JESSIONID
      ProxyPassReverse / balancer://cluster stickysession=JESSIONID
    </VirtualHost>

5.2 重启httpd,访问测试

[root@node3 conf.d]# httpd -t
[root@node3 conf.d]# /etc/init.d/httpd restart

访问测试:

12.png 13.png

原创文章,作者:马行空,如若转载,请注明出处:http://www.178linux.com/6325

(0)
马行空马行空
上一篇 2015-07-21
下一篇 2015-07-21

相关推荐

  • 文本处理工具

    首先介绍一下wc 这个工具,一看到这个词,我不禁捧腹大笑,这不是我们经常要去的地方吗?其实我们都错了,厕所的正确翻译为toilet,为什么叫wc 呢?这中间还有个故事,在这里就大概说一下吧。 很早以前,厕所Toilet里都有水箱watercloset, 人们一提到water closet就想到了toilet,因此watercloset就成了toil…

    2017-07-29
  • Linux文件类型及颜色标识

    文件类型(共7种): – :普通文件 d:目录文件 (directory) c:字符设备文件 (char) b:块设备文件 (block) s:本地域套接口 (socket) p:有名管道 (pipeline) l:符号连接 (link) 关于硬链接、软连接、复制之间的区别说明: 上图中,我为photo.png这个图片文件建立了一个拷贝(phot…

    Linux干货 2016-10-16
  • linux中用ACL实现灵活的权限管理

    ACL是什么?? ACL英文原意是Access Control List(访问控制列表).它能够实现灵活的权限管理,除了文件的所有者,所属组和其他人,设置相应的权限外,ACL允许你给任何用户或是用户组设置任何文件/目录的访问权限(注意的是有些不支持数字模式的权限给定) ACL有什么用?? 作为UGO权限管理的补充,acl有GUO办不到或者是难以办到的功能 &…

    Linux干货 2016-08-05
  • 马哥教育网络20期—nginx

    Nginx 一. Nginx 特性 二. Nginx 基本架构 三. Nginx 基本功能 四. Nginx 安装 五. Nginx 配置文件 六. Nginx http服务功能测试 七. Nginx LNMP 一. Nginx 特性 模块化,目前只能将模块编译进Nginx,暂时不支持动态装卸载模块.(httpd优势) 可靠性,一个主进程(master)控制…

    Linux干货 2016-06-26
  • TCP三次握手和四次挥手

    TCP三次握手 有两台机器,A是客户端(主动发起请求的人),B是服务器端(被动接受请求的人),客户端A刚开始没有人和他通讯,所以客户端A的状态是CLOSDE(关闭的),服务器端B刚开始的状态也是CLOSDE,但是总有人去访问他,所以服务器端B开启了LISTEN(收听)状态。 (1)假设A机器想链接B机器了,他就会向B机器发送一个建立链接的请求,这个建立链接请…

    2017-08-31
  • 文本处理三剑客之sed

    文本处理三剑客之sed sed概述 sed使用示例 sed的高级应用 sed概述 sed, 作为文本三剑客之一,其定位就是一个编辑器, 而且sed是一个流式编辑器(stream editor),其主要功能是过滤和转换文本。 sed – stream editor for filtering and&…

    Linux干货 2016-08-12