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;
}
如圖所示:
配置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,關閉安全保護模式,如圖所示:
設定redis密碼,這裡設定密碼為1234
儲存退出并指定配置檔案啟動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
重新整理頁面,通路的193
可以看到後端伺服器雖然變了,但是sessionid是同一個。
打開RedisClient用戶端,傻瓜式操作。
連上194的redis,可以看到剛才那個session已經存到了redis裡邊。
說明session共享已經成功了。
需要注意的地方:
1,當redis隻有一台伺服器時,它挂掉整個session部分就全完了,是以有必要做一個redis叢集。
2,java中的實體類如果要存到redis,需要把相關實體類都序列化,繼承Serializable接口,所有相關的實體類都需要,比如它繼承的另一個實體類。
3,如果伺服器比較low,通路壓力也不大的話,不建議使用,要麼伺服器頂不住,要麼太浪費。