apache反向代理tomcat的两个代理模式及相关的会话保持配

2018-06-19  本文已影响0人  小尛酒窝

一、前言

apache服务器默认可以将jsp动态内容通过proxy_http_module(此模块对应tomcat的8080端口)和proxy_ajp_module代理模块(此模块对应tomcat的8009端口)来将会话代理到tomcat服务器上做解析处理。此时的Apache只作为调度器,转发HTTP请求。然后等待tomcat服务器的HTTP响应,并转发给用户。Tomcat集群作为实际的服务器,则负责处理HTTP请求。

配置拓扑图

二、配置Tomcat

1、配置tomgcatA服务器

#自行下载jdk和tomcat的源码包并防止在/usr/local/src目录下
#编译安装jdk
[root@tomcatA ~]# cd /usr/local/src/
[root@tomcatA src]# tar xf jdk-10.0.1_linux-x64_bin.tar.gz
[root@tomcatA src]# ln -sv /usr/local/src/jdk-10.0.1 /usr/local/jdk
‘/usr/local/jdk’ -> ‘/usr/local/src/jdk-10.0.1’
[root@tomcatA src]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
[root@tomcatA src]# source /etc/profile.d/jdk.sh
[root@tomcatA src]# java -version
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)

#编译安装tomcat
[root@tomcatA src]# tar xf apache-tomcat-7.0.88.tar.gz 
[root@tomcatA src]# ln -sv /usr/local/src/apache-tomcat-7.0.88 /usr/local/tomcat
‘/usr/local/tomcat’ -> ‘/usr/local/src/apache-tomcat-7.0.88’
[root@tomcatA src]# vim /etc/profile.d/tomcat.sh
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$TOMCAT_HOME/bin:$PATH
[root@tomcatA src]# source /etc/profile.d/tomcat.sh

#添加tomcat测试页面
[root@tomcatA src]# mkdir -pv /usr/local/tomcat/webapps/test/{WEB-INF,META-INF,classes,lib}
mkdir: created directory ‘/usr/local/tomcat/webapps/test’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/WEB-INF’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/META-INF’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/classes’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/lib’
[root@tomcatA src]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.example.com</h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("example.com","example.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html

#启动tomcat服务
[root@tomcatA src]# /usr/local/tomcat/bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcatA src]# systemctl stop firewalld
[root@tomcatA src]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@tomcatA src]# setenforce 0

2、配置tomcatB

TomcatB服务器配置大体与TomcatA服务器差不多,只需修改index.jsp的内容为如下,其余的配置参考TomcatA的配置即可。

[root@tomcatB src]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="green">TomcatB.example.com</h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("example.com","example.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html

三、配置apache

1、使用http模式进行负载调度

#安装httpd服务
[root@apache ~]# yum install -y httpd

#创建httpd配置文件
[root@apache ~]# vim /etc/httpd/conf.d/httpproxy.conf
<proxy balancer://tomcatsrvs>    #定义一个负载均衡的后端服务器组
        BalancerMember http://192.168.0.83:8080  #设置一个负载均衡成员
        BalancerMember http://192.168.0.84:8080
        ProxySet lbmethod=byrequests  #设置代理负载均衡的策略,默认为byrequests(按照请求的次数负载),其他常用选项还有bytraffic(按照流量均衡)、bybusyness(优先分配给活跃请求数最少的服务器)
</proxy>

<virtualhost *:80>
        servername www.ilinux.io
        ProxyRequests off    #关闭正向代理
        ProxyVia on    #为报文条件一个Via字段来标记报文来源于哪个主机    
        ProxyPreserveHost on      #传送原始请求的Host信息给被代理的机器。
        <Proxy *>
                Require all granted
        </Proxy>
        Proxypass / balancer://tomcatsrvs/    #将所有请求重定向到balancer://tomcatsrvs/进行处理
        ProxyPassReverse / balancer://tomcatsrvs/    #将所有请求反向代理到负载均衡后的url路径中。
        <Location />
                Require all granted
        </Location>
</virtualhost>

#启动httpd服务
[root@apache ~]# systemctl start httpd

此时配置的结果应为同一个IP多次访问http://192.168.0.81/test/ 能负载均衡到后端的两个tomcat主机之上。

http模式反代1
http模式反代2

2、使用ajp模式进行负载调度

ajp模式的配置与http模式的配置类似,但是在配置前需确认装载了相应的ajp模块。如果没有装载的话,需要另行编译安装。

[root@apache ~]# httpd -M | grep ajp
 proxy_ajp_module (shared)

#创建ajp模式的配置文件
[root@apache ~]# cp /etc/httpd/conf.d/httpproxy.conf /etc/httpd/conf.d/ajpproxy.conf
[root@apache ~]# vim /etc/httpd/conf.d/ajpproxy.conf
<proxy balancer://ajpsrvs>
        BalancerMember ajp://192.168.0.83:8009  #调用ajp模块代理到tomcat的ajp connector监听的8009端口
        BalancerMember ajp://192.168.0.84:8009
        ProxySet lbmethod=byrequests
</proxy>

<virtualhost *:80>
        servername ajp.ilinux.io
        ProxyRequests off
        ProxyVia on
        ProxyPreserveHost on
        <Proxy *>
                Require all granted
        </Proxy>
        Proxypass / balancer://ajpsrvs/
        ProxyPassReverse / balancer://ajpsrvs/
        <Location />
                Require all granted
        </Location>
</virtualhost>

#重启httpd服务
[root@apache ~]# systemctl restart httpd

此时配置的结果应为同一个IP多次访问http://ajp.ilinux.io/test/ 能负载均衡到后端的两个tomcat主机之上。

ajp模式结果1
ajp模式结果2

四、配置会话保持和启用负载均衡管理页面

1、启用负载均衡管理页面

修改此前的http和ajp模式的配置文件。

#在<virutalhost>和</virtualhost>之间添加下述配置启用balancer的管理配置界面
        <Location /balancer-manager>
                SetHandler balancer-manager
                ProxyPass !
                Require all granted
        </Location>

#重启
[root@apache ~]# systemctl restart httpd
负载均衡管理界面1 负载均衡管理界面2

2、使用stickysession来实现会话保持

修改httpd对应的配置文件。

#编辑http或ajp模式的配置文件,修改添加下述配置
[root@apache ~]# vim /etc/httpd/conf.d/httpproxy.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED    #指当临时变量BALANCER_ROUTE_CHANGED被设置也就是初次建立连接或是上次负载服务器宕掉切换负载服务器的时候,创建cookie名叫ROUTEID,值为.后加配置的route值,如Set-Cookie ROUTEID=.node1 
<proxy balancer://tomcatsrvs>
        BalancerMember http://192.168.0.83:8080 route=TomcatA  #设置route标记为TomcatA
        BalancerMember http://192.168.0.84:8080 route=TomcatB  #设置route标记为TomcatB
        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID  #设置session标识cookie名 
</proxy>

#重启httpd服务
[root@apache ~]# systemctl restart httpd

修改tomcat的server.xml文件。

#在相应的tomcat服务器上修改其sever.xml文件,添加与服务器对应的jvmRoute="TomcatA"
[root@tomcatA ~]# vim /usr/local/tomcat/conf/server.xml
 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">

#重启tomcat服务
[root@tomcatA ~]# catalina.sh stop
[root@tomcatA ~]# catalina.sh start

配置完成后同一个IP多次访问http://www.ilinux.io/test都会被调度到同一个后端服务器去处理。

stickysession效果演示
上一篇 下一篇

猜你喜欢

热点阅读