- 博客/
nginx负载均衡apache+tomcat集群及session server cluster的实现
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中,从而加速客户端会话访问,实现动态站点加速。
本文集群架构如下图:
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#
- 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>
- 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 "%r" %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>
- 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>
- 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=""
测试会话保持#
- 启动服务,在浏览器中访问
- 刷新页面
从测试结果可以看出,session ID 与 session 储存节点位置都保持不变,至此基于session server cluster的会话保持已经实现。