Nginx+Tomcat+Redis實現session共享
架構圖:
基本環境 主機名 IP地址 安裝軟件 用途 Nginx 192.168.122.10 nginx-1.8.1.tar.gz 負載均衡 Tomcat1 192.168.122.12 apache-tomcat-7.0.68.tar.gz、jdk-7u79-linux-x64.gz Tomcat服務 Tomcat2 192.168.122.13 apache-tomcat-7.0.68.tar.gz、jdk-7u79-linux-x64.gz Tomcat服務 Redis 192.168.122.14 redis-3.0.7.tar.gz Session存儲
Tomcat要在Redis上實現Session共享的話就要以下幾個依賴包:【把它們復制到/tomcat/lib/目錄下】不同版本有可能造成錯誤。
commons-pool2-2.2.jar
jedis-2.5.2.jar
tomcat-redis-session-manage-tomcat7.jar
一、安裝Nginx
1.建立用戶和組:
groupadd nginx useradd –s /sbin/nologin –g nginx –M nginx –c “Nginx web user”
2.安裝一些所需依賴包:
yum install gcc gcc-c++ zlib zlib-devel pcre-devel openssl-devel perl-devel perl-ExtUtils-Embed libxml2 libxml2-devel libxslt libxslt-devel -y
3.編譯參數:【由於只做負載均衡,按需要安裝相對的功能】
./configure \ --prefix=/usr/local/nginx-1.8.1 \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_realip_module make && make install
4.添加啟動腳本
#!/bin/sh # nginx - this script starts and stops the nginx daemon # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval killall -9 nginx } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
5.添加到開機啟動
chkconfig --add nginx chkconfig nginx on
6.配置Nginx
upstream myServer { server 10.0.10.121:8080 weight=1 max_fails=2 fail_timeout=30s;; server 10.0.10.122:8080 weight=1 max_fails=2 fail_timeout=30s;; } server { listen 80; server_name a.test01.com; location / { proxy_pass http://myServer; } }
7.啟動Nginx [此時啟動後是無法連接的,因為後端的服務都沒安裝]
service nginx start
二、配置Tomcat服務【10.0.10.121、10.0.10.122】
安裝JDK環境
tar xf jdk-7u79-linux-x64.gz -C /usr/local/
配置環境變量:vim /etc/profile 【最後添加下面配置,根據情況配置】
JAVA_HOME=/usr/local/jdk1.7.0_79/ JAVA_BIN=$JAVA_HOME/bin JRE_HOME=$JAVA_HOME/jre PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/charsets.jar export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
1.安裝Tomcat服務
tar xf apache-tomcat-7.0.68.tar.gz -C /usr/local/
作一個軟連接:【軟連接方便日誌升級】
ln -s /usr/local//apache-tomcat-7.0.57/ /usr/local/tomcat7
2.修改配置文件,添加一個測試頁。
vim /usr/local/tomcat7/conf/context.xml 【在<Context>中間添加 </Context>】 <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.122.14" port="6379" database="0" maxInactiveInterval="60" />
註釋:上面host指Redis的主機IP,port就是端口,database就是數據庫0,maxInactiveInterval超時時間為60秒,60秒後就會變化Session值。
setMaxInactiveInterval和session-config的優先級:
1>、setMaxInactiveInterval的優先級高,如果setMaxInactiveInterval沒有設置,則默認是session-config中設置的時間。
2>、setMaxInactiveInterval設置的是當前會話的失效時間,不是整個web服務的。
3>、setMaxInactiveInterval的參數是秒,session-config當中配置的session-timeout是分鐘。
4>.測試頁面:vim /usr/local/tomcat7/webapps/ROOT/test.jsp
Server Info: SessionID:<%=session.getId()%> <br> SessionIP:<%=request.getServerName()%> <br> SessionPort:<%=request.getServerPort()%> <br> <% out.println("127"); //標記後端節點 %>
3.把幾個Session同步的jar包復制到tomcat目錄下的lib目錄下:
commons-pool2-2.2.jar
jedis-2.5.2.jar
tomcat-redis-session-manage-tomcat7.jar
4.把/usr/local/jdk1.7.0_79/目錄和/usr/local/apache-tomcat-7.0.57/ 目錄,還有/etc/profile文件也同步到其它的Tomcat主機的相應目錄下。
scp –r /usr/local/jdk1.7.0_79 10.0.10.122:/usr/local/ scp –r /data/apache-tomcat-7.0.57 10.0.10.122:/data/ scp –r /etc/profile 10.0.10.122:/etc/profile
三、安裝Redis【10.0.10.123】
自動安裝腳本:
#!/bin/bash #==================================================== # Author: Swper EMail:hz328.com # Create Date: 2016-03-21 # Description:redis單機單實例一鍵安裝腳本 #==================================================== # Filename: auto_install_redis.sh # 註意事項 # 僅適用於Linux/Centos 64位 # 安裝時需聯網 # 步驟 # 1.檢查源碼包是否存在,不存在就連網下載並安裝redis # 2.配置redis # 3.準備redis啟動停止腳本 # 4.啟動redis #定義存放軟件目錄 software="/root/software" #如果軟件目錄不存在則新建該目錄 if [[ ! -e $software ]]; then mkdir $software fi #定義判斷是否安裝成功函數 function installIsOK(){ if [[ $2 == 0 ]]; then echo "$1 install ...... OK !" else echo "$1 install ...... Failure!" exit 1 fi } #進入軟件目錄 cd $software # 1.下載並安裝redis [判斷是否存在] redis='redis-3.0.7' redis_dir='/data/redis' if [[ ! -f ${redis}.tar.gz ]]; then curl -LO http://download.redis.io/releases/${redis}.tar.gz fi tar zxf ${redis}.tar.gz cd $redis make PREFIX=${redis_dir} install if [[ $? == 0 ]]; then installIsOK ${redis} 0 else installIsOK ${redis} 3 fi # 2.配置redis mkdir -p ${redis_dir}/{etc,run,log} mkdir -p ${redis_dir}/data/6379 cp redis.conf ${redis_dir}/redis.conf #cp ${redis_dir}/redis.conf ${redis_dir}/etc/redis_6379.conf #生成配置文件 redis_6379="${redis_dir}/etc/redis_6379.conf" cat >> ${redis_6379} << "EOF" daemonize yes pidfile /data/redis/run/redis_6379.pid port 6379 #bind 127.0.0.1 timeout 300 loglevel notice logfile /data/redis/log/redis.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error no rdbcompression yes rdbchecksum no dbfilename dump.rdb dir /data/redis/data/6379 #slave-serve-stale-data yes maxmemory 256mb maxmemory-policy volatile-lru maxmemory-samples 3 appendonly yes appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 1024 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 EOF # 3.redis啟動停止腳本 redis_start="/etc/init.d/redis" cat >> ${redis_start} << "END" #!/bin/bash export PATH="/data/redis/bin:$PATH" EXEC="/data/redis/bin/redis-server" CLIEXEC="/data/redis/bin/redis-cli" PIDFILE="/data/redis/run/redis_6379.pid" CONF="/data/redis/etc/redis_6379.conf" PORT="6379" case "$1" in start) if [ -f $$PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed." else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running." else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $PORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped." fi ;; restart) $0 stop && $0 start ;; *) echo "Usage: $0 {start|stop|restart}" >&2 exit 1 ;; esac END #增加可執行權限 chmod u+x ${redis_start} # 4.啟動redis ${redis_start} start if [[ $? == 0 ]]; then echo "redis start ...... OK" else echo "redis start ...... Failure" fi
執行腳本自動安裝
sh auto_install_redis.sh
執行後會自動在/root/目錄下創建一個software目錄,同時會自動下載redis。完成後自動啟動。
ss –lnt 檢查端口6379是否在使用即說明正常運行。
完成上面操作後啟動服務:
1、啟動redis,由於安裝時已經啟動了就不需要手工啟動。
2、啟動Tomcat服務
3、啟動Nginx服務
Nginx簡單配置:
vim /etc/nginx/nginx.conf
upstream myServer { server 192.168.122.12:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.122.13:8080 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; server_name a.test01.com; location / { proxy_ignore_client_abort on; 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; proxy_pass http://tomcat_server; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } }
測試效果:打開瀏覽器訪問nginx的IP即可看到成功訪問頁面。
此時如果一直刷新存入到redis的session值是不會變的,但是如果30秒用戶沒反應就會失效。
可以通過修改tomcat目錄conf/web.xml文件:
<session-config> <session-timeout>300</session-timeout> </session-config>
此處默認為60,分鐘為單位;但是經過redis的包時就變成了60秒,此處是個問題;所以這裏修改成300變成秒了;註意上面的註釋,由於setMaxInactiveInterval在這裏沒有配置,所以優先級以session-timeout;
通過redis-c查看到失效時間:
127.0.0.1:6379> ttl 7B088CABA49FAADF8BF1F23801104958 (integer) 291 #此處為秒數,如果客戶端刷新一下網頁,此值就會又人300開始;
總結:其實此處用到的jar存在著很多問題,不建議在正式的生產環境使用;
Nginx+Tomcat+Redis實現session共享