目前,为了使web能适应大规模的访问,需要实现应用的集群部署。集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制
整体作用:
nginx做为反向代理,实现静动分离,将客户动态请求根据权重随机分配给两台tomcat服务器,redis做为两台tomcat的共享session数据服务器,当然可以加mysql做为两台tomcat的后端数据库,本实验没有加。。。
使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现零宕机的7x24效果。因为将会话存储在Redis中,因此Nginx就不必配置成stick粘贴某个Tomcat方式,这样才能真正实现后台多个Tomcat负载平衡
实验环境(所有软件都实验yum安装):
nginx(需要epel源)
tomcat(需要epel)
Redis
(1)nginx配置部分
upstream tomcat {
server 192.168.6.16:8080;
server 192.168.6.6:8080;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://tomcat;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
(2)Tomcat
在/etc/tomcat/context.xml里添加如下语句
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.6.17" #Redis主机
password="123456" #Redis验证密码,如果没有验证可不写
port="6379"
database="0"
maxInactiveInterval="60"/>
拷贝jar文件到/usr/share/java/tomcat目录下,两个tomcat服务器一样
创建测试文件,在另一个tomcat服务器可以换一下名字,便于区别
<%@ 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("tomcatA","tomcatA"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
启动服务,测试单个tomcat服务器看是否能获取到sessionID
(3)Redis
修改配置文件如下:
bind 192.168.6.17
requirepass 123456
重启服务,刷新页面,登录Redis服务器即可看到存储的sessionID值
[root@node1 ~]# redis-cli -a 123456 -h 192.168.6.17
192.168.6.17:6379> KEYS *
1) "B12C467021F40DC75BC7B0C422238C98"
测试:
通过nginx调度,看sessionID是否改变,如果内容改变sessionID不变说明成功