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
下一篇 2016-11-07

相關推薦

  • 第五周學習總結-rpm&yum

    我們都知道,計算機只能識別二進制程序,而程序員編寫的源代碼都是以純文本形式存在,因此,要想讓計算機識別并運行這些源代碼程序,就必須通過中間的轉換機制讓源代碼變為二進制程序文件,而這種轉換過程就稱為編譯過程。Linux的各發行版本中由于各廠商的編譯過程不盡相同,因此就誕生了各種不同的軟件管理包組件。其中我們最熟知的就要數Redhat系列的rpm包了。 rpm包…

    2018-01-03
  • 編輯器之神VS神之編輯器

      在linux下有兩款非常棒的處理器,它們的功能異常的強大,在普通使用者手中,我們或許僅僅把它們當做文本處理器,但在官方文檔中,它們不僅僅被定義為開發工具。正如在windows下,office在我們手中僅僅是文本,表格,PPT等文件的處理工具,而在大神手中,Excel是可以用來作畫的!PowerPoint 還可以用來播放視頻!  &nb…

    Linux干貨 2017-08-05
  • 馬哥教育網絡班21期-第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1.復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加# [root@junfeng ~]# cp /etc/rc.d/rc.sysinit /tmp [root@junfeng&nbs…

    Linux干貨 2016-08-15
  • Linux前端包管理器—yum

    Yum(Yellow dog Updater, Modified)由Duke University團隊,修改Yellow Dog Linux的Yellow Dog Updater開發而成,是一個基于RPM包管理的字符前端軟件包管理器。能夠從指定的服務器自動下載RPM包并且安裝,可以處理依賴性關系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝。 介…

    Linux干貨 2016-08-29
  •         linux 文件顏色的含義:         藍色代表目錄         綠色代表可執行文件 &nbs…

    Linux干貨 2016-12-05
  • 馬哥教育網絡班21期+第4周課程練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@centos ~]# cp -r /etc/skel /home/tuser1 [root@centos ~]# ls -aldh&…

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