反向代理
優(yōu)勢(shì)
1.隱藏真實(shí)服務(wù)器
2.便于橫向擴(kuò)充后端動(dòng)態(tài)服務(wù)
3.動(dòng)靜分離,提升系統(tǒng)健壯性
動(dòng)靜分離
動(dòng)靜分離是指在web服務(wù)器架構(gòu)中请契,將靜態(tài)頁(yè)面與動(dòng)態(tài)頁(yè)面或者靜態(tài)內(nèi)容接口和動(dòng)態(tài)內(nèi)容接口分開(kāi)不同系統(tǒng)訪問(wèn)的架構(gòu)設(shè)計(jì)方法,進(jìn)而提升整個(gè)服務(wù)訪問(wèn)性能和可維護(hù)性
使用Nginx作為反向代理時(shí)支持的協(xié)議
用于定義上游服務(wù)的upstream模塊
解釋?zhuān)耗J(rèn)已被編譯進(jìn)nginx均抽,禁用需要通過(guò)--with-http_upstream_module
語(yǔ)法:upstream name { ... }
默認(rèn)值:無(wú)
上下文:http
1.server
語(yǔ)法:server address [ parameters ];
默認(rèn)值:無(wú)
上下文:upstream
2.keepalive
解釋?zhuān)合拗泼總€(gè)worker子進(jìn)程與上游服務(wù)器空閑長(zhǎng)連接的最大數(shù)量
語(yǔ)法:keepalive connections尚洽;
上下文:upstream
示例:keepalive 16;
3.keepalive_requests
解釋?zhuān)簡(jiǎn)蝹€(gè)長(zhǎng)連接可以處理的最多HTTP請(qǐng)求個(gè)數(shù)
語(yǔ)法:keepalive_requests number;
默認(rèn)值:keepalive_request 100;
上下文:upstream
4.keepalive_timeout
解釋?zhuān)嚎臻e長(zhǎng)連接的最長(zhǎng)保持時(shí)間
語(yǔ)法:keepalive_timeout time;
默認(rèn)值:keepalive_timeout 60s;
上下文:upstream
5.queue(只有在nginx專(zhuān)業(yè)版上可用)
語(yǔ)法:queue number [timeout=time];
默認(rèn)值:無(wú)
上下文:upstream
示例::queue 100 timeout=30s;
upstream back_end {
server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s;max_fails=2;
keepalive 32;
keepalive_requests 50;
keepalive_timeout 30s;
}
http_proxy模塊
1.proxy_pass指令
解釋?zhuān)河蒱ttp_proxy模塊提供(ngx_http_proxy_module)夷家,默認(rèn)已被編譯進(jìn)nginx幕侠,禁用需要通過(guò)--without-http_proxy_module
語(yǔ)法:proxy_pass URL;
默認(rèn)值:無(wú)
上下文:location帝美, if, limit_except
示例一:proxy_pass http://127.0.0.1:8080
示例二:proxy_pass http://127.0.0.1:8089/proxy
URL參數(shù)原則
-URL必須以http或https開(kāi)頭
-URL中可以攜帶變量
-URL中是否帶URI橙依,會(huì)直接影響發(fā)往上游請(qǐng)求的URL
upstream back_end {
server 192.168.184.20:8080
}
server {
listen 80;
server_name localhost;
location /proxy {
proxy_pass http://back_end/proxy;
}
}
proxy_pass用法常見(jiàn)誤區(qū)
-proxy_pass代理的URL后面到底加不加/?
1.不帶/意味著Nginx不會(huì)修改用戶(hù)URL硕旗, 而是直接透?jìng)鹘o上游的應(yīng)用服務(wù)器
2.帶/意味著Nginx會(huì)修改用戶(hù)URL窗骑, 修改方法:將location后的URL傳遞給上游服務(wù)器
location /bbs/ {
proxy_pass http://127.0.0.1:8080;
}
#用戶(hù)請(qǐng)求的URL:/bbs/abc/test.html
#請(qǐng)求到達(dá)Nginx的URL:/bbs/abc/test.html
#請(qǐng)求到達(dá)上游應(yīng)用服務(wù)器的URL:/bbs/abc/test.html
#如果proxy_pass http://127.0.0.1:8080/,則請(qǐng)求到達(dá)上游應(yīng)用服務(wù)器的URL為/abc/test.html
代理場(chǎng)景下Nginx接收用戶(hù)請(qǐng)求包體的處理方式
解釋?zhuān)航邮瞻w有兩種方式漆枚,一種是接受完全部包體再發(fā)送到上游服務(wù)器创译,一種是一邊接收包體一邊發(fā)送
1.proxy_request_buffering on | off;
默認(rèn)值:on
上下文:http, server, location
含義:是否開(kāi)啟緩存區(qū)域,開(kāi)啟后會(huì)接收完全部包體再發(fā)送到上游服務(wù)器墙基。
適應(yīng)場(chǎng)景:吞吐量要求高软族,上游服務(wù)并發(fā)處理能力低。如果不開(kāi)啟残制,則響應(yīng)更及時(shí)立砸,可以減少Nginx的磁盤(pán)IO
2.client_max_body_size size;
默認(rèn)值:1M;
上下文:http, server, location
含義:Nginx可以處理的請(qǐng)求體的大小初茶,超過(guò)大小則返回錯(cuò)誤
3.client_body_buffer_size size;
默認(rèn)值:8k | 16k (分別對(duì)應(yīng)32位和64位系統(tǒng))
上下文:http, server, location
含義:緩存區(qū)域的大小颗祝,如果請(qǐng)求體小于緩存區(qū)域,直接放在內(nèi)存中恼布,如果大于緩存區(qū)域螺戳,就放在文件中。
4.client_body_in_single_buffer on | off;
默認(rèn)值:off折汞;
上下文:http, server, location
含義:是否把文件放在一個(gè)連續(xù)的內(nèi)存空間中倔幼,效率更高
5.client_body_temp_path path [ level1 ] [level2 ] [level3]
默認(rèn)值:client_body_temp;
上下文:http, server, location
含義:請(qǐng)求體大于緩存區(qū)域,在磁盤(pán)中的存放路徑
6.client_body_in_file_only on | clean | off;
默認(rèn)值:off爽待;
上下文:http, server, location
含義:請(qǐng)求體是否只放在文件中儲(chǔ)存损同,clean和on意思一樣,但是樣鸟款,但是會(huì)在請(qǐng)求完成后清除文件揖庄。
7.client_body_timeout time;
默認(rèn)值:60s;
上下文:http, server, location
含義:連接成功后,長(zhǎng)時(shí)間沒(méi)有請(qǐng)求會(huì)在指定時(shí)間關(guān)閉連接
代理場(chǎng)景下Nginx如何更改發(fā)往上游的用戶(hù)請(qǐng)求
1.proxy_method method;
默認(rèn)值:無(wú)
上下文:http, server, location
含義:修改請(qǐng)求的方法
2.proxy_http_version 1.0 | 1.1;
默認(rèn)值:1.0欠雌;
上下文:http, server, location
含義:修改請(qǐng)求的http版本蹄梢,注意1.0不支持keepalive方法
3.proxy_set_header field value;
默認(rèn)值:proxy_set_header Host $proxy_host;
proxy_set_header Conncetion close;
上下文:http, server, location
含義:修改請(qǐng)求頭參數(shù),注意,要想打開(kāi)keepalive禁炒,需要注定指定Connction為keepalive
4.proxy_pass_request_header on | off;
默認(rèn)值:on而咆;
上下文:http, server, location
含義:是否傳遞請(qǐng)求頭信息
5.proxy_set_body value;
默認(rèn)值:無(wú)
上下文:http, server, location
含義:設(shè)置請(qǐng)求體信息
6.proxy_pass_request_body on | off;
默認(rèn)值:on;
上下文:http, server, location
含義:是否傳遞請(qǐng)求體信息
代理情景下Nginx與上游服務(wù)器建立連接細(xì)節(jié)
1.proxy_connect_timeout time;
默認(rèn)值:60s;
上下文:http, server, location
含義:nginx與上游服務(wù)器建立長(zhǎng)連接的時(shí)間
2.proxy_socket_keepalive on | off;
默認(rèn)值:off幕袱;
上下文:http, server, location
含義:是否打開(kāi)socket長(zhǎng)連接
3.proxy_send_timeout time;
默認(rèn)值:60s暴备;
上下文:http, server, location
含義:建立連接后在指定時(shí)間沒(méi)有發(fā)送請(qǐng)求關(guān)閉連接
4.proxy_ignore_client_bort on | off;
默認(rèn)值:off;
上下文:http, server, location
含義:當(dāng)連接關(guān)閉時(shí)是否停止處理請(qǐng)求