成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nginx(三):反向代理篇

cloud / 2208人閱讀

摘要:反向代理模塊何為反向代理接收客戶端請求,并把請求交給后端服務(wù)器處理,后端服務(wù)器處理完成后,響應(yīng)通過反向代理服務(wù)器返回給客戶端。作為反向代理服務(wù)器經(jīng)常要配置一組服務(wù)器,以實現(xiàn)負(fù)載均衡。

1、nginx反向代理模塊

何為反向代理?接收客戶端請求,并把請求交給后端服務(wù)器處理,后端服務(wù)器處理完成后,響應(yīng)通過反向代理服務(wù)器返回給客戶端。反向代理可實現(xiàn)局域網(wǎng)中的服務(wù)器可被公網(wǎng)中的客戶端訪問,也可實現(xiàn)多臺服務(wù)器間做負(fù)載均衡。
模塊:ngx_http_proxy_module

1.1 proxy_pass

作用域Context: location, if in location, limit_except

syntax:proxy_pass URL;

核心指令,該指令設(shè)置被代理服務(wù)器地址,URL是主機名稱,IP,IP加端口等形式,并且?guī)в袀鬏攨f(xié)議http://或https://
需要注意的時,URL中含有與不含有uri,nginx對其處理方式是不同的
配置示例:
情況一:URL不含uri

server {
                    ...
                    server_name www.cutemsyu.com;
                    location /uri/ {
                        proxy_pass http://192.168.100.1:8080;
                    }
                    ...
                }
nginx對于此種情況的處理方式是,將location中的uri傳遞給后端服務(wù)器                
即客戶端訪問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;

設(shè)定發(fā)往后端服務(wù)器的請求報文的請求首部值
使用該指令將客戶端IP傳遞給后端服務(wù)器以日志形式記錄下來,具體做法如下

proxy_set_header X-Real-IP $remote_addr
更改后端服務(wù)器日志記錄客戶端訪問IP字段值為首部X-Real-IP即可
1.3 超時時長指令

作用域Context: http, server, location

proxy_connect_timeout time;
定義與后端服務(wù)器建立連接的超時時長,默認(rèn)60s

proxy_read_timeout time;
與keep_alived相關(guān)。定義讀取來自后端服務(wù)器響應(yīng)間隔的超時時長,不是讀取一次完整的響應(yīng)的時長,如果在這段時間內(nèi)沒有任何傳輸動作則斷開連接,默認(rèn)60s

proxy_send_timeout time;
與keep_alived相關(guān)。定義向后端服務(wù)器發(fā)送請求的間隔超時時長,不是發(fā)送一次完整請求的時長,如果在這段時間內(nèi)沒有任何傳輸動作則斷開連接,默認(rèn)60s

1.4 proxy_ignore_client_abort

作用域Context: http, server, location

syntax:proxy_ignore_client_abort on | off;

定義nginx與后端服務(wù)器的連接是否中斷,如果客戶端不等待響應(yīng)結(jié)果中斷連接。
該指令默認(rèn)值是off,如果客戶端中斷了連接,nginx與后端連接隨之中斷,nginx記錄5XX的錯誤,一般此種錯誤很難排查,當(dāng)值設(shè)定為on時,nginx不會提前中斷與后端服務(wù)器連接,返回的狀態(tài)碼正常記錄200等等,nginx日志也不出現(xiàn)怪異的5XX錯誤。

2、nginx服務(wù)器組的配置

模塊ngx_http_upstream_module
該模塊定義可以被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 等指令引用的一組服務(wù)器。
nginx作為反向代理服務(wù)器經(jīng)常要配置一組服務(wù)器,以實現(xiàn)負(fù)載均衡。當(dāng)定義好一組服務(wù)器時,默認(rèn)調(diào)度算法為輪詢算法,nginx將接收到的請求輪詢發(fā)送給各個后端服務(wù)器處理,也可以根據(jù)服務(wù)器性能增加權(quán)重,或使用其他調(diào)度算法。

2.1 upstream配置塊

首先在http配置塊中創(chuàng)建新的配置上下文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的權(quán)重,默認(rèn)為1。權(quán)重高的server優(yōu)先處理請求,并分配更多的請求,即帶權(quán)重的輪詢調(diào)度。

max_fails=number
定義一個server在一段時間內(nèi)最大的請求失敗的次數(shù),超過此值,標(biāo)記該server為無效停止提供服務(wù)

fail_timeout=time
有兩層含義:1.此超時時長即為在max_fails提到的一段時間。2.一旦某server標(biāo)記為無效后,在這段時間內(nèi)不再檢測。默認(rèn)值為10s

backup
標(biāo)記server為備用服務(wù)器,只有當(dāng)其他服務(wù)器不可用時才啟用該服務(wù)器

down
標(biāo)記server為無效。一般在升級服務(wù)時使用,采用灰度模型將服務(wù)器逐個從線上脫離。

2.3 幾個調(diào)度算法

除了默認(rèn)的輪詢調(diào)度算法,還可以采用以下算法,使用方法很簡單——直接添加在upstream中。

least_conn
定義一組服務(wù)器的調(diào)度算法為最少連接數(shù)調(diào)度。根據(jù)server已建立的活動連接的數(shù)量來分配請求,擁有最少連接的server優(yōu)先分配。此算法權(quán)重有效

ip_hash
源地址hash調(diào)度算法,來自同一IP的請求總是分配到同一server上。該算法可在較粗的粒度上實現(xiàn)會話粘性,實現(xiàn)會話保持功能,但一般不采用。

hash key [ consistent ];
基于指定的key的hash表來實現(xiàn)對請求的調(diào)度,將同一類請求發(fā)往同一server上,key可以為文本,變量或是二者組合。

可選consistent參數(shù),指一致性hash算法,啟用此參數(shù)可避免一組服務(wù)器增減可用server時導(dǎo)致hash對應(yīng)表發(fā)生巨大變動,減少影響范圍。
示例:

hash $request_uri consistent; #hash請求uri來調(diào)度請求,并選擇一致性hash算法
2.4 服務(wù)器組保持空閑連接數(shù)
syntax:keepalive connections;

該指令設(shè)定每個worker進程為一個服務(wù)器組保持的空閑連接數(shù)量上限。connections為設(shè)定的數(shù)量,該數(shù)量不宜過大,防止新網(wǎng)絡(luò)連接的建立
該指令使用還是有些麻煩的,參考官網(wǎng)例子如下

#http類型服務(wù)器組啟用時,添加版本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服務(wù)器組時,需設(shè)定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;
        ...
    }
}
3、nginx代理緩沖

proxy buffer啟用之后,nginx會以異步形式將后端服務(wù)器返回的數(shù)據(jù)傳遞給客戶端。
nginx首先盡量接收來自后端服務(wù)器的一次響應(yīng)數(shù)據(jù),保存到緩沖區(qū)中,如果接收數(shù)據(jù)超出緩沖區(qū)大小,則保存到本地定義的臨時文件中。當(dāng)一次數(shù)據(jù)接收完或者緩沖區(qū)已裝滿數(shù)據(jù)則向客戶端發(fā)送數(shù)據(jù)。每個buffer裝滿數(shù)據(jù)之后向客戶端發(fā)送數(shù)據(jù)直到發(fā)送完成,buffer處于busy狀態(tài),期間對它進行任何其他操作都會失敗。
以下指令作用域Context: http, server, location

3.1 proxy_buffering
syntax: proxy_buffering on | off;

代理緩沖控制指令,默認(rèn)開啟

3.2 proxy_buffers
syntax: proxy_buffers number size;

該指令配置用于一個與后端服務(wù)器連接上的buffer數(shù)量,每個buffer大小。通常size為內(nèi)存分頁大小。接受一次后端服務(wù)器數(shù)據(jù)緩沖總大小為 number*size

3.3 proxy_busy_buffers_size
syntax: proxy_busy_buffers_size size;

該指令設(shè)置同時處于busy狀態(tài)的buffer總大小。默認(rèn)為proxy_buffers 中定義的size的兩倍。

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

該指令配置用于接收后端服務(wù)器響應(yīng)大體積數(shù)據(jù)的臨時文件的存儲路徑
Example:

proxy_temp_path /spool/nginx/proxy_temp 1 2;
3.5 proxy_max_temp_file_size
syntax: proxy_max_temp_file_size size;

該指令設(shè)置臨時文件占用空間的總大小

4、 nginx代理緩存

nginx不是專業(yè)的緩存服務(wù)器,varnish等服務(wù)更加高效,但nginx的緩存功能在某些場景也可發(fā)揮不錯的效果。
在上一小節(jié)中我們講到了nginx緩沖,緩沖是為了協(xié)調(diào)不同傳輸效率的設(shè)備之間的傳輸,降低效率高的一方的等待時間。而本節(jié)將的緩存則是為了提高響應(yīng)客戶端速度,將經(jīng)常訪問的數(shù)據(jù)緩存到本地,當(dāng)客戶端訪問同一資源時直接將本地存儲的內(nèi)容響應(yīng)給客戶端,減少對后端服務(wù)器的壓力提高響應(yīng)速度。
同時nginx的緩沖功能依賴nginx緩沖

4.1 proxy_cache
syntax: proxy_cache zone|off;

該指令配置一塊公用的緩存區(qū)域名稱或者關(guān)閉緩存功能。緩存區(qū)域存放緩存的索引數(shù)據(jù)。

4.2 proxy_cache_key
syntax: proxy_cache_key string;

定義用于建立索引的“鍵”
默認(rèn)值為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;

該指令定義緩存數(shù)據(jù)的存儲路徑及緩存索引的有關(guān)內(nèi)容。指令比較復(fù)雜上面的用法是縮減版,保留需要配置的參數(shù),其他保持默認(rèn)值即可。
參數(shù)含義:

path 定義存儲根路徑

levels=levels 定義在相對與path路徑下的第幾級hash路徑下緩存數(shù)據(jù)

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

4.4 proxy_cache_min_uses
syntax: proxy_cache_min_uses number;

該指令定義一個資源最少被訪問多少次將其緩存,默認(rèn)值為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訪問后端服務(wù)器過程中出現(xiàn)無法訪問,或者是訪問錯誤等情況時,允許哪些狀態(tài)下nginx使用緩存數(shù)據(jù)來響應(yīng)此次客戶端請求。雖然緩存的數(shù)據(jù)有可能已經(jīng)過期,但是對于網(wǎng)站可用性來講意義重大。默認(rèn)值為off。

4.6 proxy_cache_valid
syntax:proxy_cache_valid [code...] time;

該指令針對不同http響應(yīng)狀態(tài)來設(shè)置緩存時長

4.7 proxy_no_cache
syntax:proxy_no_cache sting;

該指令定義哪些情況下不緩存響應(yīng)數(shù)據(jù)。在string中定義的值可以是多個,當(dāng)它們中的值有一個為非空或非0,此時不緩存數(shù)據(jù)。string值通常為http協(xié)議中的緩存控制類首部

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;
    ...
}
5、nginx 的fastcgi模塊

nginx可以反向代理fastcgi協(xié)議的請求,本節(jié)通過一個例子講解具體使用

location ~* .php$ { #首先是匹配php動態(tài)請求

                fastcgi_pass   127.0.0.1:9000;   #設(shè)置后端服務(wù)器地址
                fastcgi_index  index.php;          #設(shè)置默認(rèn)引導(dǎo)頁面
                fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;   #傳遞php資源路徑給fastcgi服務(wù)器
                include        fastcgi_params; #使用nginx默認(rèn)已配置好的其他參數(shù)
            }
6、結(jié)束語

到此為止nginx三篇文章結(jié)束,歡迎大家收藏關(guān)注。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39423.html

相關(guān)文章

  • 5個提高Node.js應(yīng)用性能的技巧

    摘要:如果你有一個高流量的站點,提高性能的第一步是在你的前面放一個反向代理服務(wù)器。使用在一個已經(jīng)存在的服務(wù)器前做反向代理,作為的一個核心應(yīng)用,已經(jīng)被用于全世界成千上萬的站點中。 如果你的 node 服務(wù)器前面沒有 nginx, 那么你可能做錯了?!?Bryan Hughes Node.js 是使用 最流行的語言— JavaScript 構(gòu)建服務(wù)器端應(yīng)用的領(lǐng)先工具 。由于可以同時提供 web ...

    k00baa 評論0 收藏0
  • nginx網(wǎng)站性能優(yōu)化(2)】反向代理實現(xiàn)Apache與Nginx的動靜分離(LNMPA)

    摘要:單獨使用處理大量動態(tài)頁面時容易產(chǎn)生頻繁的錯誤。采用能夠更好的解決架構(gòu)中由于方面產(chǎn)生的錯誤,同時能夠以很簡單的方式提供更安全的多用戶多站點環(huán)境。這個值可以是一個文本,變量或者它們的組合。在指定的字段中沒有定義時會從它的上級字段繼承。 為什么要使用反向代理 具體請參考這篇博文: 【Linux常識篇(1)】所謂的正向代理與反向代理 LNMPA 通過Nginx強大的反向代理功能,把動態(tài)文件給A...

    liukai90 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<