天天看點

Nginx+Tomcat 動靜分離實作負載均衡

0.前期準備

使用Debian環境。安裝Nginx(預設安裝),一個web項目,安裝tomcat(預設安裝)等。

1.一份Nginx.conf配置檔案

Nginx+Tomcat 動靜分離實作負載均衡
Nginx+Tomcat 動靜分離實作負載均衡

基本配置這個檔案,就可以實作負載了。但是裡面的各種關系要了解就比較麻煩了。這篇部落格,也不是教學篇,是記錄一下,友善以後自己看了。

2.基礎講解

現在假使有一台電腦192.168.8.203這台電腦,上面部署了Tomcat,裡面8080端口有J2EE的服務,通過浏覽器可以正常浏覽網頁。現在有一個問題tomcat是一個比較全面的web容器,對靜态網頁的處理,應該是比較費資源的,特别是每次都要從磁盤讀取靜态頁面,然後傳回。

這中間會消耗Tomcat的資源,可能會使那些動态頁面解析性能影響。秉承Linux哲學,一個軟體隻做一件事的原則。Tomcat就應該隻處理JSP動态頁面。這裡就用到以前了解的Nginx來進行反向代理。第一步代理,實作動靜網頁分離。這個很簡單的。

Nginx+Tomcat 動靜分離實作負載均衡

修改nginx的配置檔案 /etc/nginx/nginx.conf 預設有個配置檔案的。其實大部分都差不多,關鍵還是server段的設定。這裡我設定server段如上所示,其他段複制就可以了。

server段裡面的解釋如下:第35行為監聽本機80端口。37-39行表示預設首頁,這裡的預設首頁我是index.jsp 對應到我項目中是一個index。 這裡根據需要可以改為

indexindex.jspindex.htmlindex.htmindex.php

具體可參考其他文章。 關鍵的第40行,這個是正則比對,網上也有很多介紹。這裡比對我項目中用到的所有靜态網頁字尾。第41行是代理位址。這裡我代理到我的web應用中。expires 30d緩存為30天,這裡的緩存是對應到前端頁面,使用者的Cache-Control字段

第44行中那個正則是比對無字尾的頁面。我項目中jsp頁面是無字尾的。這裡可以根據需要進行修改。同樣代理到192.168.8.203:8080這裡。到這裡你可能會問,這有毛意思啊?當然不是這樣了。簡單的實作靜動分離,我們可以把第41行進行修改,改為

Nginx+Tomcat 動靜分離實作負載均衡

root   /var/lib/tomcat7/webapps/JieLiERP/WEB-INF

表示不代理,直接從本地磁盤拿。通過查tomcat日志可以看到靜态頁面是沒有通路到的。但這樣又有一個問題。

這樣的靈活性不好,對下面要講到的記憶體緩存和叢集部署來說都是不友好的,是以又有了下面的這種寫法。再寫一個server段。

Nginx+Tomcat 動靜分離實作負載均衡

這次監聽808端口,然後上上面的代碼41行就可以修改為 proxy_pass http://192.168.8.203:808了,到這裡就實作了動靜分離了。如果多台伺服器,就修改對應的ip就可以了。如果發現連接配接不上的,要檢查一下防火牆,權限等外部問題,這個配置是這樣的。

如果單純這樣的話,我們會發現頁面直接傳輸過于占用帶寬。對應web的優化,這裡想到的是通過對頁面進行gzip壓縮,然後傳到使用者那裡,再解壓,這樣可以有效的減少帶寬。這裡就會用到Nginx 的gzip子產品了。預設的Nginx是內建有gzip子產品的。隻需在http段增加下面配置即可。

Nginx+Tomcat 動靜分離實作負載均衡

給個首頁看看效果

不要在意請求數不一樣,那兩個請求是谷歌插件來的。不用覺得我在騙你。

Nginx+Tomcat 動靜分離實作負載均衡

作為假使有很多人通路的網站來說,緩存肯定是很重要的東西了。

一開始是想通過插件,讓Nginx和Redis進行合成,然後Nginx使用Redis來緩存的,但是發現配置起來很麻煩,還要自己下載下傳插件,重新編譯Nginx,比較麻煩,是以這裡覺得用Nginx自帶的緩存也是不錯的選擇。

雖然效率比不上redis,但是有還是比沒有好。Nginx預設的緩存是磁盤檔案系統的緩存,而不是像Redis那樣的記憶體級别的緩存。一開始我以為Nginx就隻有這樣。後來查了寫資料,才知道是我太天真了,對Linux不是很了解導緻的。Linux的一切皆檔案。

原來我們可以把檔案緩存到記憶體對應的Linux檔案系統中。我說的可能比較難以了解,請自行搜尋/dev/shm 這個檔案目錄。我們把檔案緩存到這個檔案目錄裡,其實就相當與記憶體的緩存了。隻不過還是靠檔案系統管理。是以比不上自定義格式的Redis那樣的記憶體緩存。

在http段進行基本配置

Nginx+Tomcat 動靜分離實作負載均衡
Nginx+Tomcat 動靜分離實作負載均衡

經過這兩個的配置就基本能實作了,這裡說幾個注意項,也是困擾我很久的問題。上面第一段代碼第6行,proxy_ignore_headers 如果web項目中的html的head頭裡面指定

Nginx+Tomcat 動靜分離實作負載均衡

這些不緩存的話,就要加上proxy_ignore_headers的配置項了。還有一點就是/dev/shm下面的檔案系統權限預設隻給root使用者,是以要chmod 777 -R /dev/shm 這樣不是很安全的做法,如果實際上線可以給定某個使用者組,關于使用者組的設定是配置的第一行

userwww www;

上面第二段代碼的第6行是增加一個header字段友善檢視是否擊中緩存。

我們rm -rf /dev/shm/JieLiERP/proxy_* 下面的所有檔案(注意這裡如果是進行多次測試的話要nginx -s reload 重新讀取配置或重新開機服務,因為你rm -rf隻是删除了緩存檔案,但是緩存的結構資訊還在nginx程序裡面,結構還在,如果不重新開機的話,是會出現通路不到的)

是以要記得重新開機哦。下面是運作效果

Nginx+Tomcat 動靜分離實作負載均衡

第一次通路

第二次通路,在浏覽器中Ctrl+Shift+R 強制重新整理

Nginx+Tomcat 動靜分離實作負載均衡

到這裡就可以看到效果了。我們檢視一下/dev/shm這個裡面

Nginx+Tomcat 動靜分離實作負載均衡
Nginx+Tomcat 動靜分離實作負載均衡

到這裡已經快結束了。最後也是比較關鍵的一個技術點,就是叢集,叢集,叢集。這個就要用到upstream了,看到最開頭的配置檔案了嗎,就是那個

Nginx+Tomcat 動靜分離實作負載均衡
Nginx+Tomcat 動靜分離實作負載均衡

上面那個就是叢集組了。upstream是關鍵字,static 和 dynamic是兩個伺服器叢集組的名稱。以第一個為例,server 127.0.0.1:808 是伺服器位址,後面的weight=1 是權重。有多個就寫多個。

親測試過,叢集中的一個壞了,不影響系統運作。至于更多的輪詢規則,可以參考網上更多的資料。這裡不多說。至于怎麼使用呢? proxy_pass 

http://192.168.8.203:808 改為 proxy_pass http://static; 這樣即可實作均衡。

到這裡就結束了。

把上面各個部分根據自己需求配置起來就可以實作單機房負載均衡了。 上面這種做法有一個缺點就是在前面的那一台nginx如果當機,後面是以機器就失去了被通路的能力了,是以需要在前面實作多個nginx多機房的負載。關于這個就是另外一個話題了。目前還沒有研究。以後有機會再說了。

上面動态伺服器組如果是那種需要儲存使用者狀态的話,會有問題,就是session問題,比如我在server1進行登入後,下一次動态伺服器組進行輪詢後可能配置設定到server2,就會造成要重新登入。

治标的辦法是,配置輪詢規則,根據使用者請求的IP進行Hash,然後配置設定對應的伺服器。具體配置如下:

Nginx+Tomcat 動靜分離實作負載均衡

這樣就可以實作一個使用者對應一個伺服器節點。這樣就不會有重複登入的問題。另一種治本的辦法是,利用緩存系統進行session的統一存儲管理。具體的做法我還沒有試驗過,參考資料有相關的文章,可以了解一下。

Nginx增加SSL功能,同樣的Nginx預設是有SSL子產品功能,我們不用額外安裝,隻需要簡單的配置就可以了。首先我們先來生成一些必要的證書。制作的過程還是比較簡單的。

Nginx+Tomcat 動靜分離實作負載均衡

下面就是配置Nginx了,我們可以把需要用到的client.pem, client.pem, client.key,unsecure這三個檔案放到Nginx的一個目錄下,剩下的Nginx配置如下:

Nginx+Tomcat 動靜分離實作負載均衡

重新開機Nginx,我們就可以通路Https網站了。 但是他喵的出現這個

Nginx+Tomcat 動靜分離實作負載均衡

這個是沒有什麼問題,具體原因是這個CA憑證要得到認可。是以我們上面自己生成的https證書,隻是自己生成的,如果要變成下面這種,就需要花錢購買了,剩下的這個自己上網解決。

(雖然自己生成的證書可以用,但是還是抵擋不了DNS欺騙,是以這種不安全證書,跟沒有其實是一樣的。不過據說這樣可以阻止營運商劫持。)

Nginx+Tomcat 動靜分離實作負載均衡

增加一個,就是在我們輸入http連接配接時自動跳轉到安全的https連接配接。這個還是比較實用的。方法還是有多種的,具體可以看參考資料裡面的部落格。我是使用下面這一種,我覺得是比較簡單的,代碼改動比較少的。就是對80端口進行代理轉發。

Nginx+Tomcat 動靜分離實作負載均衡

為什麼某些人會一直比你優秀,是因為他本身就很優秀還一直在持續努力變得更優秀,而你是不是還在滿足于現狀内心在竊喜,

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:860113481

群内提供免費的Java架構學習資料(裡面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!