Ubuntu下基於Nginx實現Tomcat集羣負載均衡

 

目錄(?)[+]html

 

Nginx是一款HTTP和反向代理服務器,有關它的介紹能夠到網上搜一下,不少不少,再也不累述。這裏,咱們記錄一下Nginx的安裝過程,以及如何配置Nginx來實現Tomcat集羣的負載均衡。nginx

 

基本思路

 

假如如今咱們有一個使用Java實現的Web搜索服務器,用戶能夠經過Web頁面輸入關鍵詞,搜索服務器處理搜索請求並向用戶展現搜索結果。若是用戶訪問量很大的話,咱們的這臺搜索服務器承受的壓力會很大,極可能因爲搜索服務器的處理能力達到上限,在某一個時刻沒法再處理用戶新到來的請求。因此,咱們就考慮將用戶請求的壓力分散開,即在多臺服務器上部署同一套搜索服務器程序,而後經過一個負載均衡策略,將請求的壓力分攤在多臺搜索服務器上,這樣,在用戶請求量很大的狀況下,很好解決單臺服務器的沒法處理請求的問題。web

咱們的想法就是,經過一臺服務器作代理,使用負載均衡軟件實現請求的代理轉發,將用戶的請求轉發到多臺搜索服務器上去處理,就能實現多臺搜索服務器的負載均衡,而不致於單一服務器處理全部請求。apache

假設,咱們如今有三臺機器,各臺服務器以下所示:ubuntu

[html]  view plain copy
 
  1. 搜索服務器:192.168.0.174 RHEL 5  
  2. 搜索服務器:192.168.0.181 Win 7  
  3. 代理服務器:192.168.0.184 Ubuntu 11.04.1  

經過使用Nginx作反向代理,安裝在192.168.0.184上。另外兩臺服務器均爲搜索服務器,而且都安裝了Tomcat Web服務器軟件,搜索服務器程序就部署在Tomcat中。服務器192.168.0.184接收搜索請求,並經過Nginx將請求轉發到兩臺搜索服務器上進行處理,而後返回結果,經過Nginx代理響應的搜索結果。瀏覽器

 

配置資源

 

這裏,說明一下咱們各臺服務器的軟件配置,及其應用端口,以下所示:tomcat

 

服務器IP:端口服務器

軟件配置session

192.168.0.174:8080 OpenJDK 1.6.0_22, apache-tomcat-7.0.22.tar
192.168.0.181:8080 Sun JDK 1.6.0_17, apache-tomcat-6.0.20.exe
192.168.0.184:8888 nginx-1.0.8.targz, pcre-8.13.tar.gz

 

 

安裝配置過程

  • Nginx安裝

 下載nginx-1.0.8.targz, pcre-8.13.tar.gz這兩個安裝包,並解壓縮到目錄/home/shirdrn/tools下面,而後安裝過程以下所示:

[html]  view plain copy
 
  1. cd /home/shirdrn/tools  
  2. tar -xvf pcre-8.13.tar.bz2  
  3. tar -xzvf nginx-1.0.8.tar.gz  
  4. cd /home/shirdrn/tools/nginx-1.0.8  
  5. ./configure --with-http_stub_status_module --prefix=/home/shirdrn/servers/nginx --with-pcre=/home/shirdrn/tools/pcre-8.13  
  6. make  
  7. make install  

執行上述命令,須要使用超級用戶權限,將咱們的Nginx安裝到/home/shirdrn/servers/nginx-1.0.8下面,因爲指定了--with-pcre=/home/shirdrn/tools/pcre-8.13,即pcre的源碼路徑,在安裝的過程首先編譯pcre並安裝,而後纔開始配置安裝Nginx。

驗證是否安裝成功,只須要在瀏覽器輸入http://192.168.0.184:8888/便可,默認Nginx使用80端口,這裏個人80端口被佔用了,因此修改成8888(有關Nginx的基本配置在下面說明)。

  • Ngin負載均衡配置

 下面,咱們看一下咱們實現Nginx負載均衡的配置。配置文件爲conf/nginx.conf,因爲咱們進行的代理的配置,經過使用一個單獨的代理配置文件conf/proxy.conf,在conf/nginx.conf中引入該代理配置便可。

conf/proxy.conf的配置內容以下所示:

[html]  view plain copy
 
  1. proxy_redirect          off;  
  2. proxy_set_header        Host $host;  
  3. proxy_set_header        X-Real-IP $remote_addr;  
  4. proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  5. client_max_body_size    10m;  
  6. client_body_buffer_size 128k;  
  7. proxy_connect_timeout   300;  
  8. proxy_send_timeout      300;  
  9. proxy_read_timeout      300;  
  10. proxy_buffer_size       4k;  
  11. proxy_buffers           4 32k;  
  12. proxy_busy_buffers_size 64k;  
  13. proxy_temp_file_write_size 64k;  

各配置項的含義,能夠經過查閱相關文檔瞭解。下面看conf/nginx.conf的配置,咱們根據實踐操做所作的修改,並對相關基本配來作適當的說明,以下所示:

[html]  view plain copy
 
  1. user  root root; # Nginx所在的用戶和用戶組  
  2.   
  3. worker_processes  3; # 啓動的工做進程數量  
  4.   
  5. #error_log  logs/error.log;  
  6. #error_log  logs/error.log  notice;  
  7. #error_log  logs/error.log  info;  
  8.   
  9. pid        logs/nginx.pid; # Nginx進程ID  
  10.   
  11.   
  12. events {  
  13.     worker_connections  1024;  
  14. }  
  15.   
  16.   
  17. http {  
  18.     include       mime.types;  
  19.     default_type  application/octet-stream;  
  20.   
  21.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  22.     #                  '$status $body_bytes_sent "$http_referer" '  
  23.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  24.   
  25.     #access_log  logs/access.log  main;  
  26.   
  27.     sendfile        on;  
  28.     #tcp_nopush     on;  
  29.   
  30.     #keepalive_timeout  0;  
  31.     keepalive_timeout  65;  
  32.   
  33.     #gzip  on;  
  34.     upstream localhost { # 發到localhost上的請求,經過Nginx轉發到實際處理請求的服務器  
  35.            server 192.168.0.181:8080 weight=1;  
  36.            server 192.168.0.184:8080 weight=1;  
  37.     }  
  38.   
  39.     server {  
  40.         listen       8888; # Nginx監聽的端口,默認爲80  
  41.         server_name  localhost; # Nginx所在主機的名稱  
  42.   
  43.         #charset koi8-r;  
  44.   
  45.         #access_log  logs/host.access.log  main;  
  46.   
  47.         location / {  
  48.             root   html/solr; # 請求資源的路徑(代理:/home/shirdrn/servers/nginx/tml/solr/,該目錄下沒有任何數據)  
  49.             index  index.html index.htm;  
  50.             proxy_pass   http://localhost; # 代理:對發送到localhost上請求進行代理  
  51.             include proxy.conf; # 引入proxy.conf配置  
  52.         }  
  53.   
  54.         #error_page  404              /404.html;  
  55.   
  56.         # redirect server error pages to the static page /50x.html  
  57.         #  
  58.         error_page   500 502 503 504  /50x.html;  
  59.         location = /50x.html {  
  60.             root   html;  
  61.         }  
  62.   
  63.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  64.         #  
  65.         #location ~ \.php$ {  
  66.         #    proxy_pass   http://127.0.0.1;  
  67.         #}  
  68.   
  69.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  70.         #  
  71.         #location ~ \.php$ {  
  72.         #    root           html;  
  73.         #    fastcgi_pass   127.0.0.1:9000;  
  74.         #    fastcgi_index  index.php;  
  75.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  76.         #    include        fastcgi_params;  
  77.         #}  
  78.   
  79.         # deny access to .htaccess files, if Apache's document root  
  80.         # concurs with nginx's one  
  81.         #  
  82.         #location ~ /\.ht {  
  83.         #    deny  all;  
  84.         #}  
  85.     }  
  86.   
  87.   
  88.     # another virtual host using mix of IP-, name-, and port-based configuration  
  89.     #  
  90.     #server {  
  91.     #    listen       8000;  
  92.     #    listen       somename:8080;  
  93.     #    server_name  somename  alias  another.alias;  
  94.   
  95.     #    location / {  
  96.     #        root   html;  
  97.     #        index  index.html index.htm;  
  98.     #    }  
  99.     #}  
  100.   
  101.   
  102.     # HTTPS server  
  103.     #  
  104.     #server {  
  105.     #    listen       443;  
  106.     #    server_name  localhost;  
  107.   
  108.     #    ssl                  on;  
  109.     #    ssl_certificate      cert.pem;  
  110.     #    ssl_certificate_key  cert.key;  
  111.   
  112.     #    ssl_session_timeout  5m;  
  113.   
  114.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
  115.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  116.     #    ssl_prefer_server_ciphers   on;  
  117.   
  118.     #    location / {  
  119.     #        root   html;  
  120.     #        index  index.html index.htm;  
  121.     #    }  
  122.     #}  
  123.   
  124. }  
  • 啓動Nginx

啓動Nginx比較簡單,有兩種方式:一種是直接使用默認安裝路徑下的nginx.conf,啓動命令以下所示:

[html]  view plain copy
 
  1. /home/shirdrn/servers/nginx-1.0.8/sbin/nginx  

另外一種是,nginx.conf配置能夠放到其餘目錄下面,啓動時經過-c選項指定配置文件路徑便可,啓動命令以下所示:

[html]  view plain copy
 
  1. /home/shirdrn/servers/nginx-1.0.8/sbin/nginx -c /home/shirdrn/servers/nginx-1.0.8/conf/nginx.conf  

能夠查看啓動進程:

[html]  view plain copy
 
  1. root@dev2:~$ ps -ef | grep nginx  
  2. root     15952     1  0 18:56 ?        00:00:00 nginx: master process sbin/nginx  
  3. root     15953 15952  0 18:56 ?        00:00:00 nginx: worker process  
  4. root     15954 15952  0 18:56 ?        00:00:00 nginx: worker process  
  5. root     15955 15952  0 18:56 ?        00:00:00 nginx: worker process  
  6. ubuntu   22988 22887  0 22:19 pts/0    00:00:00 grep --color=auto nginx  

查看Nginx監聽的端口號:

[html]  view plain copy
 
  1. root@dev2:/home/ubuntu# netstat -nap | grep '8888'  
  2. tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      15952/nginx   
  • Tomcat配置

 不管在Windows下仍是Linux下,Tomcat的配置無需作額外的配置,只要可以發佈你的Web應用便可。可是,咱們經過Nginx進行反向代理請求,必須保證多個Tomcat下的Web應用的請求路徑相一致,例如,咱們配置的兩臺搜索服務器的單獨請求路徑,分別以下所示:

[html]  view plain copy
 
  1. http://192.168.0.174:8080/solr/core0/search/?q=九寨溝&start=0&rows=10  
  2. http://192.168.0.181:8080/solr/core0/search/?q=馬爾代夫&start=0&rows=10  

咱們將咱們的搜索服務器程序,分別發佈到這兩臺搜索服務器的Tomcat上,能夠經過實際接口進行單獨接收請求並處理。

 

測試驗證

 

下面,來測試一下,驗證咱們上述配置的內容,是否可以按照開始設計的思路,實現負載均衡。因爲在Nginx的配置中,咱們設置了兩臺搜索服務器處理請求的權重爲1:1,因此在測試的過程當中很容易就能看到。因爲全部的請求都是先到達代理服務器,經過代理服務器進行轉發,因此對外部只有一個統一的接口:

[html]  view plain copy
 
  1. http://192.168.0.184:8888/solr/core0/search/?q=普吉島&start=0&rows=10  

根據代理配置,代理服務器只是轉發請求和相應,而不作請求的處理等工做,因此負荷會小一些。經過負載分攤,兩個搜索服務器的負荷也會比單臺的狀況下有所好轉。上面代理的請求連接,實際會轉換爲以下二者之一:

[html]  view plain copy
 
  1. http://192.168.0.174:8080/solr/core0/search/?q=普吉島&start=0&rows=10  
  2. http://192.168.0.181:8080/solr/core0/search/?q=普吉島&start=0&rows=10  

咱們看一下,各臺服務器實際執行時的日誌記錄。以下4個請求:

[html]  view plain copy
 
  1. http://192.168.0.184:8888/solr/core0/search/?q=九寨溝&start=0&rows=10  
  2. http://192.168.0.184:8888/solr/core0/search/?q=普吉島&start=0&rows=10  
  3. http://192.168.0.184:8888/solr/core0/search/?q=馬爾代夫&start=0&rows=10  
  4. http://192.168.0.184:8888/solr/core0/search/?q=西雙版納&start=0&rows=10  

Nginx日誌,以下所示:

[html]  view plain copy
 
  1. 192.168.0.181 - - [05/Oct/2011:21:42:05 +0800] "GET /solr/core0/search/?q=九寨溝&start=0&rows=10 HTTP/1.1" 200 329495 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"  
  2. 192.168.0.181 - - [05/Oct/2011:21:42:12 +0800] "GET /solr/core0/search/?q=普吉島&start=0&rows=10 HTTP/1.1" 200 110349 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"  
  3. 192.168.0.181 - - [05/Oct/2011:21:42:25 +0800] "GET /solr/core0/search/?q=馬爾代夫&start=0&rows=10 HTTP/1.1" 200 85572 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"  
  4. 192.168.0.181 - - [05/Oct/2011:21:42:32 +0800] "GET /solr/core0/search/?q=西雙版納&start=0&rows=10 HTTP/1.1" 200 141030 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30"  

咱們看一下,各臺搜索服務器接收請求處理的日誌:
搜索服務器192.168.0.174請求處理日誌:

[html]  view plain copy
 
  1. 2011-10-5 21:42:12 org.apache.solr.core.SolrCore execute  
  2. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=普吉島&rows=10} hits=16 status=QTime=48   
  3. 2011-10-5 21:42:32 org.apache.solr.core.SolrCore execute  
  4. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=西雙版納&rows=10} hits=29 status=QTime=54  

搜索服務器192.168.0.181請求處理日誌:

[html]  view plain copy
 
  1. 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  2. 信息: create new Seg ...  
  3. 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  4. 信息: use complex mode  
  5. 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  6. 信息: create new Seg ...  
  7. 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  8. 信息: use complex mode  
  9. 2011-10-5 21:42:08 org.apache.solr.core.SolrCore execute  
  10. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=九寨溝0&rows=10} hits=54 status=QTime=2116   
  11. 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  12. 信息: create new Seg ...  
  13. 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  14. 信息: use complex mode  
  15. 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  16. 信息: create new Seg ...  
  17. 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg  
  18. 信息: use complex mode  
  19. 2011-10-5 21:42:29 org.apache.solr.core.SolrCore execute  
  20. 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=馬爾代夫0&rows=10} hits=57 status=QTime=1721   

測試發現,雖然只有4個請求,可是在負載權重相等狀況下,很好地分攤到兩臺搜索服務器上去進行請求的實際處理。經過上面日誌能夠看出,咱們基本實現了一開始設計的思路。

 

From:     http://blog.csdn.net/shirdrn/article/details/6845520

相關文章
相關標籤/搜索