1. 博客/

nginx负载均衡apache+tomcat集群及session server cluster的实现

·327 字·2 分钟
Linux Tomcat

​ Tomcat 服务器是一个免费的开放源代码的Web 应用服务器, 是编译JSP\Servlet的容器,常用来处理动态请求。nginx和apache HTTP服务器是静态解析,擅长处理HTML及图片等静态请求,处理静态页面效率远高于tomcat。使用nginx的动静分离机制,可以将静态请求分发至静态服务器(nginx或者apache),而将动态请求分发至后端tomcat服务器处理,从而提高服务器的并发处理性能。tomcat支持HTTP和AJP两种协议的连接器,AJP协议比HTTP更稳定和更快,但是nginx仅支持HTTP协议,所以本文使用nginx做负载均衡,在后端web服务器上配置apache+tomcat服务并使用ajp协议,提高响应速度。

对于后端tomcat cluster的session会话管理,本文将使用MSM–Memcached_Session_Manager搭建 session server cluster, 实现session会话保持和高可用(session共享)。Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。但是,tomcat与memcached的结合并不是为了加速获取mysql数据的,而是仅仅把tomcat自己与客户端一侧维持的会话保存到memcached中,它与用户请求无关,是服务端主动记录client身份信息或者活动性的数据并存在memcached中,从而加速客户端会话访问,实现动态站点加速。

​ 本文集群架构如下图:

session server cluster

IP 地址分配:

  • nginx server : 192.168.196.130
  • web server 1 : 192.168.196.129
  • web server 2: 192.168.196.132
  • session server 1: 192.168.196.131
  • session server 2: 192.168.196.133

配置nginx LB server
#

$ yum install -y nginx
$ vim /etc/nginx/conf.d/tomcat.conf
upstream appsrvs {
        server 192.168.196.132:80;
        server 192.168.196.129:80;
}
server {
        listen 80 default_server;
        server_name www.fufeixiang.com;
        index index.jsp index.html;
        location / {
        proxy_pass http://appsrvs/; 
        }
}
$ service nginx start

本文重点是session server cluster的实现,这里只是简单配置nginx做负载均衡,没有做动静分离

配置apache+tomcat web server
#

  1. web server1 apache的配置
$ yum install -y httpd
$ vim /etc/httpd/conf.d/vhost_tom_ajp.conf
<Virtualhost *:80>
        ServerName www.vhost1.com
         ProxyRequests Off
         ProxyVia        On                                  <--响应报文中添加Proxyvia信息
         ProxyPreserveHost On                                <--向后端转发,保留client主机名
          <Proxy *>
         Require all granted
         </Proxy>
        ProxyPass / ajp://192.168.196.129:8009/
        ProxyPassReverse / ajp://192.168.196.129:8009/       <--使用ajp协议将请求转发至本机的tomcat
        <location />
             Require all granted
        </location>
</Virtualhost>
  1. tomcat server1 的配置
  • 安装包:java-1.8.0-openjdk-devel; tomcat-admin-webapps; tomcat-webapps; tomcat-docs-webapp

​ 对于session集群的共享问题,参考GitHub项目https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration , 使用memcached+javolution-serializer(可序列化工具)的解决方案。依据其配置说明:

  • 添加tomcat所依赖的Memcached_Session_Manage的库文件:

    javolution-5.4.3.1.jar memcached-session-manager-tc7-2.1.1.jar memcached-session-manager-2.1.1.jar msm-javolution-serializer-2.1.1.jar spymemcached-2.11.1.jar

$ mv javolution-5.4.3.1.jar memcached-session-manager-tc7-2.1.1.jar memcached-session-manager-2.1.1.jar msm-javolution-serializer-2.1.1.jar spymemcached-2.11.1.jar /usr/share/java/tomcat/

  • 修改tomcat主配置文件/etc/tomcat/server.xml
$ vim /etc/tomcat/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">          <--添加节点唯一标示

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/webapps/ROOT" reloadable="true" >      <--应用程序路径别名
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="n1:192.168.196.131:11211,n2:192.168.196.133:11211"  <--定义session server 节点
         failoverNodes="n2"	                                                 <--n2节点为backup server
         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"   
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="localhost_access_log." suffix=".txt"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
  • 创建测试程序
$ mkdir /data/webapps/ROOT/{classes,lib,WEB-INF}
$ vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
<html>
     <head><title>TomcatA</title></head>
           <body>
                <h1><font color="red">TomcatA.sflying.com</font></h1>
                <table align="centre" border="1">
                 <tr>
                 <td>Session ID</td>
                 <% session.setAttribute("sflying.com","sflying.com"); %>
                 <td><%= session.getId() %></td>
                 </tr>
                 <tr>
                 <td>Created on</td>
                 <td><%= session.getCreationTime() %></td>
                 </tr>
                 </table>
              </body>
</html>
  1. web server2 apache的配置
$ yum install -y httpd
$ vim /etc/httpd/conf.d/vhost_tom_ajp.conf
<Virtualhost *:80>
        ServerName www.vhost2.com
         ProxyRequests Off
         ProxyVia        On
         ProxyPreserveHost On
          <Proxy *>
         Require all granted
         </Proxy>
        ProxyPass / ajp://192.168.196.132:8009/
        ProxyPassReverse / ajp://192.168.196.132:8009/
        <location />
                Require all granted
        </location>
</Virtualhost>
  1. tomcat server2 的配置

参照tomcat server1的配置,下载依赖类库,并修改配置文件以下几项

server.xml –> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB">

/data/webapps/ROOT/index.jsp :

  • <head><title>TomcatA</title></head>
  • <h1><font color="red">TomcatA.sflying.com</font></h1>

配置memcached session server
#

$ yum install -y memcached
$ vim /etc/sysconfig/memcached
  PORT="11211"
  USER="nobody"
  MAXCONN="1024"				<-- 最大并发数		
  CACHESIZE="64"				<-- 根据实际情况调整,eg:2048M	
  OPTIONS=""

测试会话保持
#

  • 启动服务,在浏览器中访问
tomcat A
  • 刷新页面
tomcat B

从测试结果可以看出,session ID 与 session 储存节点位置都保持不变,至此基于session server cluster的会话保持已经实现。

Related

varnish缓存服务器的配置
·1095 字·6 分钟
Linux Varnish
DNS服务器据源地址解析的实现
·585 字·3 分钟
Linux DNS
使用XtraBackup工具实现MySQL数据备份及恢复
·1177 字·6 分钟
Linux Mysql Xtrabackup