nginx(三):反向代理篇

一、nginx反向代理模塊

何爲反向代理?接收客戶端請求,並把請求交給後端服務器處理,後端服務器處理完成後,響應經過反向代理服務器返回給客戶端。反向代理可實現局域網中的服務器可被公網中的客戶端訪問,也可實現多臺服務器間作負載均衡。
模塊:ngx_http_proxy_modulephp

1.1 proxy_pass

做用域Context: location, if in location, limit_excepthtml

syntax:proxy_pass URL;

核心指令,該指令設置被代理服務器地址,URL是主機名稱,IP,IP加端口等形式,而且帶有傳輸協議http://https://
須要注意的時,URL中含有與不含有uri,nginx對其處理方式是不一樣的
配置示例:
狀況一:URL不含uringinx

server {
                    ...
                    server_name www.cutemsyu.com;
                    location /uri/ {
                        proxy_pass http://192.168.100.1:8080;
                    }
                    ...
                }
nginx對於此種狀況的處理方式是,將location中的uri傳遞給後端服務器                
即客戶端訪問http://www.cutemsyu.com/uri --> http://192.168.100.1:8080/uri

狀況二:URL含有uri算法

server {
                    ...
                    server_name www.cutemsyu.com;
                    location /uri/ {
                        proxy_pass http://192.168.100.1:8080/new_uri/;
                    }
                    ...
                }
nginx對於此種狀況的處理方式是,將location中的uri替換成proxy_pass指令中URL含有的uri            
即客戶端訪問http://www.cutemsyu.com/uri --> http://192.168.100.1:8080/new_uri

狀況三:若是location定義的uri使用正則方式,則URL中不可帶uri後端

1.2 proxy_set_header field

做用域Context: http, server, location緩存

syntax:proxy_set_header field value;

設定發日後端服務器的請求報文的請求首部值
使用該指令將客戶端IP傳遞給後端服務器以日誌形式記錄下來,具體作法以下服務器

proxy_set_header X-Real-IP $remote_addr
更改後端服務器日誌記錄客戶端訪問IP字段值爲首部X-Real-IP便可

1.3 超時時長指令

做用域Context: http, server, locationcookie

  1. proxy_connect_timeout time;
    定義與後端服務器創建鏈接的超時時長,默認60s網絡

  2. proxy_read_timeout time;
    與keep_alived相關。定義讀取來自後端服務器響應間隔的超時時長,不是讀取一次完整的響應的時長,若是在這段時間內沒有任何傳輸動做則斷開鏈接,默認60s負載均衡

  3. proxy_send_timeout time;
    與keep_alived相關。定義向後端服務器發送請求的間隔超時時長,不是發送一次完整請求的時長,若是在這段時間內沒有任何傳輸動做則斷開鏈接,默認60s

1.4 proxy_ignore_client_abort

做用域Context: http, server, location

syntax:proxy_ignore_client_abort on | off;

定義nginx與後端服務器的鏈接是否中斷,若是客戶端不等待響應結果中斷鏈接。
該指令默認值是off,若是客戶端中斷了鏈接,nginx與後端鏈接隨之中斷,nginx記錄5XX的錯誤,通常此種錯誤很難排查,當值設定爲on時,nginx不會提早中斷與後端服務器鏈接,返回的狀態碼正常記錄200等等,nginx日誌也不出現怪異的5XX錯誤。

二、nginx服務器組的配置

模塊ngx_http_upstream_module
該模塊定義能夠被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 等指令引用的一組服務器。
nginx做爲反向代理服務器常常要配置一組服務器,以實現負載均衡。當定義好一組服務器時,默認調度算法爲輪詢算法,nginx將接收到的請求輪詢發送給各個後端服務器處理,也能夠根據服務器性能增長權重,或使用其餘調度算法。

2.1 upstream配置塊

首先在http配置塊中建立新的配置上下文upstream並命名:

http{
    ...
    upstream group_name {
        ...
        ...
    }
    ...
}

接下來介紹upstream中可用的指令

2.2 server指令

syntax:server address [parameters...];

server指令爲核心指令,定義組成員
address可用表示形式:

  • IP[: PORT]

  • HOSTNAME [ : PORT]

  • unix: /PATH/TO/SOME_SOCK_FILE

parameters可用以下:

  • weight=number
    定義一個server的權重,默認爲1。權重高的server優先處理請求,並分配更多的請求,即帶權重的輪詢調度。

  • max_fails=number
    定義一個server在一段時間內最大的請求失敗的次數,超過此值,標記該server爲無效中止提供服務

  • fail_timeout=time
    有兩層含義:1.此超時時長即爲在max_fails提到的一段時間。2.一旦某server標記爲無效後,在這段時間內再也不檢測。默認值爲10s

  • backup
    標記server爲備用服務器,只有當其餘服務器不可用時才啓用該服務器

  • down
    標記server爲無效。通常在升級服務時使用,採用灰度模型將服務器逐個從線上脫離。

2.3 幾個調度算法

除了默認的輪詢調度算法,還能夠採用如下算法,使用方法很簡單——直接添加在upstream中。

  1. least_conn
    定義一組服務器的調度算法爲最少鏈接數調度。根據server已創建的活動鏈接的數量來分配請求,擁有最少鏈接的server優先分配。此算法權重有效

  2. ip_hash
    源地址hash調度算法,來自同一IP的請求老是分配到同一server上。該算法可在較粗的粒度上實現會話粘性,實現會話保持功能,但通常不採用。

  3. hash key [ consistent ];
    基於指定的key的hash表來實現對請求的調度,將同一類請求發往同一server上,key能夠爲文本,變量或是兩者組合。

可選consistent參數,指一致性hash算法,啓用此參數可避免一組服務器增減可用server時致使hash對應表發生巨大變更,減小影響範圍。
示例:

hash $request_uri consistent; #hash請求uri來調度請求,並選擇一致性hash算法

2.4 服務器組保持空閒鏈接數

syntax:keepalive connections;

該指令設定每一個worker進程爲一個服務器組保持的空閒鏈接數量上限。connections爲設定的數量,該數量不宜過大,防止新網絡鏈接的創建
該指令使用仍是有些麻煩的,參考官網例子以下

#http類型服務器組啓用時,添加版本1.1,清空Connection首部值
upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

#FastCGI服務器組時,需設定fastcgi_keep_conn爲on
upstream fastcgi_backend {
    server 127.0.0.1:9000;

    keepalive 8;
}

server {
    ...

    location /fastcgi/ {
        fastcgi_pass fastcgi_backend;
        fastcgi_keep_conn on;
        ...
    }
}

三、nginx代理緩衝

proxy buffer啓用以後,nginx會以異步形式將後端服務器返回的數據傳遞給客戶端。
nginx首先儘可能接收來自後端服務器的一次響應數據,保存到緩衝區中,若是接收數據超出緩衝區大小,則保存到本地定義的臨時文件中。當一次數據接收完或者緩衝區已裝滿數據則向客戶端發送數據。每一個buffer裝滿數據以後向客戶端發送數據直到發送完成,buffer處於busy狀態,期間對它進行任何其餘操做都會失敗。
如下指令做用域Context: http, server, location

3.1 proxy_buffering

syntax: proxy_buffering on | off;

代理緩衝控制指令,默認開啓

3.2 proxy_buffers

syntax: proxy_buffers number size;

該指令配置用於一個與後端服務器鏈接上的buffer數量,每一個buffer大小。一般size爲內存分頁大小。接受一次後端服務器數據緩衝總大小爲 number*size

3.3 proxy_busy_buffers_size

syntax: proxy_busy_buffers_size size;

該指令設置同時處於busy狀態的buffer總大小。默認爲proxy_buffers 中定義的size的兩倍。

3.4 proxy_temp_path

syntax: proxy_temp_path path [level1 [level2 [level3]]];

該指令配置用於接收後端服務器響應大致積數據的臨時文件的存儲路徑
Example:

proxy_temp_path /spool/nginx/proxy_temp 1 2;

3.5 proxy_max_temp_file_size

syntax: proxy_max_temp_file_size size;

該指令設置臨時文件佔用空間的總大小

四、 nginx代理緩存

nginx不是專業的緩存服務器,varnish等服務更加高效,但nginx的緩存功能在某些場景也可發揮不錯的效果。
在上一小節中咱們講到了nginx緩衝,緩衝是爲了協調不一樣傳輸效率的設備之間的傳輸,下降效率高的一方的等待時間。而本節將的緩存則是爲了提升響應客戶端速度,將常常訪問的數據緩存到本地,當客戶端訪問同一資源時直接將本地存儲的內容響應給客戶端,減小對後端服務器的壓力提升響應速度。
同時nginx的緩衝功能依賴nginx緩衝

4.1 proxy_cache

syntax: proxy_cache zone|off;

該指令配置一塊公用的緩存區域名稱或者關閉緩存功能。緩存區域存放緩存的索引數據。

4.2 proxy_cache_key

syntax: proxy_cache_key string;

定義用於創建索引的「鍵」
默認值爲proxy_cache_key $scheme$proxy_host$request_uri;

4.3 proxy_cache_path

特別指出該指令做用域Context: http

syntax:proxy_cache_path path [levels=levels]  keys_zone=name:size;

該指令定義緩存數據的存儲路徑及緩存索引的有關內容。指令比較複雜上面的用法是縮減版,保留須要配置的參數,其餘保持默認值便可。
參數含義:

  • path 定義存儲根路徑

  • levels=levels 定義在相對與path路徑下的第幾級hash路徑下緩存數據

  • keys_zone=name:size 定義緩存索引存放的區域和使用大小

4.4 proxy_cache_min_uses

syntax: proxy_cache_min_uses number;

該指令定義一個資源最少被訪問多少次將其緩存,默認值爲1

4.5 proxy_cache_use_stale

syntax:proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

該指令定義若是nginx訪問後端服務器過程當中出現沒法訪問,或者是訪問錯誤等狀況時,容許哪些狀態下nginx使用緩存數據來響應這次客戶端請求。雖然緩存的數據有可能已通過期,可是對於網站可用性來說意義重大。默認值爲off。

4.6 proxy_cache_valid

syntax:proxy_cache_valid [code...] time;

該指令針對不一樣http響應狀態來設置緩存時長

4.7 proxy_no_cache

syntax:proxy_no_cache sting;

該指令定義哪些狀況下不緩存響應數據。在string中定義的值能夠是多個,當它們中的值有一個爲非空或非0,此時不緩存數據。string值一般爲http協議中的緩存控制類首部

4.8 一個配置樣例

http {
    ...
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=ncache:256m ;
    ...
}

location / {
    ...
    proxy_cache ncache;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    proxy_no_cache $cookie_nocache;
    ...
}

五、nginx 的fastcgi模塊

nginx能夠反向代理fastcgi協議的請求,本節經過一個例子講解具體使用

location ~* .php$ { #首先是匹配php動態請求

fastcgi_pass   127.0.0.1:9000;   #設置後端服務器地址
                fastcgi_index  index.php;          #設置默認引導頁面
                fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;   #傳遞php資源路徑給fastcgi服務器
                include        fastcgi_params; #使用nginx默認已配置好的其餘參數
            }

六、結束語

到此爲止nginx三篇文章結束,歡迎你們收藏關注。

相關文章
相關標籤/搜索