tomcat集群配置有多种方式,这里讨论的是centos 上tomcat+nginx+redis实现集群和session共享。
如同把大象装进冰箱需要分三步走一样,tomcat集群的配置也是一样,需要以下几个步骤:
1.安装jdk,配置环境变量;
2.安装配置tomcat;
3.安装nginx,配置实现负载均衡;
4.安装配置redis,配置tomcat,实现session共享;
5.使用测试用例进行测试。
jdk的安装配置比较简单,网上有各种资料可以查询,这里做一个简单说明。总的来说就是下载压缩包,上传到服务器,解压,然后配置环境变量,具体如下:
上传jdk-8u111-linux-x64.tar.gz并解压缩到/home/soft/jdk1.8.0_111
//jdk文件上传到了/home/ftp目录下
tar -zxvf /home/ftp/jdk-8u111-linux-x64.tar.gz -C /home/soft
//打开/etc/profile文件
在文件末尾插入如下内容
export JAVA_HOME=/home/soft/jdk1.8.0_111
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
执行profile
source /etc/profile
如果在非root用户下,环境变量的配置会不一样。
下载 apache-tomcat-8.5.38.tar.gz,Linux下解压tomcat并部署工程
tar -xzvf apache-tomcat-8.5.38.tar.gz
重命名tomcat 为tomcat_1,并复制一个 tomcat_2,用来做负载均衡。
对tomcat的端口进行修改,分别是8080和8008,保证同一台机器上两个tomcat启动端口不重复。
linux下安装 nginx的方式参见:
https://www.cnblogs.com/emberd/p/4536238.html,
nginx的配置有几个关键的地方:
upstream my_nginx{
#ip_hash;
server 127.0.0.1:8080 max_fails=1 fail_timeout=10s;
server 127.0.0.1:8008 max_fails=1 fail_timeout=10s;
}
server {
listen 5055;
server_name localhost;
charset utf-8;
#access_log /opt/log/nginx/dd_m_access.log;
#error_log /opt/log/nginx/dd_m_error.log;
#charset koi8-r;
#access_log logs/host.access.log main;
location /test {
proxy_set_header Host $host:5055; #端口跟上面的一致
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://my_nginx; #此处my_nginx和上面的upstream my_nginx对应
client_max_body_size 10m;
client_body_buffer_size 256k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 512k;
root html;
index index.html index.htm;
}
这样nginx的负载均衡就配置好了。关于nginx还有更深入的内容有待研究,如健康检查以及通过keepalived避免单点故障。
安装Redis需要知道自己需要哪个版本,有针对性的安装,比如如果需要redis GEO这个地理集合的特性,那么redis版本就不能低于3.2版本,由于这个特性是3.2版本才有的。另外需要注意的是,Redis约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版(如2.8版、3.0版),奇数版本是非稳定版(如2.7版、2.9版),生产环境下一般需要使用稳定版本。
下载安装包
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
解压安装包并安装
tar xzf redis-4.0.2.tar.gz
cd redis-4.0.2
make
make install
配置密码连接方式
配置 redis.conf 去掉bind 127.0.0.1 &&去掉密码的注释。
cd src
./redis-server ../redis.conf 可通过密码启动
所谓的session 共享,就是当请求落在不同的服务器上时,能够保持会话的一致性,避免用户重复登录。其实现依赖于额外的jar包和相应的配置文件。
在开源项目下
https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/2.0.3
解压后:
将lib文件夹的jar包复制到tomcat的lib中,conf文件夹的redis-data-cache.properties文件按需配置并拷贝到tomcat的conf中,修改配置:
#-- Redis data-cache configuration
#- redis hosts ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, ....
redis.hosts=127.0.0.1:6379
#- redis password (for stand-alone mode)
redis.password=foobared
#- set true to enable redis cluster mode
redis.cluster.enabled=false
#- redis database (default 0)
redis.database=0
#- redis connection timeout (default 2000)
redis.timeout=2000
再将代码
加入tomcat的conf---->context.xml中
启动tomcat,访问效果如下:
刷新页面:
可以看到,实现了Session共享和负载均衡。
其测试代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'index.jsp' starting page
SessionID:<%=session.getId()%>
SessionIP:<%=request.getServerName()%>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 2");
%>
目前存在的问题:tomcat的启动速度比原来慢一些。在正式的项目中,还可以通过spring框架自带的spring-session来实现redis下的session共享。
实现tomcat集群的方案有多种,针对不同的应用场景,nginx+redis的方式是目前较为普遍的做法,需要注意的是,这仅仅是完成了tomcat集群的第一步,因为所有的流量都通过nginx接入,nginx就承担了整个系统的安全,一旦nginx故障,整个系统就不可用,因此nginx单点故障是使用这种方式需要解决的问题。