在項(xiàng)目運(yùn)營(yíng)時(shí),我們都會(huì)遇到一個(gè)問題,項(xiàng)目需要更新時(shí),我們可能需先暫時(shí)關(guān)閉下服務(wù)器來更新。但這可能會(huì)出現(xiàn)一些狀況:
1.用戶還在操作,被強(qiáng)迫終止了(我們可以看日志等沒人操作的時(shí)候更新,但總可能會(huì)有萬一)
2.不知道的用戶可能會(huì)想網(wǎng)站是不是被攻擊了,降低了對(duì)網(wǎng)站的信任程度,從而導(dǎo)致失去部分潛在客戶,這點(diǎn)尤其對(duì)金融互聯(lián)網(wǎng)公司不利。
在查了一些資料后,決定采用Tomcat + Nginx + Redis來實(shí)現(xiàn)負(fù)載均衡和session共享。下面記錄下我的實(shí)踐過程,如有錯(cuò)誤不足之處歡迎大神指點(diǎn),不喜勿噴。
1.Nginx簡(jiǎn)單介紹及開啟
Nginx是一款輕量級(jí)兼?zhèn)涓咝阅艿腍ttp和反向代理服務(wù)器。所謂反向代理就是指在用戶發(fā)起訪問請(qǐng)求,由代理服務(wù)器接收,然后將請(qǐng)求轉(zhuǎn)發(fā)給正式服務(wù)器,并且將正式服務(wù)器處理完的數(shù)據(jù)返回給客戶端,此時(shí)代理服務(wù)器就表現(xiàn)為一個(gè)服務(wù)器。這么做看起來多經(jīng)過了一步,稍顯麻煩,但實(shí)則是好處多多,在下面的demo中我會(huì)將其體現(xiàn)出來。
首先我們?nèi)ginx官網(wǎng)下載個(gè)Nginx,我這是在自己電腦上,所以當(dāng)然下載的是windows版本的。下載完成后直接放在某個(gè)盤中即可,不需要安裝。接下去我們打開cmd,進(jìn)入nginx的目錄下,輸入start nginx。
我們可以看到一個(gè)窗口一閃而過,這樣nginx就已經(jīng)被開啟了,我們?cè)谌蝿?wù)管理器中可以找到它的進(jìn)程。
現(xiàn)在我們?cè)跒g覽器中輸入localhost??梢钥吹匠霈F(xiàn)一個(gè)頁面,雖然簡(jiǎn)陋了點(diǎn),但這確確實(shí)實(shí)就是nginx的歡迎頁面,就類似tomcat剛啟動(dòng)完成的locahost:8080的歡迎頁面。
2.使用Nginx實(shí)現(xiàn)反向代理
現(xiàn)在我們搭建一個(gè)基于SpringMVC +Spring + Mybaties框架的maven項(xiàng)目,搭建過程不加以贅述。功能很簡(jiǎn)單,就是能跳轉(zhuǎn)到一個(gè)頁面就行了,當(dāng)然也可以使用別的框架。
運(yùn)行demo,我這tomcat端口是8080,在瀏覽器輸入localhost:8080,出現(xiàn)我們的頁面。
這時(shí)我們還是直接訪問tomcat服務(wù)器的,現(xiàn)在我想通過nginx訪問tomcat,即輸入localhost就能顯示我們demo的頁面。
這就要我們?nèi)バ薷膎ginx的核心配置文件,在其目錄下的conf文件夾下的nginx.conf文件,那么首先我們就要了解該文件中一些節(jié)點(diǎn)的作用。
worker_processes:工作進(jìn)程個(gè)數(shù),可配置多個(gè)
worker_connections:單個(gè)進(jìn)程最大連接數(shù)
server:每一個(gè)server相當(dāng)于一個(gè)代理服務(wù)器
lister:監(jiān)聽端口,默認(rèn)80
server_name:當(dāng)前服務(wù)的域名,可以有多個(gè),用空格分隔(我們是本地所以是localhost)
location:表示匹配的路徑,這時(shí)配置了/表示所有請(qǐng)求都被匹配到這里
index:當(dāng)沒有指定主頁時(shí),默認(rèn)會(huì)選擇這個(gè)指定的文件,可多個(gè),空格分隔
proxy_pass:請(qǐng)求轉(zhuǎn)向自定義的服務(wù)器列表
upstream name{ }:服務(wù)器集群名稱
知道了節(jié)點(diǎn)作用后,我們就知道我們需要修改的文件中的server部分,這是它原有的代碼,我刪除了它注釋部分。現(xiàn)在我們就能明白為什么輸入localhost,
它訪問的是它歡迎頁面即index.html。
下面我們對(duì)這段代碼進(jìn)行一些小小修改。就是將請(qǐng)求轉(zhuǎn)向我們定義的服務(wù)器。
隨后在cmd中輸入命令nginx -s reload即可重啟nginx。
重啟后,我們?cè)佥斎雔ocalhost,可以看到跳轉(zhuǎn)到的頁面是我們demo的。
至此,反向代理已完成,這樣所有請(qǐng)求都需經(jīng)過代理服務(wù)器才能訪問到正式服務(wù)器,某種程度上可以保護(hù)網(wǎng)站安全。
3.使用Nginx實(shí)現(xiàn)負(fù)載均衡
負(fù)載均衡即是代理服務(wù)器將接收的請(qǐng)求均衡的分發(fā)到各服務(wù)器中。
負(fù)載均衡的優(yōu)勢(shì)在訪問量少或并發(fā)小的時(shí)候可能并不明顯,且不說淘寶雙11、鐵道部搶票這種級(jí)別的訪問量、高并發(fā),就是一般網(wǎng)站的搶購(gòu)活動(dòng)時(shí),也會(huì)給服務(wù)器造成很大壓力,可能會(huì)造成服務(wù)器崩潰。而負(fù)載均衡可以很明顯的減少甚至消除這種情況的出現(xiàn),下面我們說說實(shí)現(xiàn)方法。
首先我們?cè)匍_啟一個(gè)tomcat服務(wù)器,這里區(qū)分一下就叫tomcat2吧,原先的叫tomcat1。將tomcat1上的項(xiàng)目,拷貝到tomcat2上,稍微修改下頁面上的文字以便等下區(qū)分我們的請(qǐng)求被分發(fā)到了哪個(gè)tomcat上。tomcat2端口我這里為8081。在瀏覽器中輸入localhost:8081。
服務(wù)器準(zhǔn)備好了,我們要在server外部定義個(gè)服務(wù)器集群,即用到了上文中提到的upstream 標(biāo)簽。服務(wù)器集群名字取為test。
同時(shí)我們需要再修改下server,將定向的路徑轉(zhuǎn)到問你服務(wù)器集群上。
重啟下nginx,在瀏覽器輸入localhost,再多刷新幾次,可以看到兩個(gè)頁面在來回切換。
這樣即實(shí)現(xiàn)了負(fù)債均衡。假設(shè)我們服務(wù)器在運(yùn)行過程中,其中一個(gè)tomcat掛了,仍然還有另一個(gè)可以訪問。更新的時(shí)候也能先關(guān)閉只其中一個(gè),輪流更新。另外還能有效緩解服務(wù)器壓力,是不是很棒呢?
當(dāng)然,以上nginx的配置是簡(jiǎn)單化的,實(shí)際上我們還可以配置nginx對(duì)靜態(tài)資源的緩存等等,在此就不多加演示了。
4.小結(jié)
花了好些時(shí)間,總算陸陸續(xù)續(xù)要寫好了,在此小結(jié)一下。
nginx作為一個(gè)反向代理服務(wù)器,能緩存我們項(xiàng)目的靜態(tài)文件,并實(shí)現(xiàn)反向代理與均衡負(fù)載,可以有效減少服務(wù)器壓力,即使項(xiàng)目不大,也可以使用。
大家另外應(yīng)該都還發(fā)現(xiàn)了個(gè)問題,雖然這樣請(qǐng)求能分別請(qǐng)求到兩個(gè)tomcat上,如果是一般不需身份校檢的或什么認(rèn)證的方法尚可,但如果出現(xiàn)這類情況:
我們?cè)趖omcat1上進(jìn)行了登錄,這時(shí)用戶session當(dāng)然是存在tomcat1上的,而這時(shí)進(jìn)入個(gè)人中心的請(qǐng)求請(qǐng)求到tomcat2上了,這時(shí)就會(huì)出現(xiàn)問題了。tomcat2會(huì)告訴你還未登錄,這顯然不是我們想看到的。
這就涉及到session共享了,如何讓兩個(gè)服務(wù)器上的session共用。我這里放到下次再說,作為碼農(nóng)比較忙,可能要過個(gè)好幾天。另外我將這次的demo源碼上傳了,下次還要用,nginx配置就不傳了,大家自己多動(dòng)手試驗(yàn)。
聯(lián)系客服