nginx反向代理負載均衡集群配置詳解

反向代理負載均衡集群配置詳解

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時站在服務器角度來看,代理服務器對外就表現為一個反向代理服務器。

對反向代理服務器的攻擊并不會使得后端內網Web服務器上網頁信息遭到破壞,增強了Web服務器的安全性。

ngx _ http _ proxy _ module模塊:http/https協議反向代理

1、proxy_pass URL; :定義反向代理到的路徑

適用范圍:location, if in location, limit_except上下文中;URL為完整的路徑
注意:
    匹配location后傳遞給后端請求路徑情況解析( REMOTE-IP:后端主機IP地址):
    1) proxy_pass后面的路徑不帶uri時,其會將location的uri傳遞給后端主機;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy  http://REMOTE-IP[:port];
            }
            ...
        }

    此時傳遞給后端的請求路徑為:http://REMOTE-IP/uri/,直接補充在REMOTE-IP之后;
        http://HOSTNAME/uri --> http://REMOTE-IP/uri

    2)proxy_pass后面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy http://REMOTE-IP/new_uri/;
            }
            ...
        }

    此時客戶端請求被location的/uri/匹配到,跳轉到后端請求路徑將由/new uri/替換/uri/;
        http://HOSTNAME/uri/ --> http://REMOTE-IP/new_uri/

    3)如果location定義其uri時使用了正則表達式的模式,則proxy_pass之后必須不能使用uri;
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /uri/ {
                proxy http://REMOTE-IP;
            }
            ...
        }

    此時客戶端請求時傳遞的uri將直接附加代理到的服務的之后;
        http://HOSTNAME/uri/ --> http://host/REMOTE-IP/

2、proxysetheader field value;用于proxy server向后端服務主機發請求報文時,將某請求首部重新賦值,或在原有值后面添加一個新的值; 也可以添加自定義首部;用于http, server, location配置段中

示例:
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    原有請求報文中如果存在X-Forwared-For首部,則將remote_addr以逗號分隔補原有值后,否則則直接添加此首部;

3、緩存相關的選項(緩存需要要先定義,再調用)

1)proxy_cache_path
    path [levels=levels]  [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
    定義緩存,可用上下文為http; (與fastcgi的緩存定義相似)

2)proxy_cache zone | off;
    指明要調用的緩存,或關閉緩存機制;用于http, server, location 上下文

3)proxy_cache_key string;
    緩存中用于“鍵”的內容;默認值為:proxy_cache_key $scheme$proxy_host$request_uri;

4)proxy_cache_valid [code ...] time;
    定義對特定響應碼的響應內容的緩存時長;

    緩存定義示例:
        (定義在http上下文)
        proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
    調用緩存定義示例:
        定義在需要調用緩存功能的配置段,例如server{...};
        proxy_cache pxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;

5)proxy_cache_use_stale
    定義當代理服務器與后端主機通信出現故障時在哪種情況下,可以向客戶端直接用緩存中緩存項響應給客戶端;如下;
    proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

6)proxy_cache_methods GET | HEAD | POST ...;
    定義為哪種請求方法使用緩存;默認GET|HEAD 其他的不建議使用

7)proxy_buffering on | off;
    是否啟用代理服務器對后端服務器的發送緩沖和接收緩沖
    默認proxy_buffering on;

8)proxy_buffers number size;
    定義啟用代理服務器對后端服務器的發送緩沖和接收緩沖的buffer的數量和每個buffer的類型
    默認proxy_buffers 8 4k|8k;
    用于http,server,locaton上下文

9)proxy_buffer_size size;
    定義代理服務器對后端服務器的發送緩沖和接收緩沖的每個buffer的大小
    默認proxy_buffer_size 4k|8k;

4、proxy _ hide _ header field;

指明要隱藏響應給客戶端header,默認情況下nginx是不傳遞header的

5、proxy _ connect _ timeout time;

定義代理服務器與后方服務器建立連接時的超時時長;默認是60s,最大不能超過75s

6、 連接相關的選項

當客戶端請求,而后端服務器過于繁忙會返回給客戶端502(BadGateway)服務器端錯誤,在例如此類情況下,肯能需要調整服務器端關于連接時長相關的選項

1)proxy_connect_timeout time;
    定義與后端服務器建立連接的超時時長;默認為60s,不建議超出75s;

2)proxy_send_timeout time;
    把請求發送給后端服務器的超時時長(定義兩次請求報文之間時間間隔);默認為60s;

3)proxy_read_timeout time;
    等待后端服務器發送響應報文的超時時長;默認為60s;可以稍微長點.

ngx _ http _ headers _ module模塊:管理header功能的模塊

向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值;
用于http,server,location,if in location上下文

1、add_header name value [always];

添加自定義首部;
示例:
    add_header X-Via  $server_addr;
    add_header X-Accel $server_name;

2、expires [modified] time;用于定義Expire或Cache-Control首部的值;

expires epoch | max | off;允許或禁止向響應報文的Cache-Control或Expires首部添加新值或修改其值;
注釋:
    Cache-Control:緩存控制機制
    Expires:用于改變原始服務器定義的響應報文的緩存時長

ngx _ http _ upstream _ module模塊;用于把后端服務器定義成服務器組,實現負載均衡功能

1、upstream NAME { … }NAME為組名稱

定義后端服務器組,會引入一個新的上下文;用于http上下文
    upstream httpdsrvs {
        server ...
        server...
        ...
    }

2、server address [parameters];在upstream中定義一個服務器及其相關參數;僅能用于upstream上下文;

address的表示格式:

unix:/PATH/TO/SOME_SOCK_FILE:只限用于本地通信
IP[:PORT]
HOSTNAME[:PORT]

常用參數(PARAMETERS):

weight=number:定義服務器權重,默認為1
max_fails=number:失敗嘗試最大次數;超出此處指定的次數時,server將被標記為不可用;
fail_timeout=time:設置將服務器標記為不可用狀態的超時時長;默認為10s,這是一個累計時長,而不是單次時長。
max_conns:當前的服務器的最大并發連接數;
backup:將服務器標記為“備用”,即所有服務器均不可用時此服務器才啟用;
down:標記為“不可用”;不再處理任何用戶請求
示例:
    第一步:在http上下文中定義upstream服務器組
        upstream websrvs {
            server 192.168.25.129 weight=2 max_fails=2 fail_timeout=6s;
            server 192.168.25.130 weight=1 max_fails=2 down;
            server 192.168.25.130:8080 backup
        }                                
    第二步:在反向代理http段中(proxy_pass,fastcgi_pass, ...)進行調用;
        server {
            listen 80;
            server_name  www.ali.com;
            root /data/www;
            location  / {
                proxy_pass http://websrvs/;
            }
        }

3、least _ conn;

最少連接調度算法,當server擁有不同的權重時其為wlc;(當各server權重不同時,即為加權最少連接);最少連接算法通常只適用與那些長連接的協議。

4、ip _ hash;

源地址hash調度方法;把來自同一個ip地址的請求始終發往同一個backendserver,除非此backend server不可用;

5、hash key [consistent];基于指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者的組合;

作用:將請求分類,同一類請求將發往同一個upstream server;
示例:
    hash $request_uri consistent;
    hash $remote_addr;
    hash  $remote_addr相當于ip_hash;

常用的hash key:
     1) $cookie_name:
        將一個用戶的請求始終發往同一個backendserver,能實現會話綁定的功能;此處的name為cookie某些參數的名稱,此處常用的有cookie_username;
     2) $request_uri:
        將對同一個uri的請求始終發往同一個backend server,后端為cache server時特別有用;

6、match NAME { … };此項配置只適用于nginxplus

對backendserver做健康狀態檢測時,定義其結果判斷機制;只能用于http上下文;
常用的參數:
    status code[code ...]:期望的響應狀態碼;
    header HEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基于比較操作符和值進行比較;
    body:期望響應報文的主體部分應該有的內容;

7、health _ check [PARAMETERS];此項配置只適用于nginxplus

健康狀態檢測機制;只能用于location上下文;
常用參數:
    interval=#:檢測的頻率,默認為5秒;
    fails=#:判定服務器不可用的失敗檢測次數;默認為1次;
    passes=#:判定服務器可用的失敗檢測次數;默認為1次;
    uri=uri:做健康狀態檢測測試的目標uri;默認為/;
    match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊;

8、keepalive connections;

為每個worker進程保留的空閑的長連接數量;

ngx _ stream _ core _ module模塊;用于非http協議請求的分發功能。此功能在1.9以后的版本中才有

模擬反代基于tcp或udp的服務連接,即工作于傳輸層的反代或調度器;

1、stream { … }

定義stream相關的服務;Context:main
stream {
    upstream sshsrvs {
        server 192.168.22.2:22; 
        server 192.168.22.3:22; 
        least_conn;
    }

        server {
            listen 10.1.0.6:22022;
            proxy_pass sshsrvs;
        }
}

2、listen:結合與stream配置段中的監聽地址

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/58145

(0)
M20-1馬星M20-1馬星
上一篇 2016-11-07 10:20
下一篇 2016-11-07 10:25

相關推薦

  • 文件壓縮,解壓縮及歸檔

        在Linux的環境中,壓縮文件的擴展名大多是:“*.tar, *.tar.gz, *.gz, *.Z, *.bz2, *.xz”,因為 Linux 支持的壓縮指令非常多,且不同的指令所用的壓縮技術并不相同,當然彼此之間可能就無法互通壓縮/解壓縮文件,當你下載到某個壓縮文件時,自然就需要知道該文件是由哪種壓縮指令…

    Linux干貨 2016-08-18
  • pxe自動安裝linux

    配置自動安裝操作系統 1.網卡應支持pxe技術,由網卡作為dhcp的客戶端向dhcp服務器請求一個IP地址,dhcp會將ip,網關等信息和的tftp服務器的地址應加載的文件名提供給客戶端 2.根據dhcp服務器提供的信息網卡上內置的tftp客戶端向tftp服務器發出請求,將文件下載至內存,包括bootloader(可能有選單),initrd,內核等(內核和i…

    Linux干貨 2016-11-11
  • bash功能特性四 文件名通配符

    文件名通配(globbing)     通配符在bash中是一個非常有用的功能,它可以使我們更加方便的查找符合特定條件的文件。     文件通配符的包括以下幾種:          *:任意長度的任意…

    Linux干貨 2015-04-21
  • ~~ 1;列出當前系統上所有已經登錄的用戶的用戶名,注意:同一用戶登錄多次,則只顯示 一次即可。 # who | cut -d" " -f 1 | sort -u 2;取出最后登錄到當前系統的用戶的相關信息 # id $(who | tail -1 |cut -d" " -f 1) # last | head -1 3…

    Linux干貨 2017-01-03
  • 馬哥教育網絡班22期+第八周課程練習

    1. 請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 網橋:工作在OSI模型的數據鏈路層,將兩個局域網連起來,根據MAC地址來轉發幀。它可以有效地連接兩個LAN,使本地通信限制在本網段內,并轉發相應的信號至另一網段,網橋通常用于連接數量不多的、同一類型的網段,它可以擴展網絡的距離或范圍,而且可提高網絡的性能、可靠性和安全…

    Linux干貨 2016-12-19
  • 02day-Linux基礎入門及簡單的命令了解

    Linux哲學思想: 1、一切皆文件;          把幾乎所有資源,包括硬件設備都組織為文件格式; 2、由眾多單一目的小程序組成;一個程序只實現一個功能,而且要做好;          組合小程…

    Linux干貨 2016-06-29
欧美性久久久久