Nginx是一款HTTP和反向代理服務器,有關它的介紹能夠到網上搜一下,不少不少,再也不累述。這裏,咱們記錄一下Nginx的安裝過程,以及如何配置Nginx來實現Tomcat集羣的負載均衡。nginx
基本思路
假如如今咱們有一個使用Java實現的Web搜索服務器,用戶能夠經過Web頁面輸入關鍵詞,搜索服務器處理搜索請求並向用戶展現搜索結果。若是用戶訪問量很大的話,咱們的這臺搜索服務器承受的壓力會很大,極可能因爲搜索服務器的處理能力達到上限,在某一個時刻沒法再處理用戶新到來的請求。因此,咱們就考慮將用戶請求的壓力分散開,即在多臺服務器上部署同一套搜索服務器程序,而後經過一個負載均衡策略,將請求的壓力分攤在多臺搜索服務器上,這樣,在用戶請求量很大的狀況下,很好解決單臺服務器的沒法處理請求的問題。web
咱們的想法就是,經過一臺服務器作代理,使用負載均衡軟件實現請求的代理轉發,將用戶的請求轉發到多臺搜索服務器上去處理,就能實現多臺搜索服務器的負載均衡,而不致於單一服務器處理全部請求。apache
假設,咱們如今有三臺機器,各臺服務器以下所示:ubuntu
- 搜索服務器:192.168.0.174 RHEL 5
- 搜索服務器:192.168.0.181 Win 7
- 代理服務器: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-1.0.8.targz, pcre-8.13.tar.gz這兩個安裝包,並解壓縮到目錄/home/shirdrn/tools下面,而後安裝過程以下所示:
- cd /home/shirdrn/tools
- tar -xvf pcre-8.13.tar.bz2
- tar -xzvf nginx-1.0.8.tar.gz
- cd /home/shirdrn/tools/nginx-1.0.8
- ./configure --with-http_stub_status_module --prefix=/home/shirdrn/servers/nginx --with-pcre=/home/shirdrn/tools/pcre-8.13
- make
- 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的基本配置在下面說明)。
下面,咱們看一下咱們實現Nginx負載均衡的配置。配置文件爲conf/nginx.conf,因爲咱們進行的代理的配置,經過使用一個單獨的代理配置文件conf/proxy.conf,在conf/nginx.conf中引入該代理配置便可。
conf/proxy.conf的配置內容以下所示:
- proxy_redirect off;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 300;
- proxy_send_timeout 300;
- proxy_read_timeout 300;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
各配置項的含義,能夠經過查閱相關文檔瞭解。下面看conf/nginx.conf的配置,咱們根據實踐操做所作的修改,並對相關基本配來作適當的說明,以下所示:
啓動Nginx比較簡單,有兩種方式:一種是直接使用默認安裝路徑下的nginx.conf,啓動命令以下所示:
- /home/shirdrn/servers/nginx-1.0.8/sbin/nginx
另外一種是,nginx.conf配置能夠放到其餘目錄下面,啓動時經過-c選項指定配置文件路徑便可,啓動命令以下所示:
- /home/shirdrn/servers/nginx-1.0.8/sbin/nginx -c /home/shirdrn/servers/nginx-1.0.8/conf/nginx.conf
能夠查看啓動進程:
- root@dev2:~$ ps -ef | grep nginx
- root 15952 1 0 18:56 ? 00:00:00 nginx: master process sbin/nginx
- root 15953 15952 0 18:56 ? 00:00:00 nginx: worker process
- root 15954 15952 0 18:56 ? 00:00:00 nginx: worker process
- root 15955 15952 0 18:56 ? 00:00:00 nginx: worker process
- ubuntu 22988 22887 0 22:19 pts/0 00:00:00 grep --color=auto nginx
查看Nginx監聽的端口號:
- root@dev2:/home/ubuntu# netstat -nap | grep '8888'
- tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 15952/nginx
不管在Windows下仍是Linux下,Tomcat的配置無需作額外的配置,只要可以發佈你的Web應用便可。可是,咱們經過Nginx進行反向代理請求,必須保證多個Tomcat下的Web應用的請求路徑相一致,例如,咱們配置的兩臺搜索服務器的單獨請求路徑,分別以下所示:
- http://192.168.0.174:8080/solr/core0/search/?q=九寨溝&start=0&rows=10
- http://192.168.0.181:8080/solr/core0/search/?q=馬爾代夫&start=0&rows=10
咱們將咱們的搜索服務器程序,分別發佈到這兩臺搜索服務器的Tomcat上,能夠經過實際接口進行單獨接收請求並處理。
測試驗證
下面,來測試一下,驗證咱們上述配置的內容,是否可以按照開始設計的思路,實現負載均衡。因爲在Nginx的配置中,咱們設置了兩臺搜索服務器處理請求的權重爲1:1,因此在測試的過程當中很容易就能看到。因爲全部的請求都是先到達代理服務器,經過代理服務器進行轉發,因此對外部只有一個統一的接口:
- http://192.168.0.184:8888/solr/core0/search/?q=普吉島&start=0&rows=10
根據代理配置,代理服務器只是轉發請求和相應,而不作請求的處理等工做,因此負荷會小一些。經過負載分攤,兩個搜索服務器的負荷也會比單臺的狀況下有所好轉。上面代理的請求連接,實際會轉換爲以下二者之一:
- http://192.168.0.174:8080/solr/core0/search/?q=普吉島&start=0&rows=10
- http://192.168.0.181:8080/solr/core0/search/?q=普吉島&start=0&rows=10
咱們看一下,各臺服務器實際執行時的日誌記錄。以下4個請求:
- http://192.168.0.184:8888/solr/core0/search/?q=九寨溝&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=普吉島&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=馬爾代夫&start=0&rows=10
- http://192.168.0.184:8888/solr/core0/search/?q=西雙版納&start=0&rows=10
Nginx日誌,以下所示:
- 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"
- 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"
- 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"
- 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請求處理日誌:
- 2011-10-5 21:42:12 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=普吉島&rows=10} hits=16 status=0 QTime=48
- 2011-10-5 21:42:32 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=西雙版納&rows=10} hits=29 status=0 QTime=54
搜索服務器192.168.0.181請求處理日誌:
- 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:06 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:08 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:08 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=九寨溝0&rows=10} hits=54 status=0 QTime=2116
- 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:27 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: create new Seg ...
- 2011-10-5 21:42:28 com.chenlb.mmseg4j.solr.MMSegTokenizerFactory newSeg
- 信息: use complex mode
- 2011-10-5 21:42:29 org.apache.solr.core.SolrCore execute
- 信息: [core0] webapp=/solr path=/search/ params={bq=spiderName:baseSeSpider^1.5&start=0&q=馬爾代夫0&rows=10} hits=57 status=0 QTime=1721
測試發現,雖然只有4個請求,可是在負載權重相等狀況下,很好地分攤到兩臺搜索服務器上去進行請求的實際處理。經過上面日誌能夠看出,咱們基本實現了一開始設計的思路。
From: http://blog.csdn.net/shirdrn/article/details/6845520