使用Redis儲存Nginx+Tomcat負載均衡叢集的Session
環境:Cent OS 7.0(虛擬機器環境)、Nginx 1.9.8、Redis 3.2.1
一、背景
在使用Nginx+Tomcat實現負載均衡的時候,由於Nginx對不同的請求分發到某一個Tomcat,Tomcat在執行的時候分別是不同的容器裡,因為會出現session不同步或者丟失的問題。
二、Nginx安裝與配置
1、Nginx安裝網上的資源對於安裝Nginx的介紹比較多,例如簡單的為:
(1) 獲取nginx,在上可以獲取當前新的版本下載,例如:wget nginx-1.9.8.tar.gz
(2)解壓縮tar -xvf nginx-1.9.8.tar.gz包。
(3)進入解壓縮目錄,執行./configure --prefix=/usr/local/nginx-1.9.8 將Nginx安裝到/usr/local/nginx-1.9.8目錄下
(4)make & make install
安裝的過程會將Nginx安裝到/usr/local/nginx-1.9.8目錄下,啟動Nginx測試是否可以正常啟動。
2、修改Nginx配置多Tomcat伺服器2.1、修改conf/nginx.conf檔案,在server標籤上邊新增upstream如下:
這裡指定了本機下的兩個Tomcat例項,埠分別為8080,8060,權重都為1,後邊配置Tomcat例項,mynginxserver這個是自己隨意命名的,下邊要用到。
2.2、配置server標籤:
2.3、配置之後的完整內容如下(1.9.8版本刪去了註釋後的配置內容):
2.4、具體的配置項和配置項的具體意義請參考:
三、Tomcat多例項的配置
1、解壓apache-tomcat-7.0.67.zip 得到apache-tomcat-7.0.67
[root@localhost www]# unzip apache-tomcat-7.0.67.zip
2、將apache-tomcat-7.0.67重新命名為tomcat1
[root@localhost www]# mv apache-tomcat-7.0.67 tomcat1
重複1、2過程得到tomcat1和tomcat2
3、修改Tomcat1的埠為8080和部署專案檔案編輯tomcat下的conf/server.xml,修改埠號為8080,自己寫的用於測試Nginx反向代理的web專案war包下載地址:
下載好之後將解壓之後的編譯好的專案檔案放到tomcat1/webapps/ROOT/目錄下:
修改index.jsp和login.jsp檔案分別標識為具體的Tomcat容器
4、修改Tomcat2的埠為8060和部署專案檔案編輯tomcat下的conf/server.xml,修改埠號為8060,然後和上述3中的一樣,下載war內容,放在tomcat2/webapps/ROOT/下,修改index.jsp和login.jsp用於標識具體的Tomcat容器。
5、分別啟動tomcat1和tomcat2。
6、重啟Nginx服務,訪問IP地址:192.168.1.149:80(這個是訪問的虛擬機器IP地址)。
7、觀看效果
可以看出,Nginx已經進行了請求分發,轉發到具體的某一個Tomcat
四、Redis的安裝與配置
略 可參考網路資料
五、tomcat-redis-session-manager開源專案的使用
1、開源專案地址:
2、下載程式碼之後需要進行重新編譯,生成所需要的jar,任意建立maven專案,將src下的程式碼複製到具體位置,如下:
maven的pom.xml檔案如下
3、然後開啟terminal,執行mvn clean 和mvn install 將編譯好的程式碼打包為:tomcat-redis-session-1.0-SNAPSHOT.jar
4、將**tomcat-redis-session-1.0-SNAPSHOT.jar、jedis-2.7.2.jar、commons-pool2-2.0.jar**?三個jar包分別放在tomcat1和tomcat2例項下的lib目錄下。
下載這三個jar:
5、修改tomcat例項下conf/contex.xml檔案
<?xml version='1.0' encoding='utf-8'?> <Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- tomcat-redis-session共享配置 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.149"
port="6379"
database="0"
maxInactiveInterval="60" /> </Context>
如果不設定密碼會報錯,如下:
六、效果演示
案例演示的一個登陸請求,登陸成功之後將使用者資訊放在session中,在介面中顯示出來(tomcat1例項,tomcat2的例項中只是在?**h2**?標籤中做了一下標識)
1、login.jsp檔案:
<body>
<h2>Session Demo in Tomcat1</h2>
<form action="/user?type=login" method="post">
使用者名稱:<input type="text" name="userName"/><br/>
密碼:<input type="password" name="userPassword"/><br/>
<input type="submit" value="login">
</form>
</body>
2、index.jsp 將登入之後的資訊顯示在介面上
<body><h2>Session Demo in Tomcat1</h2>
<%
User user = (User) request.getSession().getAttribute("USER");
if (user == null) {
%>使用者為空,沒有登入!!!<%
} else {
%>歡迎: <%=user.getUserName()%><%
}
%></body>
3、servlet處理請求程式碼
public class UserServlet extends BaseServlet {
public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = new User();
user.setUserName(request.getParameter("userName"));
user.setUserPassword(request.getParameter("userPassword"));
request.getSession().setAttribute("USER", user); return "index.jsp";
}
}
4、效果如下:
可以看出在登入介面的時候重新整理請求的tomcat已經由Nginx進行分發請求,登入之後再兩個tomcta中已經共享了session
5、檢視Redis對session的儲存在對contex.xml檔案進行配置的時候預設使用的database為0,透過redis-cli工具可看到
七、總結
tomcat-redis-session-manager是一個對使用者完全透明的分散式session儲存框架,使用者只需要在tomcat中進行簡單的配置,就可以使用,我們的業務程式碼是完全和單例項的時候的程式碼是一樣的的,也就是寫程式碼的時候完全不用擔心你寫的是一個多tomcat例項的程式碼,完全透明。
如何對框架的原理進行簡單的理解,我們首先要知道,在請求過程中的session操作,首先要解析請求中的sessionId資訊,然後將sessionId儲存到request的引數列表中。然後再從 request獲取session的時候,如果存在sessionId那麼就根據Id從session池中獲取session,如果sessionId不存在或者session失效,那麼則新建session並且將session資訊放入session池,供下次使用。
如果我們想自己寫一個類似於tomcat-redis-session-manager的專案,我們應該知道Tomcat的Session管理機制,在預設的情況下Tomcat的Session管理,如果不進行設定的話是由Tomcat自帶的StandardManager類進行控制的,我們可以根據這個類自定義一個Manager,**主要重寫的就是org.apache.catalina.session.ManagerBase裡邊的具體寫的操作**,這也是tomcat-redis-session-manager的基本原理,將tomcat的session儲存位置指向了Redis
RedisSessionManager繼承了org.apache.catalina.session.ManagerBase並重寫了add、findSession、createEmptySession、remove等方法,並將對session的增刪改查操作指向了對Redis資料儲存的操作。
本文來自千鋒教育,轉載請註明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2788874/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux環境搭建Nginx+Tomcat負載均衡叢集LinuxNginxTomcat負載
- 負載均衡叢集負載
- Nginx+Tomcat部署負載均衡NginxTomcat負載
- dubbo叢集和負載均衡負載
- nginx+tomcat實現負載均衡NginxTomcat負載
- Nginx+Tomcat實現負載均衡、動靜分離叢集部署NginxTomcat負載
- haproxy(單機)+mysql叢集負載均衡MySql負載
- orleans叢集及負載均衡實現負載
- 叢集,lvs負載均衡的四種工作模式負載模式
- kubernetes叢集內排程與負載均衡負載
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- Haproxy+Keepalived高可用負載均衡叢集負載
- RabbitMQ(四):使用Docker構建RabbitMQ高可用負載均衡叢集MQDocker負載
- 叢集、負載均衡、分散式的區別與聯絡負載分散式
- docker初體驗:docker部署nginx負載均衡叢集DockerNginx負載
- LVS+Keepalive 實現負載均衡高可用叢集負載
- centos7下配置nginx反向代理負載均衡叢集CentOSNginx負載
- 粘性會話負載均衡 - MQTT Broker 叢集詳解(二)會話負載MQQT
- 如何運用PHP+REDIS解決負載均衡後的session共享問題PHPRedis負載Session
- redis叢集資料儲存和獲取原理Redis
- Nginx+Tomcat負載均衡,動靜分離群集部署解析NginxTomcat負載
- Dubbo學習筆記(四)叢集容錯與負載均衡筆記負載
- Dapr + .NET Core實戰(十一)單機Dapr叢集負載均衡負載
- 藉助 TCP 負載均衡和 Galera 叢集擴充套件 MySQLTCP負載套件MySql
- 帶你瞭解Nginx+Tomcat負載均衡,動靜分離群集NginxTomcat負載
- mariadb叢集與nginx負載均衡配置–centos7版本Nginx負載CentOS
- 3.RabbitMQ高階叢集搭建(Haproxy負載均衡、Keepalived高可用)MQ負載
- 一文秒懂分散式、叢集、負載均衡之間的區別分散式負載
- PHP session 儲存方式 file 改為 RedisPHPSessionRedis
- Java程式設計解密-Dubbo負載均衡與叢集容錯機制Java程式設計解密負載
- 淺談達夢DSC叢集以及負載均衡實現與驗證負載
- 注意這幾點,輕輕鬆鬆配置 Nginx + Tomcat 的叢集和負載均衡NginxTomcat負載
- kubernets1.13.1叢集使用ceph rbd塊儲存
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- 負載均衡負載
- LNMP 分散式叢集(一):Nginx+PHP平臺搭建與負載均衡配置LNMP分散式NginxPHP負載
- docker+mysql叢集+讀寫分離+mycat管理+垂直分庫+負載均衡DockerMySql負載