nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
?
在日常運維工作中,運維人員會時常使用到nginx的反向代理,負載均衡以及緩存等功能來優化web服務性能。
廢話不多說,下面對測試環境下的nginx反向代理+緩存開啟+url重寫+負載均衡(帶健康探測)搭建過程做一記錄:
一、后端的Real Server的準備
兩臺RS服務器(192.168.1.104/192.168.1.105)要事先配置好nginx。
并且nginx訪問均是用ip訪問即可,方便實驗效果!
二、nginx代理服務器192.168.1.103(假設外網ip是111.112.114.23)的配置
1.nginx反向代理和緩存
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
1)首先添加用戶nginx,實現以之運行nginx服務進程:
[root@node1 ~]# groupadd -r nginx
[root@node1 ~]# useradd -r -g nginx -s /bin/false -M nginx ? ? ? ? ? ? ? ? ?#-M參數表示創建用戶時不創建用戶家目錄
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_temp
[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_temp
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 指定)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | 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 4
drwx------ 3 nginx nginx 4096 Sep 18 16:44 e
[root@node1 src]#
轉載于:https://www.cnblogs.com/applelife/p/10511109.html
總結
以上是生活随笔為你收集整理的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 装修仿720VR全景平台网站源码
- 下一篇: html中的空格