centos 上tomcat+nginx+redis 实现负载均衡和session共享

概述

tomcat集群配置有多种方式,这里讨论的是centos 上tomcat+nginx+redis实现集群和session共享。
如同把大象装进冰箱需要分三步走一样,tomcat集群的配置也是一样,需要以下几个步骤:
1.安装jdk,配置环境变量;
2.安装配置tomcat;
3.安装nginx,配置实现负载均衡;
4.安装配置redis,配置tomcat,实现session共享;
5.使用测试用例进行测试。

jdk的安装和配置

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用户下,环境变量的配置会不一样。

安装配置tomcat

下载 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启动端口不重复。

使用nginx搭建集群tomcat8

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需要知道自己需要哪个版本,有针对性的安装,比如如果需要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 可通过密码启动

配置tomat,实现session 共享

所谓的session 共享,就是当请求落在不同的服务器上时,能够保持会话的一致性,避免用户重复登录。其实现依赖于额外的jar包和相应的配置文件。
在开源项目下
https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/tag/2.0.3
centos 上tomcat+nginx+redis 实现负载均衡和session共享_第1张图片
解压后:
centos 上tomcat+nginx+redis 实现负载均衡和session共享_第2张图片
将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中
centos 上tomcat+nginx+redis 实现负载均衡和session共享_第3张图片
启动tomcat,访问效果如下:
centos 上tomcat+nginx+redis 实现负载均衡和session共享_第4张图片
刷新页面:
centos 上tomcat+nginx+redis 实现负载均衡和session共享_第5张图片
可以看到,实现了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单点故障是使用这种方式需要解决的问题。

你可能感兴趣的:(运维)