1.介紹
1.1 Nginx不僅是一個出色的web軟件,其七層代理和負(fù)載均衡也是相當(dāng)出色。Nginx做前端代理,當(dāng)用戶請求服務(wù)時,可以根據(jù)url進(jìn)行判斷,然后分配到不同的后臺webserver上。
1.2 Nginx的負(fù)載均衡實(shí)現(xiàn)原理:首先在http模塊中配置使用upstream模塊定義后臺的web server的池子,名為proxy-web,在池子中我們可以添加多臺后臺webserver,其中狀態(tài)檢查、調(diào)度算法都是在池子中配置;然后在serverr模塊中定義虛擬主機(jī),但是這個虛擬主機(jī)不指定自己的web目錄站點(diǎn),它將使用location匹配url然后轉(zhuǎn)發(fā)到上面定義好的web池子中,最后根據(jù)調(diào)度策略再轉(zhuǎn)發(fā)到后臺web server上
2.負(fù)載均衡配置項(xiàng)的介紹
2.1 upstream調(diào)度算法介紹
(1)rr輪詢(默認(rèn))
按照請求順序分配到每個RS,和lvs中的rr算法一樣,如果RS宕機(jī),會自動剔除,默認(rèn)情況下只檢測80端口,如果RS報402、403、503、504錯誤,會直接返回給客戶端。
(2)weight(權(quán)重)
在rr的基礎(chǔ)上再加上權(quán)重(默認(rèn)是rr+weight),權(quán)重輪詢和訪問成正比,值越大分配的越多,可以根據(jù)服務(wù)器的配置設(shè)置權(quán)重,可以解決服務(wù)器性能不均進(jìn)行請求分配的問題
(3)ip_hash
解決動態(tài)網(wǎng)頁session共享問題
每個訪問請求按照IP地址的hash值進(jìn)行分配,ip的hash值只要相同就會被分配到同一臺服務(wù)器上(lvs負(fù)載均衡的-p參數(shù),keepalived配置里的persistence_timeout 50),該調(diào)度算法可以解決動態(tài)網(wǎng)頁session共享問題,但有時會導(dǎo)致請求分配不均,
提示:由于國內(nèi)用的都是nat模式,所以hash不適合使用
ip_hash不能和其他的算法一塊使用,即不能使weight或backup
(4)fair(第三方)
按照后端服務(wù)器的響應(yīng)時間來配置,響應(yīng)時間短的優(yōu)先分配,比上面的都更智能,此種算法可以按照頁面大小和加載時間長短智能的進(jìn)行負(fù)載均衡,nginx本身不支持fair,需要下載nginx的upstrea_fair模塊
(5)url_hash(第三方)
主要應(yīng)用于緩存服務(wù)器上
按照訪問的url來分配請求,讓相同的url定向到同一個服務(wù)器,后端服務(wù)器為緩存服務(wù)器的時候效果更顯著,在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法。
缺點(diǎn):如果有一臺機(jī)器宕機(jī)了,那就苦了,consistent_hash可以解決這個問題
可以提高后端緩存服務(wù)器的效率,nginx本身不支持url_hash的,需要下載hash軟件
(6)least_conn
最少連接數(shù),哪個連接少就分配到哪臺設(shè)備
(7)consistent_hash
一致性算法
2.2 upstream健康檢查配置介紹
upstream proxy_nginx { server 192.168.0.254 weight=1 max_fails=2 fail_timeout=10s ; server 192.168.0.253 weight=2 max_fails=2 fail_timeout=10s; server 192.168.0.252 backup; server 192.168.0.251 down; }
server 192.168.0.254 : 后臺RS,可以是域名或IP,默認(rèn)是80端口,也可加上:80指定
wight = 1 權(quán)重比 默認(rèn)是1
max_fails=2 健康檢查的最大失敗次數(shù),超過此次數(shù)表示該RS不可用,默認(rèn)是1,0表示禁止失敗嘗試。生產(chǎn)環(huán)境一般設(shè)置2~3次
fail_timeout=10s 失敗的超時時間,默認(rèn)是10s
backup 熱備配置,當(dāng)前面的RS全部不可用時自動啟動
down 表示該服務(wù)永遠(yuǎn)不可用
注意:max_fails設(shè)置的越低用戶體驗(yàn)越好,但是設(shè)置低了也有個缺點(diǎn),就是proxy可能會誤判RS的狀態(tài),而且RS越少誤判的幾率越大,誤判會對業(yè)務(wù)產(chǎn)生巨大影響,當(dāng)RS的數(shù)量比較少時建議將該值設(shè)置的大點(diǎn)。
2.3 location指令的用法介紹
Location主要用來匹配url,如:http://www.beyond.com/nice,在這里對于location來說www.beyond.com是域名,/nice才是url。
對于url的匹配,可以使用字符串或者正則表達(dá)式,但如果是正則表達(dá)式,必須指定前綴,location指令來匹配不同的url,匹配成功后應(yīng)用不同的配置
語法:location [=|~|~*|^~|@]/url {…..}
[=]精確匹配,如果找到匹配等號的內(nèi)容,立即停止搜索,并立即處理請求(優(yōu)先級最高)
[~] 表示匹配正則表達(dá)式,區(qū)分大小寫
[^~]只匹配字符串,不匹配正則表達(dá)式,主要用來匹配目錄
[~*]表示匹配正則表達(dá)式,不區(qū)分大小寫
[@]指定一個命名的location,一般只應(yīng)用于內(nèi)部重定向請求,location @name {···}
示例:
worker_processes 1;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.beyond.com;#No.1 location / { return 502; }#No.3 location ~* /.jpg$ { return 403; }#No.4 location ^~ /a/ { return 402; }#No.5 location /a/1.jpg { return 401; }#No.6 location = /a/.jpg { return 400; }}}
小結(jié):
匹配順序:
1)優(yōu)先先匹配普通url,但是匹配完之后會繼續(xù)匹配正則
內(nèi)部匹配規(guī)則為最大匹配前綴,即location /data/123 {} 要比 location /data {} 優(yōu)先,和location的位置順序沒關(guān)系。匹配完之后會用最大匹配前綴 繼續(xù)去匹配下面的正則匹配
2)正則匹配,
正則匹配跟位置順序無關(guān),但是和邏輯順序有關(guān),會以最大匹配為準(zhǔn)(越精確越優(yōu)先)
3)location的執(zhí)行邏輯基本上跟順序沒有關(guān)系;但是針對正則匹配的方式,匹配上第一個url,就不在繼續(xù)匹配后面的url;
這種情況,如果匹配上普通localtion,沒有正則匹配,則使用普通匹配;如果既有普通location的最大前綴匹配,也有正則匹配,則正則匹配覆蓋最大前綴匹配。
4)匹配完“普通 location ”后,有的時候需要繼續(xù)匹配“正則 location ”,有的時候則不需要繼續(xù)匹配“正則 location ”。
兩種情況下,不需要繼續(xù)匹配正則 location :(1) 當(dāng)普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續(xù)正則匹配;(2) 當(dāng)普通location 恰好嚴(yán)格匹配上,不是最大前綴匹配,則不再繼續(xù)匹配正則。
2.4 proxy模塊的介紹
Nginx轉(zhuǎn)發(fā)模塊是ngx_http_proxy_module,默認(rèn)安裝,可以直接使用
Proxy_pass此指令用于轉(zhuǎn)發(fā)location匹配到的url到serve池子中。
語法:proxy_pass URL;
注意:使用該指令時需注意URL中是否包含URI。,如果URL中不包含URI,nginx將不會改變原地址的uri,如果包含uri,將使用新的uri代替原來的uri。
如:
location /test {#1 proxy_pass http://1.1.1.1;#2 proxy_pass http://1.1.1.1/tmp;}
如果使用1的話,原來的url將不會改變,代理后是http://1.1.1.1/test
如果使用2的話,原來的url將會變?yōu)閔ttp://1.1.1.1/tmp
所以在配置的時候需要注意url末尾是否加“/”的問題
參數(shù):
proxy_ignore_client_abort on|off用于設(shè)置客戶端中斷網(wǎng)絡(luò)請求時,nginx是否中斷對被代理服務(wù)器的請求,默認(rèn)為off,中斷
proxy_headers_hash_max_size size 設(shè)置http報文頭的哈希表的大小,默認(rèn)為512
proxy_headers_hash_bucket_size size 設(shè)置申請存放http報文頭的哈希表容量的單位大小,默認(rèn)為64字符
client_body_buffer_size 客戶端請求緩存大小,可以理解為先保存本地在傳給用戶
proxy_connect_timeout time 與RS鏈接超時的時間,默認(rèn)為60s
proxy_send_timeout time RS回傳數(shù)據(jù)的時間,必須在這個時間段內(nèi)傳完,否則斷開連接
proxy_read_timeout time 等待RS響應(yīng)的時間,標(biāo)明連接已經(jīng)成功,正在排隊(duì)
proxy_buffering on|off 是否開啟proxy buffer 默認(rèn)為on
proxy_buffer_size 緩存區(qū)大小,默認(rèn)等于指令proxy_buffers設(shè)置的大小 默認(rèn)為4K或8K
proxy_buffers number size 緩沖區(qū)的數(shù)量和大小,從RS獲取的響應(yīng)信息會放置到緩沖區(qū),默認(rèn)為8 4K|8K
proxy_busy_buffers_size 系統(tǒng)很忙時可以使用的proxy_buffers大小,官方推薦的大小是proxy_buffers的兩倍,默認(rèn)為8K或16K
proxy_temp_path path [level1[level2]] 指定磁盤上的一個文件路徑,用于臨時存放代理服務(wù)器的大體積響應(yīng)數(shù)據(jù),如果buffer已經(jīng)裝滿,但是響應(yīng)數(shù)據(jù)仍然沒有被nginx完全接收,響應(yīng)數(shù)據(jù)就會被臨時存放到該文件中
proxy_max_temp_file_size 用于配置所有臨時文件的總體積大小
proxy_temp_file_write_size 用于配置同時寫入緩存臨時文件的數(shù)據(jù)量大小
proxy_set_header host $host 當(dāng)RS有多個虛擬主機(jī)的時候需要逐個指定
proxy_set_header X-Forwarded-For $remote_addr 開啟負(fù)載均衡器轉(zhuǎn)發(fā)真實(shí)客戶的IP地址給RS.
注意:
“proxy_set_header”當(dāng)我們的RS有多個虛擬主機(jī)(相同的ip,相同的端口)的時候如www、bbs、blog,代理服務(wù)器怎么知道將請求發(fā)到哪呢,這個時候nginx代理就會查找proxy_set_header參數(shù),將請求發(fā)送到相應(yīng)域名的虛擬主機(jī)上。
3.nginx負(fù)載均衡配置案例
1.有三個域名:www.beyond.com bbs.beyond.com film.beyond.com,四臺webserver負(fù)責(zé)提供服務(wù)
2.有一個mailserver和cloud server在一臺服務(wù)器上
規(guī)劃:
web1 192.168.254.251 BBS、film
web2 192.168.254.252 BBS、film
web3 192.168.254.253 BBS、film
web4 192.168.254.254 www,負(fù)載均衡器
web5 192.168.254.250 mail cloud
說明:web4是負(fù)載均衡器,同時也負(fù)責(zé)解析www站點(diǎn)。web1、web2、web3負(fù)責(zé)解析bbs和film站點(diǎn)。Mail和cloud在同一臺設(shè)備上,也是web站點(diǎn)
Nginx的安裝略了
現(xiàn)在列出web4的nginx的配置文件供參考
nginx.conf:user nginx;worker_processes 4;error_log logs/error.log;pid logs/nginx.pid;events { use epoll ; worker_connections 1024;http { include mime.types; default_type application/octet-stream; server_tokens off; sendfile on; tcp_nopush on; keepalive_timeout 65; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; client_header_buffer_size 32k; large_client_header_buffers 4 128k; client_max_body_size 10m; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_http_version 1.1; gzip_comp_level 6; gzip_vary on; gzip_types text/javascript text/plain application/x-javascript text/css application/xml; log_format main ' $http_host $http_x_forwarded_for ${request_time}s [$time_local] "$request" $status $body_bytes_sent $http_referer $http_user_agent $remote_addr'; include vhosts/*.conf; #每個虛擬主機(jī)一個配置文件 include upstream.conf; #存放web的后臺server fastcgi_intercept_errors on;}
Vhosts/{bbs,film,www,cloud,mail}.conf: server { listen 80; server_name bbs.beyond.com; index index.php; location / { proxy_pass http://web; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 4K; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4K; proxy_buffers 4 32K; proxy_busy_buffers_size 64K; proxy_temp_file_write_size 64K;} }
server { listen 80; server_name cloud.beyond.com; index index.php; location / { proxy_pass http://192.168.254.250:8000; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 4K; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4K; proxy_buffers 4 32K; proxy_busy_buffers_size 64K; proxy_temp_file_write_size 64K;} }
server { listen 80; server_name film.beyond.com; index index.php; location / { proxy_pass http://web; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 4K; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4K; proxy_buffers 4 32K; proxy_busy_buffers_size 64K; proxy_temp_file_write_size 64K;} }
server { listen 80; server_name mail.beyond.com; index index.php; location / { proxy_pass http://192.168.254.250:80; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 4K; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4K; proxy_buffers 4 32K; proxy_busy_buffers_size 64K; proxy_temp_file_write_size 64K;} }
server { listen 80; server_name monitor.beyond.com; index index.php; location / { proxy_pass http://192.168.254.220; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; client_body_buffer_size 4K; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4K; proxy_buffers 4 32K; proxy_busy_buffers_size 64K; proxy_temp_file_write_size 64K; } }
server { listen 80; server_name www.beyond.com; root /usr/local/nginx/html/www; index index.html; access_log logs/current/www.beyond.com-access.log main; error_log logs/current/www.beyond.com-error.log; error_page 500 501 502 503 504 /error/5-error.html; error_page 400 403 404 405 408 410 411 412 413 414 415 /error/4-error.html; location ~ .*/.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~.*/.(js|css|javascript|fluash)$ { expires 24h; } location /error { root /usr/local/nginx/logs/error; } }
注意每個server是一個.conf的文件
upstream.conf文件:
upstream web {server 192.168.254.253 weight=1 max_fails=2 fail_timeout=10s ;server 192.168.254.252 weight=1 max_fails=2 fail_timeout=10s ;server 192.168.254.251 weight=1 max_fails=2 fail_timeout=10s ;}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選