1. 程式人生 > >Nginx+Tomcat反向代理之負載均衡,redis存放session,keepalived暫未搭建

Nginx+Tomcat反向代理之負載均衡,redis存放session,keepalived暫未搭建

註意 image 依次 shutdown 占用 securecrt moni secure memcache

由於公司特定機器還未申請到位,本人之前對這一塊也不是很了解,所以前期需要先探路的原因,直接在阿裏雲上申請了一臺測試機,這裏部署的所有服務及操作全部在一臺機器上,經過一晚上的時間終於達到了負載均衡後session共享的機制。以下有部分操作未上截圖是因為我在寫該文章時該服務已經搭建成功,所以中間截圖就沒來得及截下,望大家諒解!

此處用的遠程工具SecureCRT,如需用到rz和sz服務請運行該命令(yum install lrzsz),運行完後在SecureCRT下就可以實現上傳下載功能!

sz截圖如下:

技術分享

1.準備階段(需要下載的資源)

jdk-7u80-linux-x64(jdk安裝這裏不做描述)


apache-tomcat-7.0.69(免安裝版)
nginx-1.8.1
redis-3.2.11

2.安裝及測試階段

上傳apache-tomcat-7.0.69到linux服務器並復制兩份,分別起名為apache-tomcat-7.0.69_1和apache-tomcat-7.0.69_2,然後分別放入需要部署的項目,我這裏不做測試demo,直接放工作中實際的項目,項目名改為ROOT放入tomcat webapp目錄中,因為有現成的登錄功能(為了節約時間,哈哈),別忘了tomcat需要改下端口,我這邊給出的端口分別是8081和8082,端口改完後我們先把這兩個tomcat服務分別啟動,以確保在沒有加入nginx之前tomcat可以正常發布項目。

相關截圖如下:

技術分享

至於項目發布成功的截圖由於是公司商業性項目,所以這裏就不上截圖了。

上傳nginx-1.8.1資源,在安裝nginx-1.8.1之前,需要先安裝幾個工具(nginx運行環境需要)

以下安裝命令依次執行:yum命令安裝gcc,pcre,zlib,openssl,(百度得知:-y代表自動安裝)

yum install -y gcc

yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

用該命令解壓 tar -zxvf nginx-1.8.0.tar.gz文件,解壓後得到nginx-1.8.0文件夾,然後利用cd命令進入該文件夾依次執行以下命令。

依次執行命令:
./configure
make
mkae install

此時nginx安裝完畢,安裝目錄是/usr/local/nginx

技術分享

nginx默認占用80端口

nginx主要配置看conf/nginx.conf文件,截圖如下:

技術分享

技術分享

nginx.conf中加入以下紅線區域配置就可以達到反向代理與負載均衡功能:

技術分享

其中,sbin目錄為nginx執行命令,conf目錄下的nginx.conf為默認加載的配置文件

啟動nginx:
./sbin/nginx
關閉nginx:
./sbin/nginx -s stop

啟動nginx後訪問該服務器的項目地址,註意我用的是nginx默認端口80,所以訪問就用ip:80端口去訪問,分別在不同瀏覽器下面訪問該地址,可以看出它們是來自不同tomcat項目服務,這時恭喜你已經達到了反向代理之負載均衡功能。

以上已經利用tomcat和nginx搭建了負載均衡服務,不過最終在實際項目中,如果當前用戶已經登錄成功在後臺做功能操作,這時由於未知原因導致他正在訪問的這個項目下的tomcat突然down機,這個時候雖然nginx會自動切換到正常運行的tomcat下,但由於session的不共享會導致當前用戶莫名其妙的退出後臺操作界面,這個在實際項目運行過程中是絕對不允許發生的。

解決方案:

1.nginx提供了ip_hash策略,可以保持用戶ip進行hash值計算固定分配到某臺服務器上,然後只要是該ip則會保持分配到該服務器上,保證用戶訪問的是同一臺服務器,那麽session問題就不存在了。這也是解決session共享的一種方式,也稱為黏性session。但是假設一臺tomcat服務器掛了的話,那麽session也會丟失。所以比較好的方案是抽取session。
2.session存在memcache或者redis中,以這種方式來同步session,把session抽取出來,放到內存級數據庫裏面,解決了session共享問題,同時讀取速度也是非常之快。

設計圖如下:

技術分享

redis解決session共享:

由於gcc編譯器我們上面已經安裝過,所以在安裝redis時可以直接忽略

上傳redis-3.2.11安裝包至linux /usr/local/redis-src/中,解壓進入解壓後目錄redis-3.2.1,執行make命令進行編譯,安裝到目錄/usr/local/redis

執行:make PREFIX=/usr/local/redis install 安裝完成之後將redis配置文件拷貝到安裝目錄下,redis.conf是redis的配置文件,redis.conf在redis源碼目錄,port默認6379。

執行拷貝命令:cp /usr/local/redis-src/redis-3.2.1/redis.conf /usr/local/redis/

在redis安裝目錄啟動和關閉redis:

啟動:./bin/redis-server ./redis.conf
關閉redis:./bin/redis-cli shutdown

redis啟動需註意一點,redis啟動分為前端啟動和後端啟動,控制哪種方式啟動是根據nginx.conf下的daemonize值來區分,默認是no,修改為daemonize yes,yes代表是後端啟動。

tomcat與redis集成實現session共享還需要三個jar:

技術分享

在所有需要共享session的服務器的tomcat中目錄下:lib目錄中添加以下三個jar包,註意版本最好一致,不然極容易出現錯誤;

conf目錄中content.xml中配置redis服務
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />

<Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="${ip}" port="6379" database="0" maxInactiveInterval="60"/>

技術分享

到此nginx+tomcat+redis已經全部搭建完畢,這時你就可以啟動所有服務來體驗下所謂負載均衡的魅力了!

啟動順序以下:

啟動redis服務,啟動所有tomcat,啟動nginx,訪問80端口的nginx服務並登錄到後臺,可以在登錄成功後的頁面加入一個標示來區分當前是來自於tomcat1還是tomcat2,然後再人為關閉該用戶正訪問的服務,這時你再刷新頁面,該用戶還是保留登錄狀態並切換到另一個服務中。哈哈,這是一個神奇的網站吧!

註意點:

有可能此時訪問會報錯,redis無法訪問,這是由於redis的安全機制,默認只有127.0.0.1才能訪問,在redis.conf中可以找到bind 127.0.0.1,你可以將此ip改為訪問者ip,如果有多個訪問者,也可以把bind 127.0.0.1註釋掉,然後在配置文件中找到protected-mode,修改protected-mode yes改為protected-mode no 關閉redis保護模式即可;

本人在搭建的時候一不留神把tomcat下的context.xml配置錯了,結果導致一啟動nginx,redis就down掉,後來再排查問題的時候看出了這個情況,最終改掉就ok;

keepalived暫時還未搭建,因為目前項目中還不需要對nginx做監測;

keepalived主要是防止nginx服務down機,keepalived可以監測nginx服務是否down機,如果發生down機了可以實時的切換上正常nginx服務,防止系統崩潰;

技術分享

原文出自於:http://www.cnblogs.com/mrlinfeng/p/6146866.html

我也是參考該博主博客後自行搭建的,寫這篇文章目的有兩個:

(1)為了讓自己印象更深刻且供大家參考;

(2)公司領導需要我總結後作出技術分享;

哈哈,本人第二次發文,如果有不正確的地方希望大家多多指導! 好了,不說了,回家睡覺了。。。

Nginx+Tomcat反向代理之負載均衡,redis存放session,keepalived暫未搭建