Nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存、web server负载均衡等功能,由于其轻量级、高性 能、高可靠等特点在互联网项目中有着非常普遍的应用,相关概念网上有丰富的介绍。分布式web server集群部署后需要实现session共享,针 对 tomcat 服务器的实现方案多种多样,比如 tomcat cluster session 广播、nginx IP hash策略、 nginx sticky module等方案,本文主要介绍了使用 redis 服务器进行 session 统一存储管理的共享方案。

使 用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7×24运营效果。因为 将会话存储 在Redis中,因此Nginx就不必配置成stick粘粘某个Tomcat方式,这样才能真正实现后台多个Tomcat负载平衡,用户请求 能够发往任何 一个tomcat主机,当我们需要部署新应用代码时,只要停止任何一台tomcat,所有当前在线用户都会导向到运行中的tomcat实 例,因为会话数据 被序列化到Redis,在线用户不会受到影响,一旦停掉的tomcat实例上线,另外其他重复部署过程。

实验环境

IP            Roles               portnode1 192.168.9.10  nginx,redis,tomcat  80,1111,8080node2 192.168.9.70  tomcat              8080

软件工具包

apache-tomcat-7.0.68.tar
redis-3.0.7.tar
jdk-7u79-linux-x64.rpm
nginx-1.0.15-12.el6.x86_64.rpm

tomcat需要的jar包

commons-logging-1.1.3.jar
commons-pool2-2.2.jar
jedis-2.5.2.jar
tomcat-juli.jar
tomcat-redis-session-manage-tomcat7.jar
安装redis
1. Redis 安装
== Redis 源码安装
— 参照源码 README
— 默认端口 6379

*** 安装redis之前先要确认系统已经安装了GCC和libc库 ***

wget http://download.redis.io/releases/redis-3.0.7.tar.gztar xf redis-3.0.7.tar.gzcd redis-3.0.7make# make testmake PREFIX=/usr/local/redis install

 

== 可执行命令

redis-server    Redis服务系统redis-cli       Redis一个客户端管理工具redis-benchmark 用来检测redis性能redis-check-aof & redis-check-dump 用来处理损坏的数据文件redis-sentinel -> redis-server   < soft link >cd utils./install_server.sh^_^[15:50:34][root@master01 utils]#bash install_server.shWelcome to the redis service installerThis script will help you easily set up a running redis serverPlease select the redis port for this instance: [6379] 1111Please select the redis config file name [/etc/redis/1111.conf]Selected default – /etc/redis/1111.confPlease select the redis log file name [/var/log/redis_1111.log]Selected default – /var/log/redis_1111.logPlease select the data directory for this instance [/var/lib/redis/1111]Selected default – /var/lib/redis/1111Please select the redis executable path [/usr/sbin/redis-server] /usr/local/redis/bin/redis-serverSelected config:Port           : 1111Config file    : /etc/redis/1111.confLog file       : /var/log/redis_1111.logData dir       : /var/lib/redis/1111Executable     : /usr/local/redis/bin/redis-serverCli Executable : /usr/bin/redis-cliIs this ok? Then press ENTER to go on or Ctrl-C to abort.Copied /tmp/1111.conf => /etc/init.d/redis_1111Installing service…Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server…Installation successful!

 

Redis 系统配置

echo "vm.overcommit_memory = 1" >> /etc/sysctl.confsysctl vm.overcommit_memory=1echo 511 > /proc/sys/net/core/somaxconn

启动服务

/etc/init.d/redis_1111 start

配置文件可以用默认的配置,从服务器上配置文文件打开slavefo 加上主服务器的ip和端口,还有其他的参数如日志和dump.rdb保存路径可以适当修改

FAQ:

make时如果有类似如下报错:

Selecting a non-default memory allocator when building Redis is done by setting
the  environment variable. Redis is compiled and linked against libc
 by default, with the exception of je being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.

make MALLOC=libc

安装 JDK and Tomcat

# wget -c --header "Cookie: oraclelicense=accept-securebackup-cookie" `curl -s http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html | awk -F'"' '/jdk\-7.*\-linux\-x64.rpm/{print $12;exit}'`# rpm -ivh jdk-7u79-linux-x64.rpm# cat > /etc/profile.d/java.sh << EOFJAVA_HOME=/usr/java/latestPATH=\$JAVA_HOME/bin:\$PATHexport JAVA_HOME PATHEOF# wget -c `curl -s "https://tomcat.apache.org/download-70.cgi" | awk -F'"' '/apache\-tomcat\-7.*.tar.gz/{print $2;exit}'`# tar xf apache-tomcat-7.*.tar.gz -C /usr/local/# ln -sv /usr/local/apache-tomcat-7.* /usr/local/tomcat# cat > /etc/profile.d/tomcat.sh << EOFexport CATALINA_HOME=/usr/local/tomcatexport PATH=\$CATALINA_HOME/bin:\$PATHEOF# source /etc/profile.d/java.sh# source /etc/profile.d/tomcat.sh# catalina.sh versionUsing CATALINA_BASE:   /usr/local/tomcatUsing CATALINA_HOME:   /usr/local/tomcatUsing CATALINA_TMPDIR: /usr/local/tomcat/tempUsing JRE_HOME:        /usr/java/latestUsing CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jarServer version: Apache Tomcat/7.0.68Server built:   Feb 8 2016 20:25:54 UTCServer number:  7.0.68.0OS Name:        LinuxOS Version:     2.6.32-573.8.1.el6.x86_64Architecture:   amd64JVM Version:    1.7.0_79-b15JVM Vendor:     Oracle Corporation

 

*** 将jar包全都拷进tomcat lib目录下 ***

^_^[14:43:41][root@master01 lib]#pwd/usr/local/tomcat/lib^_^[14:44:47][root@master01 lib]#ls -lth | tail -5-rw-r--r-- 1 root root  61K Nov 13 15:18 commons-logging-1.1.3.jar-rw-r--r-- 1 root root 106K Nov 13 15:18 commons-pool2-2.2.jar-rw-r--r-- 1 root root 308K Nov 13 15:18 jedis-2.5.2.jar-rw-r--r-- 1 root root  74K Nov 13 15:18 tomcat-juli.jar-rw-r--r-- 1 root root  20K Nov 13 15:18 tomcat-redis-session-manage-tomcat7.jar

修改conf目录下context.xml配置文件,session共享保存设置

在<Context>标签中

添加测试页

vim webapps/ROOT/test.jsp<%@ page language="java" %>  TomcatI      

TomcatI.suzf.net

    
              Session ID    <% session.setAttribute("tomcat.suzf.net","tomcat.suzf.net"); %>        <%= session.getId() %>                    Created on        <%= session.getCreationTime() %>           

将tomcat目录拷贝到其他tomcat服务器

将测试页代码 Titile 和 color 修改下,以作区分。

Nginx安装

yum install nginx -y Nginx 相关配置# grep -v "^$\|^.*#"  /etc/nginx/nginx.confuser              nginx;worker_processes  1;error_log  /var/log/nginx/error.log;pid        /var/run/nginx.pid;events {    worker_connections  1024;}http {    include       /etc/nginx/mime.types;    default_type  application/octet-stream;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';    upstream suzf-net-tomcat {       server 192.168.9.10:8080;       server 192.168.9.70:8080;    }    server {        listen 80;        server_name tomcat.suzf.net;        location / {             index   index.jsp index.html index.htm;             proxy_pass http://suzf-net-tomcat;             proxy_redirect off;             proxy_set_header Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        }    }    access_log  /var/log/nginx/access.log  main;    sendfile        on;    server_tokens   off;    keepalive_timeout  65;    include /etc/nginx/conf.d/*.conf;}

 

检测nginx 配置文件 & 重载配置文件

#/etc/init.d/nginx configtest nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful#/etc/init.d/nginx  reloadReloading nginx:                                           [  OK  ]

浏览器验证:

 

 查看Redis 数据

 

通过 tomcat-redis-session-manager  自动获取tomcat 所需 jar 包 

*** 未测 *** 

tomcat-redis-session-manager 是一个用来将 Tomcat 的 Session 数据存储在 Redis 库中的项目。

官网:

*** 由于源码构建基于 gradle,请先配置 gradle 环境。***

wget https://downloads.gradle.org/distributions/gradle-2.10-all.zipunzip -q gradle-2.10-all.zip -d /usr/local/ln -sv /usr/local/gradle-2.10 /usr/local/gradle#echo "export PATH=/usr/local/gradle/bin:\$PATH" > /etc/profile.d/gradle2.10.sh#source /etc/profile.d/gradle2.10.sh

 

安装 tomcat-redis-session-manager

git clone https://github.com/jcoleman/tomcat-redis-session-manager.gitcd tomcat-redis-session-manager/mv build.gradle build.gradle.bakvim build.gradle#diff -ruN build.gradle*--- build.gradle 2016-01-04 07:07:59.000000000 +0800+++ build.gradle.old 2016-03-18 10:48:15.620704187 +0800@@ -44,13 +44,8 @@   archives sourcesJar }-//signing {-//  sign configurations.archives-//}--task copyJars(type: Copy) {-  from configurations.runtime-  into 'dist'  +signing {+  sign configurations.archives } uploadArchives {@@ -58,9 +53,9 @@     mavenDeployer {       beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }-      //repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {-      //  authentication(userName: sonatypeUsername, password: sonatypePassword)-      //}+      repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {+        authentication(userName: sonatypeUsername, password: sonatypePassword)+      }       //repository(url: "https://oss.sonatype.org/content/repositories/snapshots") {       //  authentication(userName: sonatypeUsername, password: sonatypePassword)       //}@@ -101,4 +96,4 @@       }     }   }-}\ No newline at end of file+}# gradle build -x test copyJars# mkdir /tmp/jar# cp -a build/libs/*.jar /tmp/jar/ && cp -a dist/*.jar /tmp/jar/

最后将 jar 包 分发到tomcat 项目中

 License:

 本文出自 。 如未注明,均为 SUZF.NET 原创。
 转载请注明出处: