摘要:反向代理模塊何為反向代理接收客戶端請(qǐng)求,并把請(qǐng)求交給后端服務(wù)器處理,后端服務(wù)器處理完成后,響應(yīng)通過(guò)反向代理服務(wù)器返回給客戶端。作為反向代理服務(wù)器經(jīng)常要配置一組服務(wù)器,以實(shí)現(xiàn)負(fù)載均衡。
1、nginx反向代理模塊
何為反向代理?接收客戶端請(qǐng)求,并把請(qǐng)求交給后端服務(wù)器處理,后端服務(wù)器處理完成后,響應(yīng)通過(guò)反向代理服務(wù)器返回給客戶端。反向代理可實(shí)現(xiàn)局域網(wǎng)中的服務(wù)器可被公網(wǎng)中的客戶端訪問(wèn),也可實(shí)現(xiàn)多臺(tái)服務(wù)器間做負(fù)載均衡。
模塊:ngx_http_proxy_module
作用域Context: location, if in location, limit_except
syntax:proxy_pass URL;
核心指令,該指令設(shè)置被代理服務(wù)器地址,URL是主機(jī)名稱,IP,IP加端口等形式,并且?guī)в袀鬏攨f(xié)議http://或https://
需要注意的時(shí),URL中含有與不含有uri,nginx對(duì)其處理方式是不同的
配置示例:
情況一:URL不含uri
server { ... server_name www.cutemsyu.com; location /uri/ { proxy_pass http://192.168.100.1:8080; } ... } nginx對(duì)于此種情況的處理方式是,將location中的uri傳遞給后端服務(wù)器 即客戶端訪問(wèn)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對(duì)于此種情況的處理方式是,將location中的uri替換成proxy_pass指令中URL含有的uri 即客戶端訪問(wèn)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ù)器的請(qǐng)求報(bào)文的請(qǐng)求首部值
使用該指令將客戶端IP傳遞給后端服務(wù)器以日志形式記錄下來(lái),具體做法如下
proxy_set_header X-Real-IP $remote_addr 更改后端服務(wù)器日志記錄客戶端訪問(wèn)IP字段值為首部X-Real-IP即可1.3 超時(shí)時(shí)長(zhǎng)指令
作用域Context: http, server, location
proxy_connect_timeout time;
定義與后端服務(wù)器建立連接的超時(shí)時(shí)長(zhǎng),默認(rèn)60s
proxy_read_timeout time;
與keep_alived相關(guān)。定義讀取來(lái)自后端服務(wù)器響應(yīng)間隔的超時(shí)時(shí)長(zhǎng),不是讀取一次完整的響應(yīng)的時(shí)長(zhǎng),如果在這段時(shí)間內(nèi)沒(méi)有任何傳輸動(dòng)作則斷開(kāi)連接,默認(rèn)60s
proxy_send_timeout time;
與keep_alived相關(guān)。定義向后端服務(wù)器發(fā)送請(qǐng)求的間隔超時(shí)時(shí)長(zhǎng),不是發(fā)送一次完整請(qǐng)求的時(shí)長(zhǎng),如果在這段時(shí)間內(nèi)沒(méi)有任何傳輸動(dòng)作則斷開(kāi)連接,默認(rèn)60s
作用域Context: http, server, location
syntax:proxy_ignore_client_abort on | off;
定義nginx與后端服務(wù)器的連接是否中斷,如果客戶端不等待響應(yīng)結(jié)果中斷連接。
該指令默認(rèn)值是off,如果客戶端中斷了連接,nginx與后端連接隨之中斷,nginx記錄5XX的錯(cuò)誤,一般此種錯(cuò)誤很難排查,當(dāng)值設(shè)定為on時(shí),nginx不會(huì)提前中斷與后端服務(wù)器連接,返回的狀態(tài)碼正常記錄200等等,nginx日志也不出現(xiàn)怪異的5XX錯(cuò)誤。
模塊ngx_http_upstream_module
該模塊定義可以被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 等指令引用的一組服務(wù)器。
nginx作為反向代理服務(wù)器經(jīng)常要配置一組服務(wù)器,以實(shí)現(xiàn)負(fù)載均衡。當(dāng)定義好一組服務(wù)器時(shí),默認(rèn)調(diào)度算法為輪詢算法,nginx將接收到的請(qǐng)求輪詢發(fā)送給各個(gè)后端服務(wù)器處理,也可以根據(jù)服務(wù)器性能增加權(quán)重,或使用其他調(diào)度算法。
首先在http配置塊中創(chuàng)建新的配置上下文upstream并命名:
http{ ... upstream group_name { ... ... } ... }
接下來(lái)介紹upstream中可用的指令
2.2 server指令syntax:server address [parameters...];
server指令為核心指令,定義組成員
address可用表示形式:
IP[: PORT]
HOSTNAME [ : PORT]
unix: /PATH/TO/SOME_SOCK_FILE
parameters可用如下:
weight=number
定義一個(gè)server的權(quán)重,默認(rèn)為1。權(quán)重高的server優(yōu)先處理請(qǐng)求,并分配更多的請(qǐng)求,即帶權(quán)重的輪詢調(diào)度。
max_fails=number
定義一個(gè)server在一段時(shí)間內(nèi)最大的請(qǐng)求失敗的次數(shù),超過(guò)此值,標(biāo)記該server為無(wú)效停止提供服務(wù)
fail_timeout=time
有兩層含義:1.此超時(shí)時(shí)長(zhǎng)即為在max_fails提到的一段時(shí)間。2.一旦某server標(biāo)記為無(wú)效后,在這段時(shí)間內(nèi)不再檢測(cè)。默認(rèn)值為10s
backup
標(biāo)記server為備用服務(wù)器,只有當(dāng)其他服務(wù)器不可用時(shí)才啟用該服務(wù)器
down
標(biāo)記server為無(wú)效。一般在升級(jí)服務(wù)時(shí)使用,采用灰度模型將服務(wù)器逐個(gè)從線上脫離。
除了默認(rèn)的輪詢調(diào)度算法,還可以采用以下算法,使用方法很簡(jiǎn)單——直接添加在upstream中。
least_conn
定義一組服務(wù)器的調(diào)度算法為最少連接數(shù)調(diào)度。根據(jù)server已建立的活動(dòng)連接的數(shù)量來(lái)分配請(qǐng)求,擁有最少連接的server優(yōu)先分配。此算法權(quán)重有效
ip_hash
源地址hash調(diào)度算法,來(lái)自同一IP的請(qǐng)求總是分配到同一server上。該算法可在較粗的粒度上實(shí)現(xiàn)會(huì)話粘性,實(shí)現(xiàn)會(huì)話保持功能,但一般不采用。
hash key [ consistent ];
基于指定的key的hash表來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求的調(diào)度,將同一類請(qǐng)求發(fā)往同一server上,key可以為文本,變量或是二者組合。
可選consistent參數(shù),指一致性hash算法,啟用此參數(shù)可避免一組服務(wù)器增減可用server時(shí)導(dǎo)致hash對(duì)應(yīng)表發(fā)生巨大變動(dòng),減少影響范圍。
示例:
hash $request_uri consistent; #hash請(qǐng)求uri來(lái)調(diào)度請(qǐng)求,并選擇一致性hash算法2.4 服務(wù)器組保持空閑連接數(shù)
syntax:keepalive connections;
該指令設(shè)定每個(gè)worker進(jìn)程為一個(gè)服務(wù)器組保持的空閑連接數(shù)量上限。connections為設(shè)定的數(shù)量,該數(shù)量不宜過(guò)大,防止新網(wǎng)絡(luò)連接的建立
該指令使用還是有些麻煩的,參考官網(wǎng)例子如下
#http類型服務(wù)器組啟用時(shí),添加版本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í),需設(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會(huì)以異步形式將后端服務(wù)器返回的數(shù)據(jù)傳遞給客戶端。
nginx首先盡量接收來(lái)自后端服務(wù)器的一次響應(yīng)數(shù)據(jù),保存到緩沖區(qū)中,如果接收數(shù)據(jù)超出緩沖區(qū)大小,則保存到本地定義的臨時(shí)文件中。當(dāng)一次數(shù)據(jù)接收完或者緩沖區(qū)已裝滿數(shù)據(jù)則向客戶端發(fā)送數(shù)據(jù)。每個(gè)buffer裝滿數(shù)據(jù)之后向客戶端發(fā)送數(shù)據(jù)直到發(fā)送完成,buffer處于busy狀態(tài),期間對(duì)它進(jìn)行任何其他操作都會(huì)失敗。
以下指令作用域Context: http, server, location
syntax: proxy_buffering on | off;
代理緩沖控制指令,默認(rèn)開(kāi)啟
3.2 proxy_bufferssyntax: proxy_buffers number size;
該指令配置用于一個(gè)與后端服務(wù)器連接上的buffer數(shù)量,每個(gè)buffer大小。通常size為內(nèi)存分頁(yè)大小。接受一次后端服務(wù)器數(shù)據(jù)緩沖總大小為 number*size
3.3 proxy_busy_buffers_sizesyntax: proxy_busy_buffers_size size;
該指令設(shè)置同時(shí)處于busy狀態(tài)的buffer總大小。默認(rèn)為proxy_buffers 中定義的size的兩倍。
3.4 proxy_temp_pathsyntax: proxy_temp_path path [level1 [level2 [level3]]];
該指令配置用于接收后端服務(wù)器響應(yīng)大體積數(shù)據(jù)的臨時(shí)文件的存儲(chǔ)路徑
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è)置臨時(shí)文件占用空間的總大小
4、 nginx代理緩存nginx不是專業(yè)的緩存服務(wù)器,varnish等服務(wù)更加高效,但nginx的緩存功能在某些場(chǎng)景也可發(fā)揮不錯(cuò)的效果。
在上一小節(jié)中我們講到了nginx緩沖,緩沖是為了協(xié)調(diào)不同傳輸效率的設(shè)備之間的傳輸,降低效率高的一方的等待時(shí)間。而本節(jié)將的緩存則是為了提高響應(yīng)客戶端速度,將經(jīng)常訪問(wèn)的數(shù)據(jù)緩存到本地,當(dāng)客戶端訪問(wèn)同一資源時(shí)直接將本地存儲(chǔ)的內(nèi)容響應(yīng)給客戶端,減少對(duì)后端服務(wù)器的壓力提高響應(yīng)速度。
同時(shí)nginx的緩沖功能依賴nginx緩沖
syntax: proxy_cache zone|off;
該指令配置一塊公用的緩存區(qū)域名稱或者關(guān)閉緩存功能。緩存區(qū)域存放緩存的索引數(shù)據(jù)。
4.2 proxy_cache_keysyntax: proxy_cache_key string;
定義用于建立索引的“鍵”
默認(rèn)值為proxy_cache_key $scheme$proxy_host$request_uri;
特別指出該指令作用域Context: http
syntax:proxy_cache_path path [levels=levels] keys_zone=name:size;
該指令定義緩存數(shù)據(jù)的存儲(chǔ)路徑及緩存索引的有關(guān)內(nèi)容。指令比較復(fù)雜上面的用法是縮減版,保留需要配置的參數(shù),其他保持默認(rèn)值即可。
參數(shù)含義:
path 定義存儲(chǔ)根路徑
levels=levels 定義在相對(duì)與path路徑下的第幾級(jí)hash路徑下緩存數(shù)據(jù)
keys_zone=name:size 定義緩存索引存放的區(qū)域和使用大小
4.4 proxy_cache_min_usessyntax: proxy_cache_min_uses number;
該指令定義一個(gè)資源最少被訪問(wèn)多少次將其緩存,默認(rèn)值為1
4.5 proxy_cache_use_stalesyntax:proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
該指令定義如果nginx訪問(wèn)后端服務(wù)器過(guò)程中出現(xiàn)無(wú)法訪問(wèn),或者是訪問(wèn)錯(cuò)誤等情況時(shí),允許哪些狀態(tài)下nginx使用緩存數(shù)據(jù)來(lái)響應(yīng)此次客戶端請(qǐng)求。雖然緩存的數(shù)據(jù)有可能已經(jīng)過(guò)期,但是對(duì)于網(wǎng)站可用性來(lái)講意義重大。默認(rèn)值為off。
4.6 proxy_cache_validsyntax:proxy_cache_valid [code...] time;
該指令針對(duì)不同http響應(yīng)狀態(tài)來(lái)設(shè)置緩存時(shí)長(zhǎng)
4.7 proxy_no_cachesyntax:proxy_no_cache sting;
該指令定義哪些情況下不緩存響應(yīng)數(shù)據(jù)。在string中定義的值可以是多個(gè),當(dāng)它們中的值有一個(gè)為非空或非0,此時(shí)不緩存數(shù)據(jù)。string值通常為http協(xié)議中的緩存控制類首部
4.8 一個(gè)配置樣例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é)議的請(qǐng)求,本節(jié)通過(guò)一個(gè)例子講解具體使用
location ~* .php$ { #首先是匹配php動(dòng)態(tài)請(qǐng)求
fastcgi_pass 127.0.0.1:9000; #設(shè)置后端服務(wù)器地址 fastcgi_index index.php; #設(shè)置默認(rèn)引導(dǎo)頁(yè)面 fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; #傳遞php資源路徑給fastcgi服務(wù)器 include fastcgi_params; #使用nginx默認(rèn)已配置好的其他參數(shù) }6、結(jié)束語(yǔ)
到此為止nginx三篇文章結(jié)束,歡迎大家收藏關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39423.html
摘要:如果你有一個(gè)高流量的站點(diǎn),提高性能的第一步是在你的前面放一個(gè)反向代理服務(wù)器。使用在一個(gè)已經(jīng)存在的服務(wù)器前做反向代理,作為的一個(gè)核心應(yīng)用,已經(jīng)被用于全世界成千上萬(wàn)的站點(diǎn)中。 如果你的 node 服務(wù)器前面沒(méi)有 nginx, 那么你可能做錯(cuò)了。— Bryan Hughes Node.js 是使用 最流行的語(yǔ)言— JavaScript 構(gòu)建服務(wù)器端應(yīng)用的領(lǐng)先工具 。由于可以同時(shí)提供 web ...
摘要:?jiǎn)为?dú)使用處理大量動(dòng)態(tài)頁(yè)面時(shí)容易產(chǎn)生頻繁的錯(cuò)誤。采用能夠更好的解決架構(gòu)中由于方面產(chǎn)生的錯(cuò)誤,同時(shí)能夠以很簡(jiǎn)單的方式提供更安全的多用戶多站點(diǎn)環(huán)境。這個(gè)值可以是一個(gè)文本,變量或者它們的組合。在指定的字段中沒(méi)有定義時(shí)會(huì)從它的上級(jí)字段繼承。 為什么要使用反向代理 具體請(qǐng)參考這篇博文: 【Linux常識(shí)篇(1)】所謂的正向代理與反向代理 LNMPA 通過(guò)Nginx強(qiáng)大的反向代理功能,把動(dòng)態(tài)文件給A...
閱讀 2856·2021-11-22 11:56
閱讀 3559·2021-11-15 11:39
閱讀 904·2021-09-24 09:48
閱讀 763·2021-08-17 10:14
閱讀 1329·2019-08-30 15:55
閱讀 2757·2019-08-30 15:55
閱讀 1314·2019-08-30 15:44
閱讀 2785·2019-08-30 10:59