主頁(yè) > 知識(shí)庫(kù) > 淺談Nginx七層反向代理和負(fù)載均衡

淺談Nginx七層反向代理和負(fù)載均衡

熱門標(biāo)簽:電銷機(jī)器人怎么接線路 撫順地圖標(biāo)注 高德地圖標(biāo)注好做嗎 外呼系統(tǒng)坐席費(fèi)計(jì)入會(huì)計(jì)哪個(gè)科目 如何分析地圖標(biāo)注 電銷機(jī)器人價(jià)值 大連400電話如何申請(qǐng) 新余高德地圖標(biāo)注怎么修改 達(dá)亞電銷機(jī)器人官網(wǎng)

1.介紹

1.1 Nginx不僅是一個(gè)出色的web軟件,其七層代理和負(fù)載均衡也是相當(dāng)出色。Nginx做前端代理,當(dāng)用戶請(qǐng)求服務(wù)時(shí),可以根據(jù)url進(jìn)行判斷,然后分配到不同的后臺(tái)webserver上。

1.2 Nginx的負(fù)載均衡實(shí)現(xiàn)原理:首先在http模塊中配置使用upstream模塊定義后臺(tái)的web server的池子,名為proxy-web,在池子中我們可以添加多臺(tái)后臺(tái)webserver,其中狀態(tài)檢查、調(diào)度算法都是在池子中配置;然后在serverr模塊中定義虛擬主機(jī),但是這個(gè)虛擬主機(jī)不指定自己的web目錄站點(diǎn),它將使用location匹配url然后轉(zhuǎn)發(fā)到上面定義好的web池子中,最后根據(jù)調(diào)度策略再轉(zhuǎn)發(fā)到后臺(tái)web server上

2.負(fù)載均衡配置項(xiàng)的介紹

2.1 upstream調(diào)度算法介紹

(1)rr輪詢(默認(rèn))

按照請(qǐng)求順序分配到每個(gè)RS,和lvs中的rr算法一樣,如果RS宕機(jī),會(huì)自動(dòng)剔除,默認(rèn)情況下只檢測(cè)80端口,如果RS報(bào)402、403、503、504錯(cuò)誤,會(huì)直接返回給客戶端。

(2)weight(權(quán)重)

在rr的基礎(chǔ)上再加上權(quán)重(默認(rèn)是rr+weight),權(quán)重輪詢和訪問(wèn)成正比,值越大分配的越多,可以根據(jù)服務(wù)器的配置設(shè)置權(quán)重,可以解決服務(wù)器性能不均進(jìn)行請(qǐng)求分配的問(wèn)題

(3)ip_hash

解決動(dòng)態(tài)網(wǎng)頁(yè)session共享問(wèn)題

每個(gè)訪問(wèn)請(qǐng)求按照IP地址的hash值進(jìn)行分配,ip的hash值只要相同就會(huì)被分配到同一臺(tái)服務(wù)器上(lvs負(fù)載均衡的-p參數(shù),keepalived配置里的persistence_timeout 50),該調(diào)度算法可以解決動(dòng)態(tài)網(wǎng)頁(yè)session共享問(wèn)題,但有時(shí)會(huì)導(dǎo)致請(qǐng)求分配不均,

提示:由于國(guó)內(nèi)用的都是nat模式,所以hash不適合使用

ip_hash不能和其他的算法一塊使用,即不能使weight或backup

(4)fair(第三方)

按照后端服務(wù)器的響應(yīng)時(shí)間來(lái)配置,響應(yīng)時(shí)間短的優(yōu)先分配,比上面的都更智能,此種算法可以按照頁(yè)面大小和加載時(shí)間長(zhǎng)短智能的進(jìn)行負(fù)載均衡,nginx本身不支持fair,需要下載nginx的upstrea_fair模塊

(5)url_hash(第三方)

主要應(yīng)用于緩存服務(wù)器上

按照訪問(wèn)的url來(lái)分配請(qǐng)求,讓相同的url定向到同一個(gè)服務(wù)器,后端服務(wù)器為緩存服務(wù)器的時(shí)候效果更顯著,在upstream中加入hash語(yǔ)句,server語(yǔ)句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法。

缺點(diǎn):如果有一臺(tái)機(jī)器宕機(jī)了,那就苦了,consistent_hash可以解決這個(gè)問(wèn)題

可以提高后端緩存服務(wù)器的效率,nginx本身不支持url_hash的,需要下載hash軟件

(6)least_conn

最少連接數(shù),哪個(gè)連接少就分配到哪臺(tái)設(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 : 后臺(tái)RS,可以是域名或IP,默認(rèn)是80端口,也可加上:80指定

wight = 1 權(quán)重比 默認(rèn)是1

max_fails=2 健康檢查的最大失敗次數(shù),超過(guò)此次數(shù)表示該RS不可用,默認(rèn)是1,0表示禁止失敗嘗試。生產(chǎn)環(huán)境一般設(shè)置2~3次

fail_timeout=10s  失敗的超時(shí)時(shí)間,默認(rèn)是10s

backup  熱備配置,當(dāng)前面的RS全部不可用時(shí)自動(dòng)啟動(dòng)

down  表示該服務(wù)永遠(yuǎn)不可用

注意:max_fails設(shè)置的越低用戶體驗(yàn)越好,但是設(shè)置低了也有個(gè)缺點(diǎn),就是proxy可能會(huì)誤判RS的狀態(tài),而且RS越少誤判的幾率越大,誤判會(huì)對(duì)業(yè)務(wù)產(chǎn)生巨大影響,當(dāng)RS的數(shù)量比較少時(shí)建議將該值設(shè)置的大點(diǎn)。

2.3 location指令的用法介紹

Location主要用來(lái)匹配url,如:http://www.beyond.com/nice,在這里對(duì)于location來(lái)說(shuō)www.beyond.com是域名,/nice才是url。

對(duì)于url的匹配,可以使用字符串或者正則表達(dá)式,但如果是正則表達(dá)式,必須指定前綴,location指令來(lái)匹配不同的url,匹配成功后應(yīng)用不同的配置

語(yǔ)法:location [=|~|~*|^~|@]/url {…..}

[=]精確匹配,如果找到匹配等號(hào)的內(nèi)容,立即停止搜索,并立即處理請(qǐng)求(優(yōu)先級(jí)最高)

[~] 表示匹配正則表達(dá)式,區(qū)分大小寫

[^~]只匹配字符串,不匹配正則表達(dá)式,主要用來(lái)匹配目錄

[~*]表示匹配正則表達(dá)式,不區(qū)分大小寫

[@]指定一個(gè)命名的location,一般只應(yīng)用于內(nèi)部重定向請(qǐng)求,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,但是匹配完之后會(huì)繼續(xù)匹配正則

內(nèi)部匹配規(guī)則為最大匹配前綴,即location /data/123 {} 要比 location /data {} 優(yōu)先,和location的位置順序沒(méi)關(guān)系。匹配完之后會(huì)用最大匹配前綴 繼續(xù)去匹配下面的正則匹配

2)正則匹配,

  正則匹配跟位置順序無(wú)關(guān),但是和邏輯順序有關(guān),會(huì)以最大匹配為準(zhǔn)(越精確越優(yōu)先)

3)location的執(zhí)行邏輯基本上跟順序沒(méi)有關(guān)系;但是針對(duì)正則匹配的方式,匹配上第一個(gè)url,就不在繼續(xù)匹配后面的url;

這種情況,如果匹配上普通localtion,沒(méi)有正則匹配,則使用普通匹配;如果既有普通location的最大前綴匹配,也有正則匹配,則正則匹配覆蓋最大前綴匹配。

4)匹配完“普通 location ”后,有的時(shí)候需要繼續(xù)匹配“正則 location ”,有的時(shí)候則不需要繼續(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池子中。

語(yǔ)法:proxy_pass URL;

注意:使用該指令時(shí)需注意URL中是否包含URI。,如果URL中不包含URI,nginx將不會(huì)改變?cè)刂返膗ri,如果包含uri,將使用新的uri代替原來(lái)的uri。

如:

location /test {
#1 proxy_pass http://1.1.1.1;
#2 proxy_pass http://1.1.1.1/tmp;
}

如果使用1的話,原來(lái)的url將不會(huì)改變,代理后是http://1.1.1.1/test

如果使用2的話,原來(lái)的url將會(huì)變?yōu)閔ttp://1.1.1.1/tmp

所以在配置的時(shí)候需要注意url末尾是否加“/”的問(wèn)題

參數(shù):

proxy_ignore_client_abort  on|off用于設(shè)置客戶端中斷網(wǎng)絡(luò)請(qǐng)求時(shí),nginx是否中斷對(duì)被代理服務(wù)器的請(qǐng)求,默認(rèn)為off,中斷

proxy_headers_hash_max_size  size 設(shè)置http報(bào)文頭的哈希表的大小,默認(rèn)為512

proxy_headers_hash_bucket_size size 設(shè)置申請(qǐng)存放http報(bào)文頭的哈希表容量的單位大小,默認(rèn)為64字符

client_body_buffer_size  客戶端請(qǐng)求緩存大小,可以理解為先保存本地在傳給用戶

proxy_connect_timeout time  與RS鏈接超時(shí)的時(shí)間,默認(rèn)為60s

proxy_send_timeout time  RS回傳數(shù)據(jù)的時(shí)間,必須在這個(gè)時(shí)間段內(nèi)傳完,否則斷開(kāi)連接

proxy_read_timeout time  等待RS響應(yīng)的時(shí)間,標(biāo)明連接已經(jīng)成功,正在排隊(duì)

proxy_buffering on|off 是否開(kāi)啟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)信息會(huì)放置到緩沖區(qū),默認(rèn)為8 4K|8K

proxy_busy_buffers_size  系統(tǒng)很忙時(shí)可以使用的proxy_buffers大小,官方推薦的大小是proxy_buffers的兩倍,默認(rèn)為8K或16K

proxy_temp_path path [level1[level2]] 指定磁盤上的一個(gè)文件路徑,用于臨時(shí)存放代理服務(wù)器的大體積響應(yīng)數(shù)據(jù),如果buffer已經(jīng)裝滿,但是響應(yīng)數(shù)據(jù)仍然沒(méi)有被nginx完全接收,響應(yīng)數(shù)據(jù)就會(huì)被臨時(shí)存放到該文件中

proxy_max_temp_file_size  用于配置所有臨時(shí)文件的總體積大小

proxy_temp_file_write_size  用于配置同時(shí)寫入緩存臨時(shí)文件的數(shù)據(jù)量大小
proxy_set_header host $host 當(dāng)RS有多個(gè)虛擬主機(jī)的時(shí)候需要逐個(gè)指定

proxy_set_header X-Forwarded-For $remote_addr   開(kāi)啟負(fù)載均衡器轉(zhuǎn)發(fā)真實(shí)客戶的IP地址給RS.   

注意:

“proxy_set_header”當(dāng)我們的RS有多個(gè)虛擬主機(jī)(相同的ip,相同的端口)的時(shí)候如www、bbs、blog,代理服務(wù)器怎么知道將請(qǐng)求發(fā)到哪呢,這個(gè)時(shí)候nginx代理就會(huì)查找proxy_set_header參數(shù),將請(qǐng)求發(fā)送到相應(yīng)域名的虛擬主機(jī)上。

3.nginx負(fù)載均衡配置案例

1.有三個(gè)域名:www.beyond.com bbs.beyond.com film.beyond.com,四臺(tái)webserver負(fù)責(zé)提供服務(wù)

2.有一個(gè)mailserver和cloud server在一臺(tái)服務(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

說(shuō)明:web4是負(fù)載均衡器,同時(shí)也負(fù)責(zé)解析www站點(diǎn)。web1、web2、web3負(fù)責(zé)解析bbs和film站點(diǎn)。Mail和cloud在同一臺(tái)設(shè)備上,也是web站點(diǎn)

Nginx的安裝略了,有需要的可以看此教程 https://www.jb51.net/article/128758.htm

現(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;         #每個(gè)虛擬主機(jī)一個(gè)配置文件

    include upstream.conf;            #存放web的后臺(tái)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;

    }

 

  }

注意每個(gè)server是一個(gè).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 ;

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:海東 湖南 遼源 新鄉(xiāng) 黃石 楊凌 衡水 南通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Nginx七層反向代理和負(fù)載均衡》,本文關(guān)鍵詞  淺談,Nginx,七層,反向,代理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Nginx七層反向代理和負(fù)載均衡》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺談Nginx七層反向代理和負(fù)載均衡的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章