Nginx+tomcat配置集群負載均衡


轉自:http://blog.csdn.net/bruce_6/article/details/38228299

相信很多人都聽過nginx,這個小巧的東西慢慢地在吞食apache和IIS的份額。那究竟它有什么作用呢?可能很多人未必了解。

 說到反向代理,可能很多人都聽說,但具體什么是反向代理,很多人估計就不清楚了。摘一段百度百科上的描述:

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。 

 這里講得很直白。反向代理方式實際上就是一台負責轉發的代理服務器,貌似充當了真正服務器的功能,但實際上並不是,代理服務器只是充當了轉發的作用,並且從真正的服務器那里取得返回的數據。這樣說,其實nginx 完成的就是這樣的工作。我們讓nginx監聽一個端口,譬如80端口,但實際上我們轉發給在8080端口的tomcat,由它來處理真正的請求,當請求完成后,tomcat返回,但數據此時沒直接返回,而是直接給nginx,由nginx進行返回,這里,我們會以為是nginx進行了處理,但實際上進行處理的是tomcat。

 說到上面的方式,也許很多人又會想起來,這樣可以把靜態文件交由nginx來進行處理。對,很多用到nginx的地方都是作為靜態伺服器,這樣可以方便緩存那些靜態文件,比如CSS,JS,html,htm等文件。

閑話就不多說了,我們直接來看看nginx怎么使用。

 一、下載

nginx官網:http://nginx.org/

直接到nginx官方下載地址下載即可:http://nginx.org/en/download.html,根據各自的操作系統版本下載。本文選擇最新的nginx-1.6.0windows穩定版本。

image

 

二、安裝

安裝很簡單,直接解壓到指定的文件目錄即可。解壓后的目錄如下:

image

雙擊nginx.exe,發現一閃而過的窗口,代表nginx服務已經啟動。

 也可以使用命令進行啟動,使用命令行進入nginx根目錄下:

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. E:\programs\nginx-1.6.0>start nginx  


其他相關命令:

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. nginx -s stop    快速退出  
  2.   
  3. nginx -s quit    優雅退出  
  4.   
  5. nginx -s reload    更換配置,啟動新的工作進程,優雅的關閉以往的工作進程  
  6.   
  7. nginx -s reopen     重新打開日志文件  
查看任務管理器:

image

可能不止一個服務存在(我的就有5個服務(┬_┬)),下面驗證是否已經成功啟動,直接訪問http://localhost可以看到如下圖,代表安裝啟動成功:

image

三、配置

nginx文件目錄下有一個conf文件夾,其中有好幾個文件,其他先不管,我們打開nginx.conf,可以看到一段:

[html]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. server {  
  2.         listen       80;  
  3.         server_name  localhost;  
  4.   
  5.         #charset koi8-r;  
  6.   
  7.         #access_log  logs/host.access.log  main;  
  8.   
  9.         location / {  
  10.             root   html;  
  11.             index  index.html index.htm;  
  12.         }  

這段代碼在server里面,相當於一個代理服務器,當然可以配置多個。

下面我們仔細來分析一下:

listen:表示當前的代理服務器監聽的端口,默認的是監聽80端口。注意,如果我們配置了多個server,這個listen要配置不一樣,不然就不能確定轉到哪里去了。

server_name:表示監聽到之后需要轉到哪里去,這時我們直接轉到本地,這時是直接到nginx文件夾內。

location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這里

root:里面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件,這里對我們之后的靜態文件伺服很有用。

index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,並按順序來加載,如果第一個不存在,則找第二個,依此類推。

下面的error_page是代表錯誤的頁面,這里我們暫時不用,先不管它。

那我們知道了具體的配置了,怎么讓它訪問localhost時轉到tomcat時。實際上就修改兩個地方:

[html]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. server_name localhost:8080;   
  2.   
  3. location / {   
  4.   
  5.     proxy_pass http://localhost:8080;  
  6.   
  7. }    

我們就修改了上面兩個地方,我的tomcat在8080端口,可以根據自己的需要修改。這里有一個新元素proxy_pass,它表示代理路徑,相當於轉發,而不像之前說的root必須指定一個文件夾。

此時我們修改了文件,是不是就意思着必須先關了nginx再重新啟動了,其實不必,nginx可以重新加載文件的。

我們直接運行:

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. nginx -s reload   

如果不想直接加載,而只是想檢查配置文件有沒有問題,可以直接輸入:

 

[plain]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. nginx -t    

這可以檢查配置文件中是否有錯。 下面我們所有的修改都假設我們修改完成后運行了nginx -s reload進行重新加載配置文件,請注意。

一切沒問題了,然后我們再重新打開http://localhost,我們看到下面的頁面:

image

這時,我們發現它並不是剛才的welcome頁面了,而是tomcat的管理頁面了,不管我們點擊什么鏈接都是沒問題的,相當於直接訪問http://localhost:8080一樣。

四、配置集群負載均衡

有些人會說,這些都只會找一台服務器,但如果我們想在一台服務器掛了的時候,自動去找另外一台,這怎么辦?這實際上nginx都考慮到了。

這時,我們之前用的proxy_pass就有大用途了。

我們把之前的第一個例子,即全部都代理的修改一下:

最后修改如下:

[html]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. upstream local_tomcat {   
  2.   
  3.     server localhost:18080;   
  4.   
  5. }   
  6.    
  7.   
  8. server{   
  9.         location / {   
  10.   
  11.            proxy_pass http://local_tomcat;   
  12.   
  13.         }   
  14.   
  15.         #......其他省略   
  16.   
  17. }    

 我們在server外添加了一個upstream,而直接在proxy_pass里面直接用http://+upstream的名稱來使用。

我們還是直接來http://localhost,還是和第一個一樣的效果,所有鏈接都沒問題,說明我們配置正確。

upstream中的server元素必須要注意,不能加http://,但proxy_pass中必須加。

我們剛才說可以在一個服務器掛了的情況下連到另外一個,那怎么弄呢?

其實很簡單,在upstream中的local_tomcat中配置多一個server。比如我現在弄多一個tomcat,端口在18081,所以我們配置如下:

[html]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. upstream local_tomcat {   
  2.     server localhost:18080;   
  3.     server localhost:18081;   
  4. }   

此時,我們關閉tomcat,重新來運行http://localhost看看效果:

image

 我修改了index.jsp頁面,增加日志輸出信息,便於觀察。注意:左上角小貓頭上的:tomcat2、tomcat1。說明訪問了不同的tomcat。

 但有時我們就不想它掛的時候訪問另外一個,而只是希望一個服務器訪問的機會比另外一個大,這個可以在server最后加上一個weight=數字來指定,數字越大,表明請求到的機會越大。 

[html]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. upstream local_tomcat {   
  2.   
  3.     server localhost:18080 weight=1;   
  4.   
  5.     server localhost:18081 weight=5;   
  6.   
  7. }    

這時我們給了18081一個更高的權值,讓它更有機會訪問到,實際上當我們刷新http://localhost訪問的時候發現18081訪問機率大很多,18080幾乎沒機會訪問,一般情況下,如果我們必須這樣用,不要相關太大,以免一個服務器負載太大。

當然,server還有一些其他的元素,比如down表示暫時不用到該服務器等等。這些可以參考nginx的wiki。也許寫了一大堆,有人會有問題,那nginx怎么關閉呢?這倒是個問題,其實直接運行nginx -s stop就可以關閉了。

 至此window下nginx+tomcat負載均衡配置結束,關於tomcat Session的問題通常是采用memcached,或者采用nginx_upstream_jvm_route ,他是一個 Nginx 的擴展模塊,用來實現基於 Cookie 的 Session Sticky 的功能。如果tomcat過多不建議session同步,server間相互同步session很耗資源,高並發環境容易引起Session風暴。請根據自己應用情況合理采納session解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM