天天看點

Nginx+Tomcat+Reids實作負載均衡與seesion共享

Nginx是一款輕量級的Web 伺服器/反向代理伺服器,在BSD-like 協定下發行。其特點是占有記憶體少,并發能力強,能夠支援高達 50,000 個并發連接配接數的響應。

當有多台伺服器叢集,同一個使用者過來可能落在不同機器上,導緻session丢失,使用者登陸資訊不能保持。

我們之前使用過簡單的nginx配置:ip_hash,每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。但是這樣缺點也很明顯,比如給使用者綁定ip并不能說是“負載均衡”,或者其中一台伺服器故障時,會有部分使用者丢失session等情況發生。

采用Redis儲存Session後,無論哪個後端伺服器都可以通過redis得到對應的session資訊。

1,伺服器準備

3台(内網環境,centos7系統):10.40.58.194(nginx和redis伺服器,有第四台就分開放了,條件有限);10.40.58.193和10.40.58.191是兩台tomcat伺服器

2,軟體安裝

在相應伺服器安裝nginx+redis+tomcat,版本靈活選擇,安裝步驟略。

ip 軟體
10.40.58.194(負載伺服器) nginx1.80+redis3.2.12
10.40.58.193 tomcat7+jdk1.8
10.40.58.191 tomcat7+jdk1.8

3,nginx配置負載均衡

nginx安裝到了 /usr/local/ 下

輸入指令 vi /usr/local/nginx/conf/nginx.conf 打開并編輯配置檔案

在http塊加入

upstream linuxdc {

server 10.40.58.193:8080 weight=1;

server 10.40.58.191:8080 weight=1;

}

如圖所示:

Nginx+Tomcat+Reids實作負載均衡與seesion共享

配置server塊,引入 “linuxdc” 配置

server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://linuxdc;
            root   html;
            index  index.html index.htm;
        }
}
           

儲存退出。可以啟動nginx測試一下是否成功。

4,redis配置

redis安裝完成後需要修改一些配置,不然其他伺服器通路不到,會報異常。

主要是兩個地方1,注釋bind127.0.0.1,關閉本機限制 2,protected-mode yes 改為no,關閉安全保護模式,如圖所示:

Nginx+Tomcat+Reids實作負載均衡與seesion共享

設定redis密碼,這裡設定密碼為1234

Nginx+Tomcat+Reids實作負載均衡與seesion共享

儲存退出并指定配置檔案啟動redis,在redis安裝目錄下輸入./redis-server /etc/redis.conf

5,tomcat配置session共享

準備三個jar包放到tomcat的lib下,這裡用的是:

tomcat7-redis-session-manager-2.0.0.jar

jedis-2.5.2.jar

commons-pool2-2.4.3.jar

經過測試不成功,網上說是jar包有問題,重新下載下傳源碼自己打包用就可以了,這有一分重新打包過得jar包,可以直接用,連結是:https://download.csdn.net/download/weixin_43442246/11181576

jdk1.7的話啟動tomcat會失敗,用1.8就可以了

編輯tomcat配置檔案context.xml,在标簽context中間加入代碼

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
        <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         <!-- redis主機ip -->
         host="10.40.58.194" 
         <!--redis端口号 -->  
         port="6379"
         <!-- session存儲位置:db0-->
         database="0"
         <!--redis密碼 -->
         password="1234"
          <!--會話失效時間,機關秒,貌似不起作用 -->
         maxInactiveInterval="60" />
           

6,測試

編輯jsp測試檔案,我直接加入到了項目首頁頭部位置,項目是jsp前端。

sessionID:<%=session.getId()%>   
<br>   
SessionIP:<%=request.getServerName()%>   
<br>   
SessionPort:<%=request.getServerPort()%>   
<%   
//這裡一個用的191 一個193,友善區分 
out.println("This is 191");   
%>    
           

啟動所有的軟體,redis要開起來

輸入10.40.58.194

第一次通路的191

Nginx+Tomcat+Reids實作負載均衡與seesion共享

重新整理頁面,通路的193

Nginx+Tomcat+Reids實作負載均衡與seesion共享

可以看到後端伺服器雖然變了,但是sessionid是同一個。

打開RedisClient用戶端,傻瓜式操作。

Nginx+Tomcat+Reids實作負載均衡與seesion共享

連上194的redis,可以看到剛才那個session已經存到了redis裡邊。

Nginx+Tomcat+Reids實作負載均衡與seesion共享

說明session共享已經成功了。

需要注意的地方:

1,當redis隻有一台伺服器時,它挂掉整個session部分就全完了,是以有必要做一個redis叢集。

2,java中的實體類如果要存到redis,需要把相關實體類都序列化,繼承Serializable接口,所有相關的實體類都需要,比如它繼承的另一個實體類。

3,如果伺服器比較low,通路壓力也不大的話,不建議使用,要麼伺服器頂不住,要麼太浪費。