中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nginx+tomcat+redis+mysql實現session會話技術共享

發布時間:2020-03-25 15:18:31 來源:億速云 閱讀:347 作者:小新 欄目:系統運維

今天小編分享的是nginx+tomcat+redis+mysql實現session會話技術,可能大家并不是特別的了解。但是不用擔心,今天小編會以最簡單的描述來講解,一起往下看吧。

一,redis介紹

redis是一個key-value存儲系統。和memcached類似,它支持存儲的value類型相對更多,包括string(字符串),list(列表),set(集合),zset(sorted set---有序集合)和hash(哈希類型)。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別是redis會周期性地把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現master-slave(主從)同步。

Redis是一個高性能的key-value數據庫。redis的出現,很大程度補償了memcacehd這類key/value存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用。它提供了java,C/C++,C#,php,javaScript,Perl,Object-C,python,Ruby等客戶端,使用很方便。
如果簡單的比較redis與memcached的區別,基本上有以下3點:
1,redis不僅僅支持簡單的key/value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
2,redis支持數據的備份,即master-slave模式的數據備份。
3,redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。

在Reids中,并不是所有的數據都一直存儲在內存中。這是和memcacehd相比一個最大的區別。
Redis只會緩存所有的key的信息,如果Reids發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計算出那些key對應的value需要swap到磁盤。然后再將這些key對應的value持久化到磁盤中,同時在內存中清除。這種特性使得redis可以保存超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的eky,因為這些數據是不會進行swap操作的。
當從Redis中讀取數據的時候,如果讀取的key對應的value不再內存中,那么Redis就需要從swap文件中加載相應的數據,然后再返回給請求方。

nginx+tomcat+redis+mysql實現session會話技術共享

memcached和redis的比較
1,網絡IO模型
memcacehd是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程,監聽線程監聽網絡連接,接受請求后,將連接描述字pipe 傳遞給worker線程,進行讀寫IO,網絡層使用libevent封裝的事件庫,多線程模型可以發揮多核作用。
Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll,kqueue和select,對于單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序,聚合等,對于這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

2,內存管理方面
memcacehd使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,value根據大小選擇合適的chunk存儲。
Redis使用現場申請內存的方式來存儲數據。

3,存儲方式及其他方面
memcached基本只支持簡單的key-value存儲,不支持持久化和復制等功能,Redis除key/value之外,還支持list,set,sortedset,hash等眾多數據結構。

二,如何保持session會話

目前,為了使web能適應大規模的訪問,需要實現應用的集群部署。集群最有效的方案就是負載均衡,而實現負載均衡,用戶每一個請求都有可能被分配到不固定的服務器上,這樣我們首先要解決session的統一來保證無論用戶的請求被轉發到哪個服務器上都能保證用戶的正常使用,即需要實現session的共享機制。

在集群系統下實現session統一的有如下幾種方案:
1,請求精確定位(sessionsticky)
例如基于訪問ip的hash策略,即當前用戶的請求都集中定義到一臺服務器中,這樣單臺服務器保存了用戶的session登錄信息,如果宕機,則等同于單點部署,會丟失,會話不復制。 (不采用)
2,session復制共享(sessionreplication):
如tomcat自帶session共享,主要是指集群環境下,多臺應用服務器之間同步session,使session保持一致,對外透明。如果其中一臺服務器發生故障,根據負載均衡的原理,調度器會遍歷尋找可用節點,分發請求,由于session已同步,故能保證用戶的session信息不會丟失,會話復制。
此方案的不足之處:
必須在同一種中間件之間完成(如:tomcat-tomcat之間)
session復制帶來的性能損失會快速增加,特別是當session中保存了較大的對象,而且對象變化較快時,性能下降更加顯著,會消耗系統性能。這種特性使得web應用的水平擴展受到了限制。
session內容通過廣播同步給成員,會造成網絡流量瓶頸,即便是內網瓶頸。在大并發下表現并不好。
3,基于cache DB緩存的session共享
基于memcache/redis緩存的session共享,即使用cacheDB存儲session信息,應用服務器接受新請求將session信息保存在cache DB中,當應用服務器發生故障時,調度器會遍歷尋找可用節點,分發請求,當應用服務器發現session不在本機內存時,則去cache DB中查找,如果找到則復制到本機,這樣實現了session共享和高可用。(推薦使用)

三,nginx+tomcat+redis+mysql實現session共享,負載均衡

1,項目環境
主機操作系統ip地址
nginxCentOS 7.3172.16.1.100
tomcat-1CentOS 7.3172.16.1.110
tomcat-2CentOS 7.3172.16.1.120
mysqlCentOS 7.3172.16.1.130
RedisCentOS 7.3172.16.1.30
2,項目拓撲

nginx+tomcat+redis+mysql實現session會話技術共享
在這個圖中,nginx做反向代理,實現動靜分離,將客戶動態請求根據權重隨機分配給兩臺tomcat服務器,redis作為兩臺tomcat的共享session數據服務器,mysql作為兩臺tomcat的后端數據庫。

3,項目實施

1,nginx安裝配置
使用nginx作為tomcat的負載平衡器,tomcat的會話session數據存儲在redis,能夠實現零宕機的7x24效果。因為將會話存儲在redis中,因此nginx就不必配置稱stick粘貼某個tomcat方式,這樣才能真正實現后臺多個tomcat負載平衡。

1)安裝依賴工具包:
[root@nginx ~]#  yum -y install gcc* pcre-devel openssl-devel zlib-devel make vim 
2)創建nginx程序用戶組和用戶:
[root@nginx ~]# groupadd -r nginx && useradd -r -g nginx -s /bin/false -M nginx
3)編譯安裝nginx:
[root@nginx ~]# tar zxf nginx-1.8.0.tar.gz 
[root@nginx ~]# cd nginx-1.8.0
[root@nginx nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
>  --with-http_stub_status_module --with-http_ssl_module  --with-http_dav_module  --with-http_flv_module \
>  --with-http_mp4_module --with-http_gzip_static_module --with-http_gzip_static_module \
> --with-http_addition_module --with-http_sub_module  --with-pcre  --with-http_realip_module 
[root@nginx nginx-1.8.0]# make && make install
4)優化路徑并檢查:
[root@nginx nginx-1.8.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@nginx nginx-1.8.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
5)編寫nginx服務腳本:
[root@nginx nginx-1.8.0]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service already running."
else
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
$PROG
echo "Nginx service start success."
else
$PROG -t
fi
fi
;;
stop)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
kill -s QUIT $(cat $PIDF)
echo "Nginx service stop success."
else
echo "Nginx service already stop"
fi
;;
restart)
$0 stop
$0 start
;;
status)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
echo "Nginx service is running."
else
echo "Nginx is stop."
fi
;;
reload)
netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
if [ $? -eq 0 ]
then
$PROG -t &> /dev/null
if [ $? -eq 0 ] ; then
kill -s HUP $(cat $PIDF)
echo "reload Nginx config success."
else
$PROG -t
fi
else
echo "Nginx service is not run."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
#并加入開機自啟:
[root@nginx ~]# chkconfig --add nginx
[root@nginx ~]# chkconfig nginx on
#啟動nginx:
[root@nginx ~]# systemctl daemon-reload
[root@nginx ~]# systemctl start nginx
[root@nginx ~]# netstat -anput | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      21812/nginx: master 

6)配置nginx反向代理(反向代理+負載均衡+健康檢測)
注:結合proxy和upstream模塊實現后端web負載均衡;
結合nginx默認自帶的ngx_http_proxy_module模塊 和ngx_http_upstream_module模塊實現后端服務器的健康檢查;

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
在http{}字段中添加以下配置項:

#load balance Settings:
        upstream  backend_tomcat {   
                server 172.16.1.110:8080 weight=1 max_fails=2 fail_timeout=10s;
                server 172.16.1.120:8080 weight=1 max_fails=2 fail_timeout=10s;
}
# http_proxy Settings:
        proxy_connect_timeout 75;   #nginx 跟后端服務器連接超時時間(代理連接超時)
        proxy_send_timeout 75;   #定義后端服務器的數據回傳時間,即在規定時間之內后端服務器必須傳完所有的數據,否則,nginx將斷開這個連接。
        proxy_read_timeout 75;  #定義從后端服務器讀取響應的超時
        proxy_buffer_size 4k;  #設置緩沖區的大小(該緩沖區大小默認等于 proxy_buffers 指令設置的一塊緩沖區的大小,但它也可以被設置得更小)
        proxy_buffers 4 32k;    #為每個連接設置緩沖區的數量和每塊緩沖區的大小
        proxy_busy_buffers_size 64k;  #高負荷下緩沖大小(默認大小是 proxy_buffers 指令設置單塊緩沖大小的 2 倍)
        proxy_temp_file_write_size 64k;  #當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小
參數解釋:
weight:輪詢權值,也是可以用在ip_hash的,默認值為1
max_fails:運行請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤。
fail_timeout:有兩層含義,以時在10s時間內最多容許2次失敗;二是在經歷了2次失敗以后,10s時間內不分配請求到這臺服務器。

在server模塊中添加:

#proxy_pass Settings:
        location ~* \.(jsp|do)$ {   #匹配到的動態請求將進行轉發
        proxy_pass http://backend_tomcat;  #請求轉向 backend 定義的服務器列表,即反向代理,對應 upstream 負載均衡器。
        proxy_redirect off;  #是否定義重定向規則
        proxy_set_header Host $host;  #允許重新定義或者添加發往后端服務器的請求頭
        proxy_set_header X-Real-IP $remote_addr;   #web服務器端獲得用戶的真實ip, 也可以通過下面的X-Forward-For獲取
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;    #后端的 Web 服務器可以通過 X-Forwarded-For 獲取用戶真實 IP
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
#增加故障轉移,如果后端的服務器返回502、 504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一臺服務器,實現故障轉移
}

7)重啟nginx服務并設置防火墻規則:

[root@nginx ~]# systemctl restart nginx
[root@nginx ~]# firewall-cmd --add-port=80/tcp --permanent
success
[root@nginx ~]# firewall-cmd --reload
success

2,安裝部署tomcat服務器
在安裝tomcat之前必須先安裝JDK,JDK是sun公司免費提供的java語言的軟件開發工具包,其中包含java虛擬機(JVM),編寫好的java源程序經過編譯可形成java字節碼,只要安裝了JDK,就可以利用JVM解釋這些字節碼文件,從而保證了java的平臺性。

1)安裝JDK,配置java環境(tomcat1和tomcat2 服務器安裝)

[root@tomcat-1 ~]# tar zxf jdk-8u211-linux-x64.tar.gz
[root@tomcat-1 ~]# mv jdk1.8.0_211/ /usr/local/java
[root@tomcat-1 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
[root@tomcat-1 ~]# source /etc/profile
[root@tomcat-1 ~]# java -version  #確保java版本與當前版本一致
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

2)安裝tomcat(tomcat1和tomcat2 服務器相同操作)
可在tomcat官網中下載需要的版本:https://tomcat.apache.org

[root@tomcat-1 ~]# tar zxf apache-tomcat-8.5.35.tar.gz 
[root@tomcat-1 ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat8
[root@tomcat-1 ~]# vim /etc/profile
export CATALINA_HOME=/usr/local/tomcat8
export PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
[root@tomcat-1 ~]# source /etc/profile
#啟動tomcat:
[root@tomcat-1 ~]# /usr/local/tomcat8/bin/startup.sh   
#這里只是展示啟動腳本的路徑,因為上邊設置了環境變量,可直接執行startup.sh腳本
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat-1 ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      15408/java
#防火墻規則配置:
[root@tomcat-1 ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@tomcat-1 ~]# firewall-cmd --reload
success

#瀏覽器測試訪問兩臺tomcat服務器
nginx+tomcat+redis+mysql實現session會話技術共享
nginx+tomcat+redis+mysql實現session會話技術共享

3)修改tomcat配置文件(tomcat1和tomcat2操作)

[root@tomcat-1 ~]# vim /usr/local/tomcat8/conf/server.xml
#設置默認虛擬主機,并增加jvmRoute
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-1">
#修改默認虛擬主機,并將網站文件路徑指向/web/webapp1,在host段增加context段
 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
                <Context docBase="/web/webapp1" path="" reloadable="true"/>   #添加該行內容

#tomcat-2服務器的配置文件:

#兩臺配置只是jvmRoute不同,其他配置保持一致:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat-2">
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
                  <Context docBase="/web/webapp1" path="" reloadable="true"/> 

說明:jvmRoute是jvm標識,就是頁面最頂部的標簽,在實際生產環境中,所有的后臺tomcat標識都要一樣,這里為了實驗的說明性,我兩臺tomcat的標識改成不一樣的。等會為了驗證時候好驗證。

4)創建網頁目錄與測試文件:(tomcat-1和tomcat-2操作相同)

[root@tomcat-1 ~]# mkdir -p /web/webapp1
[root@tomcat-1 ~]# vim /web/webapp1/index.jsp  #編寫動態網頁文件
#內容如下:
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat-1</title>   
</head>
<body>
<h3><font color="red">Session serviced by tomcat</font></h3>
<table aligh="center" border="1">
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
<% session.setAttribute("abc","abc");%>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
<html>

#注意:為了測試負載均衡,tomcat-2節點index.jsp文件的title修改為“tomcat-2”(生產環境兩個tomcat服務器提供的網頁內容是相同的),其他配置相同。

5)重啟tomct服務,并驗證負載均衡

#tomcat-1和tomcat-2都需要重啟
[root@tomcat-1 ~]# shutdown.sh 
[root@tomcat-1 ~]# startup.sh   
[root@tomcat-1 ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      15551/java  

#用戶使用瀏覽器通過訪問nginx web服務,驗證負載均衡:
第一次訪問的結果:
nginx+tomcat+redis+mysql實現session會話技術共享
第二次訪問的結果:
nginx+tomcat+redis+mysql實現session會話技術共享
從上面的結果能看出兩次訪問,nginx把訪問請求分別分發給了后端的tomcat-1和tomcat-2,客戶端的訪問請求實現了負載均衡,但session id不一樣(即:沒有實現session保持),這樣的話,會給后端服務器造成很大的壓力。

6)驗證健康檢查

#可以關掉一臺tomcat主機,模擬宕機,用客戶端瀏覽器測試訪問
[root@tomcat-1 ~]# shutdown.sh   
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar

nginx+tomcat+redis+mysql實現session會話技術共享
無論你怎么刷新頁面,一直都是tomcat2提供服務,說明健康檢查起到了作用,驗證成功。

3,配置tomcat通過redis實現會話保持

#前邊可以說是準備工作,下面才是該項目的重點。
1)安裝redis
官網下載地址:http://download.redis.io/releases/
[root@redis ~]# tar zxf redis-4.0.14.tar.gz
[root@redis ~]# cd redis-4.0.14/
[root@redis redis-4.0.14]# make && make install
nginx+tomcat+redis+mysql實現session會話技術共享
nginx+tomcat+redis+mysql實現session會話技術共享
通過上圖,我們可以很容易的看出,redis安裝到/usr/local,/usr/local/bin,/usr/local/share,/usr/local/include,/usr/local/lib,/usr/local/share/man目錄下。

#然后再切換到utils目錄下,執行redis初始化腳本install_server.sh,如下:

[root@redis redis-4.0.14]# cd utils/
[root@redis utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config: 
Port           : 6379  
Config file    : /etc/redis/6379.conf  
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server  
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
#上面全部默認回車就好

通過上面的安裝過程,我們可以看出redis初始化后redis配置文件為/etc/redis/6379.conf,日志文件為/var/log/redis_6379.log,數據文件dump.rdb存放到/var/lib/redis/6379目錄下,啟動腳本為/etc/init.d/redis_6379。
#如果需要使用systemd,可以在/etc/systemd/system 下創建一個單位文件名字為redis_6379.service。

[root@redis utils]# vim /etc/systemd/system/redis_6379.service
#內容如下:
[Unit]
Description=Redis on port 6379
[Service]
Type=forking
ExecStart=/etc/init.d/redis_6379 start
ExecStop=/etc/init.d/redis_6379 stop
[Install]
WantedBy=multi-user.target
#注:這里Type=forking是后臺運行的形式

#啟動redis
[root@redis utils]# systemctl daemon-reload
[root@redis utils]# systemctl enable redis_6379.service
[root@redis utils]# systemctl start redis_6379.service
nginx+tomcat+redis+mysql實現session會話技術共享
#從上圖我們可以看到,服務狀態是死亡狀態,解決辦法就是重啟一下服務即可,如下圖所示:
nginx+tomcat+redis+mysql實現session會話技術共享
nginx+tomcat+redis+mysql實現session會話技術共享

#防火墻規則設置:
[root@redis utils]# firewall-cmd --add-port=6379/tcp --permanent
success
[root@redis utils]# firewall-cmd --reload
success

2)配置redis

[root@redis ~]# vim /etc/redis/6379.conf 
#修改內容如下(去掉注釋并修改):
bind 172.16.1.30   #將redis的監聽地址修改為redis主機的ip
requirepass pwd@123   #考慮到安全性,需要啟動redis的密碼驗證功能requirepass參數。
#重新啟動redis服務:
[root@redis ~]# systemctl restart redis_6379.service
[root@redis ~]# netstat -anput | grep redis
tcp        0      0 172.16.1.30:6379        0.0.0.0:*               LISTEN      12261/redis-server 

#redis配置文件配置完畢后,啟動redis并進行簡單操作(測試),如下:

[root@redis ~]# redis-cli -h 172.16.1.30 -p 6379 -a pwd@123
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.16.1.30:6379> keys *
(empty list or set)
172.16.1.30:6379> set name lisi
OK
172.16.1.30:6379> get name
"lisi"
172.16.1.30:6379> quit   

以上參數解釋:

首先我們利用redis的命令行工具redis-cli,連接redis服務器,ip是172.16.1.30(這里就以本機進行測試),端口是6379,密碼是pwd@123
keys *:是查看redis所有的鍵值對
set nam lisi:添加一個key(name)-value(lisi)
get name:查看name這個鍵值的內容
quit:退出連接
#redis的其他操作命令,會在后面講解到

到此,redis的所有部署完畢,接下來配置tomcat的session同步。

3)配置tomcat session redis同步(tomcat1和tomcat2操作相同)
#下載tomcat-redis-session-manager相應的jar包,主要有三個:

tomcat85-session-redis-1.0.jar
jedis-2.9.0.jar
commons-pool2-2.4.2.jar
① 下載完成后分別拷貝到$TOMCAT_HOME/lib目錄中:
[root@tomcat-1 ~]# cp tomcat85-session-redis-1.0.jar jedis-2.9.0.jar commons-pool2-2.4.2.jar  /usr/local/tomcat8/lib/
② 修改tomcat的context.xml文件:
[root@tomcat-1 ~]# vim /usr/local/tomcat8/conf/context.xml 
添加以下內容:

nginx+tomcat+redis+mysql實現session會話技術共享
圖中內容如下:

        <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
        <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
        host="172.16.1.30"   #redis主機地址
        password="pwd@123"   #redis登錄密碼
        port="6379"        #監聽端口
        database="0"   
        maxInactiveInterval="60" />    #session的失效時間(單位s)
③ 修改完,重啟tomcat:
[root@tomcat-1 ~]# shutdown.sh 
[root@tomcat-1 ~]# startup.sh 
[root@tomcat-1 ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      16931/java  

在tomcat-2主機上重復以上操作。

④驗證session會話是否一致
#模擬用戶通過瀏覽器訪問http://172.16.1.100/index.jsp 測試頁
第一次訪問:
nginx+tomcat+redis+mysql實現session會話技術共享

第二次訪問(刷新頁面):
nginx+tomcat+redis+mysql實現session會話技術共享
可以看出,分別訪問了不同的tomcat,但是得到的session卻是相同的,說明session會話保持同步,達到了集群的目的。
注:從tomcat6開始默認開啟了session持久化設置,測試時可以關閉本地session持久化,其實也很簡單,在tomcat的conf目錄下的context.xml文件中,取消注釋下面那段配置即可:

#修改前:
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
#修改后:
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <Manager pathname="" />
⑤ 查看redis:
[root@redis ~]# redis-cli -h 172.16.1.30 -p 6379 -a pwd@123
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.16.1.30:6379> keys *
1) "3585F7426EBBC83802C0407575FEAC72tMLrlI.tomcat-2"
2) "name"
172.16.1.30:6379> quit

可以看出,redis為保持在tomcat2上的session會話保持建立了鍵值對。

4, 配置tomcat連接數據庫

tomcat的session會話保持通過redis把這個問題解決掉了,現在該解決tomcat連接數據庫問題了。(主機172.16.1.130作為mysql DB 服務器)
1)安裝mysql服務(二進制方式)

[root@mysql ~]# vim mysql5.7.sh
#!/bin/bash
rpm -qa | grep mariadb  &> /dev/null
if [ $? -eq 0 ]
then
    rpm -e mariadb-libs --nodeps
fi
tar zxf  mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 
mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql
ln -s /usr/local/mysql/bin/* /usr/local/bin
groupadd -r mysql && useradd -r -g mysql -s /bin/false -M mysql
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysqld.pid
log-error=/usr/local/mysql/data/mysql.err
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql
cd /usr/local/mysql/
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
mypwd=`grep password /usr/local/mysql/data/mysql.err | awk -F'root@localhost: ' '{print $2}'`
mysql -uroot -p${mypwd} -e 'alter user root@localhost identified by"123.com"' --connect-expired-password
[root@mysql ~]# sh mysql5.7.sh 
Starting MySQL. SUCCESS! 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql ~]# ss -anput | grep 3306
tcp    LISTEN     0      80       :::3306                 :::*                   users:(("mysqld",pid=16753,fd=12))
#防火墻規則設置:
[root@mysql ~]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@mysql ~]# firewall-cmd --reload
success

2)在數據庫中創建數據

[root@mysql ~]# mysql -uroot -p123.com
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> grant all on *.* to javauser@'172.16.1.%' identified by 'pwd@123';   //授權一個用戶
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;   
Query OK, 0 rows affected (0.00 sec)

mysql> create database javadb;   //創建庫
Query OK, 1 row affected (0.00 sec)

mysql> use javadb
Database changed
mysql> create table testtb(id int primary key auto_increment,
    -> name varchar(25),
    -> age int(3));   //創建表
Query OK, 0 rows affected (0.00 sec)

mysql> insert into testtb(name,age) values('zhangsan','20'),('lisi','21'),('sunqian','22');   //插入數據
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from testtb;  #查看一下
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   20 |
|  2 | lisi     |   21 |
|  3 | sunqian  |   22 |
+----+----------+------+
3 rows in set (0.00 sec)

3)配置tomcat服務器連接mysql數據庫(兩臺tomcat操作相同)

(1)下載mysql-connector-java-5.1.22-bin.jar并復制到$CATALINA_HOME/lib目錄下:
[root@tomcat-1 ~]# cp mysql-connector-java-5.1.22.jar  /usr/local/tomcat8/lib/
(2)Context文件設置:
[root@tomcat-1 ~]# vim /usr/local/tomcat8/conf/context.xml

nginx+tomcat+redis+mysql實現session會話技術共享

#上圖在<Context>中添加的內容如下:
        <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="javauser" password="pwd@123" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://172.16.1.130:3306/javadb"/>

(3)在/web/webapp1/根目錄下新建目錄,用于存放網站xml配置文件,用于tomcat連接mysql數據庫

[root@tomcat-1 ~]# mkdir /web/webapp1/WEB-INF
[root@tomcat-1 ~]# vim /web/webapp1/WEB-INF/web.xml
添加內容如下:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
#保存修改并退出,重啟tomcat服務:
[root@tomcat-1 ~]# shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
[root@tomcat-1 ~]# startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.

tomcat-2進行和tomcat-1相同的操作。
(4)測試代碼
#現在創建一個簡單的測試.jsp頁面,測試tomcat和mysql的連通性

[root@tomcat-1 ~]# vim /web/webapp1/test.jsp
#內容如下:(根據自己的環境,修改相對應的參數)
<%@ page language="java" import="java.sql.*" pageEncoding="GB2312"%>
<html>
<head>
<title>MySQL</title>
</head>
<body>
connect MySQL<br>
<%
String driverClass="com.mysql.jdbc.Driver";
String url="jdbc:mysql://172.16.1.130:3306/javadb";
String username = "javauser";
String password = "pwd@123";
Class.forName(driverClass);
Connection conn=DriverManager.getConnection(url, username, password);
Statement stmt=conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from testtb");
while(rs.next()){
out.println("<br>name:"+rs.getString(2)+"age:"+rs.getString(3));
}
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>

注:在tomcat-2節點上創建同樣的測試代碼,但是為了更好的驗證,把標題修改為”MySQL-2“。

(5)通過瀏覽器進行訪問測試頁,URL:http://172.16.1.100/test.jsp ,還是通過nginx反向代理后端的tomcat服務器。
nginx+tomcat+redis+mysql實現session會話技術共享
nginx+tomcat+redis+mysql實現session會話技術共享
從上圖可以看出,現在tomcat-1和tomcat-2已經可以連接到數據庫了。
到此,項目搭建完畢。。。

安裝包和jar包已上傳至網盤:鏈接:https://pan.baidu.com/s/133H7oEbBWiBvaNWUoFgH3Q
提取碼:2fj1

以上就是nginx+tomcat+redis+mysql實現session會話技術共享做了簡略的介紹,當然詳細使用上面的不同還得要大家自己使用過才干領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

历史| 大关县| 霍林郭勒市| 辉县市| 廉江市| 永安市| 哈密市| 临朐县| 麻栗坡县| 平度市| 科尔| 闸北区| 阳江市| 曲沃县| 衡阳县| 红原县| 正定县| 灌南县| 广州市| 贵阳市| 苗栗县| 新竹县| 钟山县| 临湘市| 涟水县| 靖宇县| 静海县| 元朗区| 晴隆县| 灵山县| 交城县| 阳曲县| 加查县| 巩义市| 保定市| 虞城县| 虎林市| 阳山县| 永清县| 新密市| 尼木县|