Nginx反向代理+緩存開啓+url重寫+負載均衡(帶健康探測)的部署記錄

 

在平常運維工做中,運維人員會時常使用到nginx的反向代理,負載均衡以及緩存等功能來優化web服務性能。
廢話很少說,下面對測試環境下的nginx反向代理+緩存開啓+url重寫+負載均衡(帶健康探測)搭建過程作一記錄: php

1、後端的Real Server的準備html

兩臺RS服務器(192.168.1.104/192.168.1.105)要事先配置好nginx。
而且nginx訪問均是用ip訪問便可,方便實驗效果!前端

2、nginx代理服務器192.168.1.103(假設外網ip是111.112.114.23)的配置node

1.nginx反向代理和緩存linux

0)安裝依賴軟件(若是是ubuntu系統,則sudo apt-get update && sudo apt-get upgrade && sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential openssl libssl0.9.8 libssl-dev)
[root@node1 ~]# yum install -y pcre pcre-devel openssl openssl-devel gcc nginx

1)首先添加用戶nginx,實現以之運行nginx服務進程:
[root@node1 ~]# groupadd -r nginx
[root@node1 ~]# useradd -r -g nginx -s /bin/false -M nginx                  #-M參數表示建立用戶時不建立用戶家目錄web

2)接着開始編譯和安裝:
[root@node1 ~]# cd /usr/loca/src
[root@node1 src]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
[root@node1 src]# tar -zxvf nginx-1.8.0.tar.gz
[root@node1 src]# cd nginx-1.8.0
[root@node1 nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre
[root@node1 src]# make && make install 正則表達式

#以上編譯安裝nginx後,--http-client-body-temp-path、--http-proxy-temp-path、--http-fastcgi-temp-path、--http-uwsgi-temp-path、--http-scgi-temp-path默認的路徑就在/usr/local/nginx下,分別是client_body_temp、proxy_temp、fastcgi_temp、scgi_temp、uwsgi_tempubuntu

[root@node1 src]# cd /usr/local/nginx/
[root@node1 nginx]# ls
conf html logs sbin
[root@node1 nginx]# /usr/local/nginx/sbin/nginx     //nginx啓動後,就會出現下面的目錄
[root@node1 nginx]# ls /usr/local/nginx/
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_tempvim

3)反代的實現,和緩存的開啓(可參考:nginx緩存配置的操做記錄梳理

[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
  keepalive_timeout 65;

#要想開啓nginx的緩存功能,須要添加此處的兩行內容!

#這一行分別表示:定義緩存存儲目錄,手動建立;緩存級別,表示緩存目錄的第一級目錄是1個字符,第二級目錄是2個字符;內核中創建用於緩存緩存數據源數據的空間,查找緩存的時候,先從這個內核空間中找到,緩存數據的源數據,而後再到對應目錄中查找緩存;這一行分別表示:緩存空間最大值;緩存的數據,60分鐘內沒有被訪問過就刪除 
  proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=60m;

#這一行分別表示:建立緩存的時候可能生成一些臨時文件存放的位置,自動建立
  proxy_temp_path /var/www/cache/tmp;

server {
listen 80;
server_name localhost;

location / {
#root html;
#index index.html index.htm;
  proxy_pass http://192.168.1.104/;                       #代理哪一個web服務器
  proxy_cache mycache;                                          #內存緩存源數據空間名字,對應咱們前面的設定
  proxy_cache_valid 200 302 60m;                          #頁面返回碼爲200 302 的緩存60分
  proxy_cache_valid 404 1m;                                   #頁面錯誤響應嗎404緩存時間1分
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
  }

[root@node1 src]# mkdir /var/www/cache
[root@node1 src]# /usr/local/nginx/sbin/nginx

4)驗證結果
訪問http://111.112.114.23,則顯示的是http://192.168.1.104的訪問結果(如上配置,RS2的反向代理相似)

---------------------------------------------------------------------------------------------------------
再看以下的一個實例配置(nginx.conf文件中已開啓緩存功能)(max_fails默認值爲1,fail_timeout默認值爲10s,鏈接失敗的情形由proxy_next_upstream 指定)

upstream LB-WWW {
      ip_hash;
      server 192.168.1.101:80 max_fails=3 fail_timeout=30s weight=100;   #max_fails = 3 爲容許失敗的次數,默認值爲1
      server 192.168.1.102:80 max_fails=3 fail_timeout=30s weight=100;   #fail_timeout = 30s(也能夠是fail_timeout = 30,即後面的秒單位不帶) 當max_fails次失敗後,暫停將請求分發到該後端服務器的時間
      server 192.168.1.118:80 max_fails=3 fail_timeout=30s weight=50;    #因爲這三臺機器中,前兩臺配置高,後一臺118機器配置低點,三臺機器開啓的nginx線上數是同樣的,因此118機器設置的weight權重低。
    }                                                                    #weight權限設置低,命中率就會低,這樣機器壓力就會減輕(如果權重不設置低點,也能夠經過減小nginx線程數來減小機器壓力);


server {
     listen       80;
     server_name  www.wangshibo.com;
  
      access_log  /usr/local/nginx/logs/www-access.log main;
      error_log  /usr/local/nginx/logs/www-error.log;
  
     location / {
         proxy_pass http://LB-WWW;
         proxy_redirect off ;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header REMOTE-HOST $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_connect_timeout 300;             #跟後端服務器鏈接超時時間,發起握手等候響應時間
         proxy_send_timeout 300;                #後端服務器回傳時間,就是在規定時間內後端服務器必須傳完全部數據
         proxy_read_timeout 600;                #鏈接成功後等待後端服務器的響應時間,已經進入後端的排隊之中等候處理
         proxy_buffer_size 256k;                #代理請求緩衝區,會保存用戶的頭信息以供nginx進行處理
         proxy_buffers 4 256k;                  #同上,告訴nginx保存單個用幾個buffer最大用多少空間
         proxy_busy_buffers_size 256k;          #若是系統很忙時候能夠申請最大的proxy_buffers
         proxy_temp_file_write_size 256k;       #proxy緩存臨時文件的大小
         proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
         proxy_max_temp_file_size 128m;
         proxy_cache mycache;                   #內存緩存源數據空間名字,對應咱們前面的設定                      
         proxy_cache_valid 200 302 60m;                      
         proxy_cache_valid 404 1m;
        }
}

proxy_set_header參數解釋

1)proxy_redirect off
語法:proxy_redirect [ default|off|redirect replacement ] 
默認值:proxy_redirect default 
使用字段:http, server, location 

proxy_redirect功能比較強大,其做用是對發送給客戶端的URL進行修改。
若是須要修改從被代理服務器傳來的應答頭中的"Location"和"Refresh"字段,能夠用這個指令設置。
設置爲off,表示禁止全部的proxy_redirect指令.

假設被代理服務器返回Location字段爲:http://localhost:8000/two/some/uri/
這個指令: 
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
將Location字段重寫爲http://frontend/one/some/uri/。
在代替的字段中能夠不寫服務器名:

proxy_redirect http://localhost:8000/two/ /;
這樣就使用服務器的基本名稱和端口,即便它來自非80端口。
若是使用「default」參數,將根據location和proxy_pass參數的設置來決定。

例以下列兩個配置等效:
location /one/ {  
    proxy_pass  http://upstream:port/two/;  
    proxy_redirect   default;
} 

location /one/ {  
    proxy_pass  http://upstream:port/two/;  
    proxy_redirect  http://upstream:port/two/ /one/;
  }


在指令中可使用一些變量:
proxy_redirect  http://localhost:8000/ http://$host:$server_port/;


這個指令有時能夠重複:
proxy_redirect   default;  
proxy_redirect   http://localhost:8000/  /;  
proxy_redirect   ;  
/;

參數off將在這個字段中禁止全部的proxy_redirect指令:
proxy_redirect   off;  
proxy_redirect   default;  
proxy_redirect   http://localhost:8000/  /;  
proxy_redirect   ;  
/;
利用這個指令能夠爲被代理服務器發出的相對重定向增長主機名:

---------------------------------------------------------------------------------------------------
實例說明:
好比在作nginx反向代理時出了一點點問題,原來後端節點用的端口是8080,經過反向代理後,使用wireshark抓包發現location頭域數值爲http://192.168.1.154:8080/huihui/,
若是把這個返回給客戶端確定是不能夠的,看起來彆扭並且還暴露了後端節點的具體信息。因此在這裏用到了nginx的proxy_redirect指定修改被代理服務器返回的響應頭中的location頭域跟refresh頭域數值。

前期配置(暴露了後端節點信息)
[root@localhost nginx]# cat test.conf
server {
       listen       80;
       server_name  www.wangshibo.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect off;
       }
 }

此時咱們經過curl查看結果得出
[root@localhost nginx]# curl -I http://www.wangshibo.com/huihui
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 24 Dec 2015 12:02:00 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://192.168.1.154:8080/huihui/

這裏location爲帶有後端服務器實際地址跟端口的響應頭信息,這樣在實際線上是不容許的。
因此這裏須要經過proxy_redirect將被代理服務器的響應頭中的location字段進行修改後返回給客戶端
修改後的配置:
[root@localhost nginx]# cat test.conf
server {
       listen       80;
       server_name  www.wangshibo.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect http://192.168.1.154:8080/huihui/  http://www.wangshibo.com/huihui/;
       }
server {
       listen       80;
       server_name  www.wangshibo.com;
       location / {
            proxy_pass http://192.168.1.154:8080;
            proxy_redirect ~^http://192.168.1.154:8080(.*)   http://www.wangshibo.com$1;
       }
則curl查看返回結果
[root@localhost nginx]# curl -I http://www.wangshibo.com/huihui
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 24 Dec 2015 12:08:34 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Location: http://www.wangshibo.com/huihui/
此時查看location已經變成了咱們想要的結果了。 此時經過replacement 301重定向到了咱們新的頁面
---------------------------------------------------------------------------------------------------

2)proxy_set_header Host $host;
容許從新定義或添加字段傳遞給代理服務器的請求頭。該值能夠包含文本、變量和它們的組合。在沒有定義proxy_set_header時會繼承以前定義的值。
默認狀況下,只有兩個字段被重定義:
proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

實例說明:
nginx對於upstream默認使用的是基於IP的轉發,以下配置:
[root@localhost nginx]# cat test.conf
upstream backend {  
    server 127.0.0.1:8080;  
}  
upstream china {  
    server china.wangshibo.com;  
}  
server {  
        listen       80;  
        server_name  www.wangshibo.com;  
        proxy_set_header Host $http_host;  
        proxy_set_header x-forwarded-for  $remote_addr;  
        proxy_buffer_size         64k;  
        proxy_buffers             32 64k;  
        charset utf-8;  
  
        access_log  logs/host.access.log  main;  
        location = /50x.html {  
            root   html;  
        }  
    location / {  
        proxy_pass backend ;  
    }  
          
    location = /customer/straightcustomer/download {  
        proxy_pass http://china;  
        proxy_set_header Host $proxy_host;  
    }  
}  

當匹配到/customer/straightcustomer/download時,使用china處理,到upstream就匹配到china.wangshibo.com,這裏直接轉換成IP進行轉發了。
假如china.wangshibo.com是在另外一臺nginx下配置的,ip爲10.22.10.116,則$proxy_host則對應爲10.22.10.116。
此時至關於設置了Host爲10.22.10.116。若是想讓Host是china.wangshibo.com,則進行以下設置:
proxy_set_header Host china.wangshibo.com;

若是不想改變請求頭「Host」的值,能夠這樣來設置:
proxy_set_header Host       $http_host;

可是,若是客戶端請求頭中沒有攜帶這個頭部,那麼傳遞到後端服務器的請求也不含這個頭部。 這種狀況下,更好的方式是使用$host變量——它的值在請求包含「Host」請求頭時爲「Host」字段的值,在請求未攜帶「Host」請求頭時爲虛擬主機的主域名:
proxy_set_header Host       $host;

此外,服務器名能夠和後端服務器的端口一塊兒傳送:
proxy_set_header Host       $host:$proxy_port;

若是某個請求頭的值爲空,那麼這個請求頭將不會傳送給後端服務器:
proxy_set_header Accept-Encoding "";

3)有了下面三行配置,就能夠在web的後端節點服務器端得到客戶端用戶的真實ip。
  proxy_set_header X-Real-IP $remote_addr;      //後端節點機器獲取客戶端真實ip的第一種方案
  proxy_set_header REMOTE-HOST $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    //後端節點機器獲取客戶端真實ip的第二中方案。固然這兩種方案也能夠一塊兒配置!

其中這個X-real-ip是一個自定義的變量名,名字能夠隨意取,這樣作完以後,用戶的真實ip就被放在X-real-ip這個變量裏了,而後,在web端能夠這樣獲取:
request.getAttribute("X-real-ip")

remote_addr  表明客戶端的ip,但它的值不是由客戶端提供的,而是服務器端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那麼網站的web服務器(好比nginx)就會把remote_addr設置爲
你的機器ip;若是你使用了代理,那麼你的瀏覽器會先訪問這個代理,而後再由這個代理轉發到網站,這樣web服務器就會把remote_addr設爲這臺代理機器的ip。

x_forwarded_for  正如上面所述,當你使用了代理時,web服務器就不知道你的真實ip了。爲了不這個狀況,代理服務器一般會增長一個叫作x_forwarded_for的頭消息,把鏈接它的客戶端ip(即你的上網機器的ip)
加到這個頭消息裏,這樣就能保證網站的web服務器能得到真實ip。

使用haproxy作反向代理
一般網站爲了支撐更大的訪問,會增長不少web服務器,並在這些服務器前面增長一個反向代理(如haproxy)它能夠把負載均衡的分佈到這些服務器上。你的瀏覽器訪問的首先是這臺反向代理服務器,它再把
你的請求轉發到後面的web服務器上,這就使得web服務器會把remote_addr設爲這臺反向代理服務器的ip,爲了能讓你的程序得到真實的客戶端ip,就須要給haproxy增長下面的配置:
option  forwardfor
它的做用就像上面說的,增長一個x_forwarded_for的頭信息,把你上網機器的ip添加進去。

-----------------------------------------------------------
實際上要得到用戶的真實ip,不是隻有這一個方法,下面咱們繼續看
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
這裏有個X-Forwarded-For變量,這是一個squid開發的,用於識別經過HTTP代理或負載平衡器原始IP一個鏈接到Web服務器的客戶機地址的非rfc標準,若是有作X-Forwarded-For設置的話,
每次通過proxy轉發都會有記錄,格式就是client1, proxy1, proxy2,以逗號隔開各個地址,因爲他是非rfc標準,因此默認是沒有的,須要強制添加,在默認狀況下通過proxy轉發的請求,
在後端看來遠程地址都是proxy端的ip 。也就是說在默認狀況下咱們使用request.getAttribute("X-Forwarded-For")獲取不到用戶的ip,若是咱們想要經過這個變量得到用戶的ip,
這樣配置的意思是:
增長一個$proxy_add_x_forwarded_for到X-Forwarded-For裏去,注意是增長,而不是覆蓋,固然因爲默認的X-Forwarded-For值是空的,因此咱們總感受X-Forwarded-For的值就等於$proxy_add_x_forwarded_for的值,
實際上當你搭建兩臺nginx在不一樣的ip上,而且都使用了這段配置,那你會發如今web服務器端經過request.getAttribute("X-Forwarded-For")得到的將會是客戶端ip和第一臺nginx的ip。

那麼$proxy_add_x_forwarded_for又是什麼?
$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr兩部分,他們之間用逗號分開。

舉個例子,有一個web應用,在它以前經過了兩個nginx轉發,www.linuxidc.com 即用戶訪問該web經過兩臺nginx。
在第一臺nginx中,使用
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for變量的"X-Forwarded-For"部分是空的,因此只有$remote_addr,而$remote_addr的值是用戶的ip,因而賦值之後,X-Forwarded-For變量的值就是用戶的真實的ip地址了。

到了第二臺nginx,使用
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
如今的$proxy_add_x_forwarded_for變量,X-Forwarded-For部分包含的是用戶的真實ip,$remote_addr部分的值是上一臺nginx的ip地址,因而經過這個賦值之後如今的X-Forwarded-For的值就變成了「用戶的真實ip,
第一臺nginx的ip」,這樣就清楚了吧。最後咱們看到還有一個$http_x_forwarded_for變量,這個變量就是X-Forwarded-For,因爲以前咱們說了,默認的這個X-Forwarded-For是爲空的,
因此當咱們直接使用proxy_set_header   X-Forwarded-For $http_x_forwarded_for時會發現,web服務器端使用request.getAttribute("X-Forwarded-For")得到的值是null。若是想要經過request.getAttribute("X-Forwarded-For")得到用戶ip,就必須先使用proxy_set_header            
X-Forwarded-For $proxy_add_x_forwarded_for;這樣就能夠得到用戶真實ip。

---------------------------------------------------------------------------------------------------------

2.url的重寫

-----------------------------------------------------------------------------
介紹下url重寫的格式,寫在配置文件中

rewrite regex replacement [flag]

Regex:被代替的原URL路徑,能夠是莫須有的,不存在的,支持正則表達式
Replacement:用來實現代替的URL路徑,必須真實存在的
Flag:標誌位,定義URL重寫後進行的操做,有4種,分別是:

a)
last:匹配重寫後的URL,再一次對URL重寫規則進行匹配,當使用last的須要注意的是以下:

rewrite /images/.*\.jpg /images/a.jpg last;
這樣寫的話,將會形成死循環。

b)
break:匹配重寫URL後,終止匹配,直接使用

c)
redirect:臨時重定向,返回代碼302

d)
permanent:永久重定向,返回代碼301

-----------------------------------------------------------------------------

下面是nginx配置文件中的配置,簡單實現url的重寫配置(能夠在vhosts虛擬主機配置裏設置)
[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf
...............

server {
listen 80;
server_name localhost;
root /var/www/html;
index index.html index.htm;

location / {
rewrite /abc http://www.huanqiu.com break;          #本機站點目錄下並不須要建立abc這個目錄,對其的訪問都重寫到http://www.huanqiu.com
}                                                                       

location /text {
rewrite / http://china.huanqiu.com break;                #本機站點目錄下不須要建立text目錄,對其的訪問都重寫到http://china.huanqiu.com
}                                                                         

}

[root@node1 src]# mkdir /var/www/html/text

注意:
nginx的rewrite重寫規則後的url必需要是能在外網訪問的真實url!
這一點要和nginx的反向代理區別開,proxy_pass代理後的url能夠是內網訪問,在內網之間代理!

3.nginx實現帶健康狀態檢測的負載均衡

nginx要可以檢測後端nginx的健康狀態,須要新的模塊,從新編譯nginx

模塊的使用:healthcheck_nginx_upstreams-master.zip

下載模塊,下載到本機的/usr/loca/src目錄下
下載地址:http://pan.baidu.com/s/1o8IrpbG
提取密碼:vp4y

[root@node1 ~]# cd /usr/local/src
[root@node1 src]# unzip healthcheck_nginx_upstreams-master.zip
[root@node1 src]# ll healthcheck_nginx_upstreams-master

接下來切換到nginx解壓目錄,打補丁~
[root@node1 src]# cd nginx-1.8.0
[root@node1 nginx-1.8.0]# patch -p1 < ../healthcheck_nginx_upstreams-master

而後從新編譯nginx,加上healthcheck_nginx_upstreams-master模塊
[root@node1 nginx-1.8.0]# ./configure --prefix=/usr/loca/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --add-module=/usr/local/src/healthcheck_nginx_upstreams-master

[root@node1 src]# make && make install

接下來配置實現nginx帶健康狀態的負載均衡:
[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf
..................
..................
upstream cluster {
   server 192.168.1.104 weight=1;
 server 192.168.1.105 weight=1;
  
 healthcheck_enabled;
 healthcheck_delay 1000;
 healthcheck_timeout 1000;
 healthcheck_failcount 3;
   healthcheck_send "GET /.health HTTP/1.0";
 
 #healthcheck_expected 'I_AM_ALIVE';       #從RS上收到的http body部分的響應內容,若是未設置,則表示從後端服務器收到200狀態碼便可,這裏咱們不啓用 
   # Optional supervisord module support
   #supervisord none;
   #supervisord_inherit_backend_status;
}

server {
listen 80;

server_name localhost;

location / {
root html;
index index.php index.html index.htm;
proxy_pass http://cluster;

}
location /stat {
healthcheck_status;
}
}

----------------------------------------------------------------------------------------
上面參數解釋:
upstream cluster                                                //定義後方的服務器羣組
Server 192.168.1.104 weight=1                       //指明後方的一臺服務器地址,權重設置爲1;也能夠IP:PORT指定端口實現端口映射
Server 192.168.1.105 weight=1                      //指明後方的另外一臺服務器地址,權重設置爲1

healthcheck_enable                                         //開啓健康探測功能
healthcheck_delay 1000                                  //設置健康檢測的時延;即對同一臺RS兩次檢測之間的時間間隔,單位毫秒,默認爲1000 
healthcheck_timeout 1000                              //設置一次健康檢測的超時時間
healthcheck_failcount 1                             //後方某臺服務器有一次檢測不到即視爲宕掉;即對同一臺RS檢測成功或失敗多少次,才決定其成功或失敗,並實現啓用和禁用此服務
healthcheck_send "GET /.health HTTP/1.0"    //使用GET方法訪問後方服務器站點下的.health來進行探測;即從RS上得到用於檢測健康狀態的文件,默認只支持http 1.0協議 

proxy_pass http://cluster                                  //與upstream cluster相對應,在訪問http://111.112.114.23時將流量轉發到cluster組內機器上

location /stats                                                 //定義一個站點,用來查看後方服務器的健康情況
----------------------------------------------------------------------------------------

最後,重啓nginx
[root@node1 src]# /usr/local/nginx/sbin/nginx -s reload

測試:
假如:
RS1機器上訪問的結果是「welcome to 192.168.1.104」
RS2機器上訪問的結果是「welcome to 192.168.1.105」

訪問http://111.112.114.23,第一次出現的若是是RS1的訪問結果,那麼再刷一下,就會出現RS2的訪問結果,這樣就看出了負載均衡的效果。 

能夠查看後端兩臺Real Server服務器的健康狀態:
訪問http://111.112.114.23/stat便可!

關閉RS1的nginx服務,再次訪問http://111.112.114.23/stat查看後端機器狀態,就會發現RS1的健康狀態已提示Bad,即顯示後端的192.168.1.101的RS1不能正常鏈接。

這樣就實現了負載均衡和健康探測,但依然不能知足高併發量,再次用ab進行測試:

可是,這樣經過nginx代理能夠知足的最大鏈接請求依然沒有直接訪問RS的大!
這個經過下面結果可知:
[root@node1 src]# ab -c 100 -n 10000 http://192.168.1.104/test.jpg

[root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg

繼續作優化!以下:
[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
  keepalive_timeout 65;

proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=24h;

proxy_temp_path /var/www/cache/tmp; 

upstream cluster {
   server 192.168.1.104 weight=1;
 server 192.168.1.105 weight=1;
 healthcheck_enabled;
 healthcheck_delay 1000;
 healthcheck_timeout 1000;
 healthcheck_failcount 3;
   healthcheck_send "GET /.health HTTP/1.0";

}

server {
listen 80;
server_name localhost;

location / {
root html;
index index.php index.html index.htm;
proxy_set_header HOST $host;
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error_timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_pass http://cluster;

}
location /stat {
healthcheck_status;
}
}

--------------------------------------------------------------
參數解釋:
proxy_cache_path     //設置緩存的路徑和其餘參數。緩存數據是保存在文件中的,緩存的鍵和文件名都是在代理URL上執行MD5的結果。 levels參數定義了緩存的層次結構。

proxy_set_header     //容許從新定義或者添加發日後端服務器的請求頭。

proxy_cache             //指定用於頁面緩存的共享內存。

proxy_cache_valid    //爲不一樣的響應狀態碼設置不一樣的緩存時間。

proxy_cache_use_stale    //指定後端服務器出現情況時,nginx可使用的過時緩存
---------------------------------------------------------------

接着重啓nginx服務
[root@node1 src]# /usr/local/nginx/sbin/nginx -s reload

[root@node1 src]# mkdir /var/www/cache            #這個前面作緩存時,已經建立了。

再次進行壓力測試,能夠看到經過nginx代理能夠知足的最大鏈接請求已經達到了5000多,超過了直接訪問RS的最大鏈接請求了!

這樣負載均衡+健康探測+緩存已經完成!

[root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg

接下來一個問題就是在啓用緩存以後的訪問問題,試着從新訪問一下該站點http://111.112.114.23:

即第一次訪問http://111.112.114.23時訪問到了192.168.1.104(即RS1),顯示結果是:「welcome to 192.168.1.104」,前端nginx將本次的訪問結果放入本地緩存,在緩存未失效以前,訪問http://111.112.114.23時其實是nginx的本地緩存提供的訪問結果,依然顯示「welcome to 192.168.1.104」的頁面。
能夠試着多刷新幾回,能夠發現再怎麼刷新頁面內容依然是「welcome to 192.168.1.104」!
這就證實如今訪問到的是nginx緩存在本地的結果!

看看緩存目錄中有沒有內容[root@node1 src]# ll /var/www/cache                   #發現緩存目錄下已經有了緩存結果;能夠將這個緩存結果清除,再次刷次頁面,就會是新頁面了。total 4drwx------ 3 nginx nginx 4096 Sep 18 16:44 e[root@node1 src]#

相關文章
相關標籤/搜索