0.前期準(zhǔn)備使用Debian環(huán)境,。安裝Nginx(默認(rèn)安裝),,一個(gè)web項(xiàng)目,安裝tomcat(默認(rèn)安裝)等,。 1.一份Nginx.conf配置文件 基本配置這個(gè)文件,,就可以實(shí)現(xiàn)負(fù)載了。但是里面的各種關(guān)系要了解就比較麻煩了,。這篇博客,,也不是教學(xué)篇,是記錄一下,,方便以后自己看了,。 2.基礎(chǔ)講解 現(xiàn)在假使有一臺(tái)電腦192.168.8.203這臺(tái)電腦,,上面部署了Tomcat,里面8080端口有J2EE的服務(wù),,通過瀏覽器可以正常瀏覽網(wǎng)頁?,F(xiàn)在有一個(gè)問題tomcat是一個(gè)比較全面的web容器,對(duì)靜態(tài)網(wǎng)頁的處理,,應(yīng)該是比較費(fèi)資源的,,特別是每次都要從磁盤讀取靜態(tài)頁面,然后返回,。 這中間會(huì)消耗Tomcat的資源,,可能會(huì)使那些動(dòng)態(tài)頁面解析性能影響。秉承Linux哲學(xué),,一個(gè)軟件只做一件事的原則,。Tomcat就應(yīng)該只處理JSP動(dòng)態(tài)頁面。這里就用到以前了解的Nginx來進(jìn)行反向代理,。第一步代理,,實(shí)現(xiàn)動(dòng)靜網(wǎng)頁分離,。這個(gè)很簡單的,。 修改nginx的配置文件 /etc/nginx/nginx.conf 默認(rèn)有個(gè)配置文件的。其實(shí)大部分都差不多,,關(guān)鍵還是server段的設(shè)置,。這里我設(shè)置server段如上所示,其他段復(fù)制就可以了,。 server段里面的解釋如下:第35行為監(jiān)聽本機(jī)80端口,。37-39行表示默認(rèn)主頁,這里的默認(rèn)主頁我是index.jsp 對(duì)應(yīng)到我項(xiàng)目中是一個(gè)index,。 這里根據(jù)需要可以改為 indexindex.jspindex.htmlindex.htmindex.php 具體可參考其他文章,。 關(guān)鍵的第40行,這個(gè)是正則匹配,,網(wǎng)上也有很多介紹,。這里匹配我項(xiàng)目中用到的所有靜態(tài)網(wǎng)頁后綴。第41行是代理地址,。這里我代理到我的web應(yīng)用中,。expires 30d緩存為30天,這里的緩存是對(duì)應(yīng)到前端頁面,,用戶的Cache-Control字段 第44行中那個(gè)正則是匹配無后綴的頁面,。我項(xiàng)目中jsp頁面是無后綴的。這里可以根據(jù)需要進(jìn)行修改,。同樣代理到192.168.8.203:8080這里,。到這里你可能會(huì)問,,這有毛意思啊,?當(dāng)然不是這樣了,。簡單的實(shí)現(xiàn)靜動(dòng)分離,我們可以把第41行進(jìn)行修改,,改為 root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF 表示不代理,,直接從本地磁盤拿。通過查tomcat日志可以看到靜態(tài)頁面是沒有訪問到的,。但這樣又有一個(gè)問題,。 這樣的靈活性不好,對(duì)下面要講到的內(nèi)存緩存和集群部署來說都是不友好的,,所以又有了下面的這種寫法,。再寫一個(gè)server段。 這次監(jiān)聽808端口,,然后上上面的代碼41行就可以修改為 proxy_pass http://192.168.8.203:808了,,到這里就實(shí)現(xiàn)了動(dòng)靜分離了。如果多臺(tái)服務(wù)器,,就修改對(duì)應(yīng)的ip就可以了,。如果發(fā)現(xiàn)連接不上的,要檢查一下防火墻,,權(quán)限等外部問題,,這個(gè)配置是這樣的。 如果單純這樣的話,,我們會(huì)發(fā)現(xiàn)頁面直接傳輸過于占用帶寬,。對(duì)應(yīng)web的優(yōu)化,這里想到的是通過對(duì)頁面進(jìn)行g(shù)zip壓縮,,然后傳到用戶那里,,再解壓,這樣可以有效的減少帶寬,。這里就會(huì)用到Nginx 的gzip模塊了,。默認(rèn)的Nginx是集成有g(shù)zip模塊的。只需在http段增加下面配置即可,。 給個(gè)首頁看看效果 不要在意請(qǐng)求數(shù)不一樣,,那兩個(gè)請(qǐng)求是谷歌插件來的。不用覺得我在騙你,。 作為假使有很多人訪問的網(wǎng)站來說,,緩存肯定是很重要的東西了。 一開始是想通過插件,讓Nginx和Redis進(jìn)行合成,,然后Nginx使用Redis來緩存的,,但是發(fā)現(xiàn)配置起來很麻煩,還要自己下載插件,,重新編譯Nginx,,比較麻煩,所以這里覺得用Nginx自帶的緩存也是不錯(cuò)的選擇,。 雖然效率比不上redis,,但是有還是比沒有好。Nginx默認(rèn)的緩存是磁盤文件系統(tǒng)的緩存,,而不是像Redis那樣的內(nèi)存級(jí)別的緩存,。一開始我以為Nginx就只有這樣。后來查了寫資料,,才知道是我太天真了,,對(duì)Linux不是很了解導(dǎo)致的。Linux的一切皆文件,。 原來我們可以把文件緩存到內(nèi)存對(duì)應(yīng)的Linux文件系統(tǒng)中,。我說的可能比較難以理解,請(qǐng)自行搜索/dev/shm 這個(gè)文件目錄,。我們把文件緩存到這個(gè)文件目錄里,,其實(shí)就相當(dāng)與內(nèi)存的緩存了。只不過還是靠文件系統(tǒng)管理,。所以比不上自定義格式的Redis那樣的內(nèi)存緩存,。 在http段進(jìn)行基本配置 經(jīng)過這兩個(gè)的配置就基本能實(shí)現(xiàn)了,,這里說幾個(gè)注意項(xiàng),,也是困擾我很久的問題。上面第一段代碼第6行,,proxy_ignore_headers 如果web項(xiàng)目中的html的head頭里面指定 這些不緩存的話,,就要加上proxy_ignore_headers的配置項(xiàng)了。還有一點(diǎn)就是/dev/shm下面的文件系統(tǒng)權(quán)限默認(rèn)只給root用戶,,所以要chmod 777 -R /dev/shm 這樣不是很安全的做法,,如果實(shí)際上線可以給定某個(gè)用戶組,關(guān)于用戶組的設(shè)置是配置的第一行 userwww www; 上面第二段代碼的第6行是增加一個(gè)header字段方便查看是否擊中緩存,。 我們r(jià)m -rf /dev/shm/JieLiERP/proxy_* 下面的所有文件(注意這里如果是進(jìn)行多次測試的話要nginx -s reload 重新讀取配置或重啟服務(wù),,因?yàn)槟鉹m -rf只是刪除了緩存文件,但是緩存的結(jié)構(gòu)信息還在nginx進(jìn)程里面,,結(jié)構(gòu)還在,,如果不重啟的話,是會(huì)出現(xiàn)訪問不到的) 所以要記得重啟哦。下面是運(yùn)行效果 第一次訪問 第二次訪問,,在瀏覽器中Ctrl Shift R 強(qiáng)制刷新 到這里就可以看到效果了,。我們查看一下/dev/shm這個(gè)里面 到這里已經(jīng)快結(jié)束了。最后也是比較關(guān)鍵的一個(gè)技術(shù)點(diǎn),,就是集群,,集群,集群,。這個(gè)就要用到upstream了,,看到最開頭的配置文件了嗎,就是那個(gè) 上面那個(gè)就是集群組了,。upstream是關(guān)鍵字,,static 和 dynamic是兩個(gè)服務(wù)器集群組的名稱。以第一個(gè)為例,,server 127.0.0.1:808 是服務(wù)器地址,,后面的weight=1 是權(quán)重。有多個(gè)就寫多個(gè),。 親測試過,,集群中的一個(gè)壞了,不影響系統(tǒng)運(yùn)行,。至于更多的輪詢規(guī)則,,可以參考網(wǎng)上更多的資料。這里不多說,。至于怎么使用呢,? proxy_pass http://192.168.8.203:808 改為 proxy_pass http://static; 這樣即可實(shí)現(xiàn)均衡。 到這里就結(jié)束了,。 把上面各個(gè)部分根據(jù)自己需求配置起來就可以實(shí)現(xiàn)單機(jī)房負(fù)載均衡了,。 上面這種做法有一個(gè)缺點(diǎn)就是在前面的那一臺(tái)nginx如果當(dāng)機(jī),后面所以機(jī)器就失去了被訪問的能力了,,所以需要在前面實(shí)現(xiàn)多個(gè)nginx多機(jī)房的負(fù)載,。關(guān)于這個(gè)就是另外一個(gè)話題了。目前還沒有研究,。以后有機(jī)會(huì)再說了,。 上面動(dòng)態(tài)服務(wù)器組如果是那種需要保存用戶狀態(tài)的話,會(huì)有問題,,就是session問題,,比如我在server1進(jìn)行登錄后,下一次動(dòng)態(tài)服務(wù)器組進(jìn)行輪詢后可能分配到server2,,就會(huì)造成要重新登錄,。 治標(biāo)的辦法是,配置輪詢規(guī)則,根據(jù)用戶請(qǐng)求的IP進(jìn)行Hash,,然后分配對(duì)應(yīng)的服務(wù)器,。具體配置如下: 這樣就可以實(shí)現(xiàn)一個(gè)用戶對(duì)應(yīng)一個(gè)服務(wù)器節(jié)點(diǎn)。這樣就不會(huì)有重復(fù)登錄的問題,。另一種治本的辦法是,,利用緩存系統(tǒng)進(jìn)行session的統(tǒng)一存儲(chǔ)管理。具體的做法我還沒有試驗(yàn)過,,參考資料有相關(guān)的文章,,可以了解一下。 Nginx增加SSL功能,,同樣的Nginx默認(rèn)是有SSL模塊功能,,我們不用額外安裝,只需要簡單的配置就可以了,。首先我們先來生成一些必要的證書,。制作的過程還是比較簡單的。 下面就是配置Nginx了,,我們可以把需要用到的client.pem, client.pem, client.key,unsecure這三個(gè)文件放到Nginx的一個(gè)目錄下,,剩下的Nginx配置如下: 重啟Nginx,我們就可以訪問Https網(wǎng)站了,。 但是他喵的出現(xiàn)這個(gè) 這個(gè)是沒有什么問題,,具體原因是這個(gè)CA證書要得到認(rèn)可。所以我們上面自己生成的https證書,,只是自己生成的,,如果要變成下面這種,就需要花錢購買了,,剩下的這個(gè)自己上網(wǎng)解決,。 (雖然自己生成的證書可以用,但是還是抵擋不了DNS欺騙,,所以這種不安全證書,,跟沒有其實(shí)是一樣的。不過據(jù)說這樣可以阻止運(yùn)營商劫持,。) 增加一個(gè),就是在我們輸入http連接時(shí)自動(dòng)跳轉(zhuǎn)到安全的https連接,。這個(gè)還是比較實(shí)用的,。方法還是有多種的,具體可以看參考資料里面的博客,。我是使用下面這一種,,我覺得是比較簡單的,代碼改動(dòng)比較少的。就是對(duì)80端口進(jìn)行代理轉(zhuǎn)發(fā),。 |
|