nginx+docker+lamp+redis實(shí)現(xiàn)負(fù)載均衡和session共享
docker
docker是一種應(yīng)用容器技術(shù),其性能傳統(tǒng)虛擬機(jī)是完全無法相比的嚷炉,并且其沙箱技術(shù)能保證容器與物理機(jī)的隔離,實(shí)現(xiàn)安全可靠,在云計(jì)算時代,扮演者十分重要的角色事格。
安裝docker
最新版的docker是按照年份和月份來確定的版本號,和以前的舊版不同搞隐,建議使用新版本驹愚。安裝方法,網(wǎng)上很多劣纲。
apt-get install docker-ce
準(zhǔn)備的鏡像
- linode/lamp(主要是apache+php環(huán)境逢捺,數(shù)據(jù)庫使用物理機(jī))
- ubuntu(nginx)
- ubuntu(redis)
nginx
nginx是一個高性能的http服務(wù)器和反向代理服務(wù)器,它解決了c10k問題癞季,
本文主要是利用其優(yōu)秀的性能做后端集群服務(wù)器的反向代理服務(wù)器劫瞳。
安裝nginx
下載源碼,官網(wǎng)下載
-
在ubuntu下編譯安裝绷柒,本文采用docker的Ubuntu鏡像
具體安裝方法本文不在贅述志于,網(wǎng)上教程很多。
-
安裝后配置
安裝后查看nginx的網(wǎng)絡(luò)信息
ip : 172.17.0.2
nginx 端口 80
然后配置負(fù)載均衡后端服務(wù)器集群ip废睦,本文假設(shè)只有兩臺服務(wù)器
ip : 172.17.0.3 和 172.17.0.4
lamp
lamp是linux下apache+php+mysql的運(yùn)行環(huán)境伺绽,本文需要的只是apache和php運(yùn)行環(huán)境,為了方便嗜湃,直接從docker倉庫pull下來linode/lamp進(jìn)行測試奈应,可以自己進(jìn)行build一份lamp環(huán)境,如何使用docker來build自己網(wǎng)上搜索净蚤。
-
使用docker運(yùn)行l(wèi)amp鏡像钥组,并且將物理機(jī)代碼映射到docker中的網(wǎng)站根目錄下输硝,保證所有后端服務(wù)器運(yùn)行代碼都是同一份今瀑。
docker run -it -v /home/codelover/docker/:/var/www/html/ linode/lamp
-
啟動兩個lamp,并且ip為上面nginx負(fù)載均衡配置的兩個点把。
-
測試負(fù)載均衡
直接返回請求頭消息橘荠,會發(fā)現(xiàn)請求是落在這兩臺服務(wù)器上,并且由于沒有配置任何負(fù)載均衡模塊郎逃,默認(rèn)nginx使用論詢機(jī)制哥童。
redis
解決session共享問題
雖然現(xiàn)在負(fù)載均衡實(shí)現(xiàn)了,但是http服務(wù)器總是避免不了要記錄用戶登錄狀態(tài)的褒翰,傳統(tǒng)的模式贮懈,一臺服務(wù)器運(yùn)行匀泊,直接記錄在服務(wù)器上就可以,但是現(xiàn)在
朵你,由于有了負(fù)載均衡各聘,每次分發(fā)請求給服務(wù)器有可能不是同一臺服務(wù)器,這就導(dǎo)致session不同步的問題抡医,為了解決這個問題躲因,nginx也有方案,ip_hash模塊
忌傻,以及其他的第三方模塊大脉,如sticky。雖然可以解決這個問題水孩,但是都把一個用戶的請求發(fā)給了固定的一臺服務(wù)器镰矿,服務(wù)器資源利用稍微還是有點(diǎn)不太讓人滿意。
因此俘种,共享session就成了一個不錯的解決方案衡怀。
其原理就是,把原保存在其中一臺服務(wù)器上的session安疗,共享到redis抛杨,讓后端所有的服務(wù)器都能共享用戶的登錄狀態(tài),保證即使用戶的請求被分到不同的后端服務(wù)器荐类,
也能保證用戶的狀態(tài)能被服務(wù)器獲取到怖现。
具體實(shí)現(xiàn),php可以配置php.ini
文件玉罐,或者利用php框架屈嗤,比如yii就可以直接在框架中配置,具體我就不在贅述了吊输。