用HTTP proxy module配置一個反向代理服務(wù)器
反向代理方式是指用代理服務(wù)器來接收Internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)中的上游服務(wù)器,并將從上游服務(wù)器上得到的結(jié)果返回給Internet上請求連接的客戶端,此時代理服務(wù)器對外的表現(xiàn)就是一個Web服務(wù)器。
Nginx具有強(qiáng)悍的高并發(fā)高負(fù)載能力,因此一般會作為前端的服務(wù)器直接向客戶端提供靜態(tài)文件服務(wù)。但也有一些復(fù)雜多變的業(yè)務(wù)需要由上游服務(wù)器處理。因此,Nginx通常會被配置為既是靜態(tài)Web服務(wù)器也是反向代理服務(wù)器。

與Squid等其他反向代理服務(wù)器相比,Nginx有自己的特點。當(dāng)客戶端發(fā)來HTTP請求時,Nginx并不會立刻轉(zhuǎn)發(fā)到上游服務(wù)器,而是先把用戶的請求完整地接收到Nginx所在服務(wù)器的硬盤或者內(nèi)存中,然后再向上游服務(wù)器發(fā)起連接,把緩存的客戶端請求轉(zhuǎn)發(fā)到上游服務(wù)器。
Nginx的這種方式,很明顯的缺點就是延長了一個請求的處理時間,并增加了用于緩存請求內(nèi)容的內(nèi)存和磁盤空間;而優(yōu)點則是降低了上游服務(wù)器的負(fù)載,盡量把壓力放在Nginx服務(wù)器上。
通常,客戶端與代理服務(wù)器之間的網(wǎng)絡(luò)環(huán)境比較復(fù)雜,多半是走公網(wǎng)。而代理服務(wù)器與上游服務(wù)器之間一般是走內(nèi)網(wǎng)。Nginx在接收到完整的客戶端請求之后才會與上游服務(wù)器建立連接進(jìn)行請求轉(zhuǎn)發(fā),由于網(wǎng)絡(luò)較快,所以這個轉(zhuǎn)發(fā)過程會執(zhí)行得很快。這樣,一個客戶端請求占用上游服務(wù)器的連接時間就會明顯縮短。
1 負(fù)載均衡的基本配置
(1) upstream塊
語法:upstream name {...}
配置塊:http
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com
}
server {
location / {
proxy_pass http://backend;
}
}
(2) server 塊
語法:server name [parameters];
配置塊:upstream
支持的參數(shù)parameters如下:
- weight=number,權(quán)重,默認(rèn)為1;
- max_fails=number,與fail_timeout配合使用,指在fail_timeout時間段內(nèi),如果向當(dāng)前的上游服務(wù)器轉(zhuǎn)發(fā)次數(shù)超過number,則認(rèn)為在當(dāng)前fail_timeout時間段內(nèi)這臺上游服務(wù)器不可也用。默認(rèn)為1,如果設(shè)置為0,則表示不檢查失敗次數(shù);
- fail_timeout=time,默認(rèn)10;
- down,表示所在的上游服務(wù)器永久下線,只有在ip_hash配置時才有用;
- backup,使用ip_hash配置項時無效。它表示所在的上游服務(wù)器只是備份服務(wù)器,只有在所有的非備份上游服務(wù)器都失效后,才會向所在的上游服務(wù)器轉(zhuǎn)發(fā)請求。
(3) ip_hash塊
語法:ip_hash;
配置塊:upstream
某些場景下,我們可能會希望來自某一個用戶的請求始終落到固定的一臺上游服務(wù)器中。ip_hash首先根據(jù)客戶端的ip地址計算出一個key,將key按照upstream集群里的上游服務(wù)器數(shù)量進(jìn)行取模,然后以取模后的結(jié)果把請求轉(zhuǎn)發(fā)到相應(yīng)的上游服務(wù)器中。
ip_hash與weight配置不可同時使用。如果upstream集群中有一臺上游服務(wù)器暫時不可用,不能直接刪除該配置,而是要down參數(shù)標(biāo)識,確保轉(zhuǎn)發(fā)策略的一慣性。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com down;
server backend3.example.com
}
2 反向代理的基本配置
(1) proxy_pass
語法:proxy_pass URL;
配置塊:location、if
URL可以使主機(jī)名或ip地址加端口的形式,也可以是UNIX句柄,還可以直接用負(fù)載均衡塊。
默認(rèn)情況下,反向代理是不會轉(zhuǎn)發(fā)請求中的頭部的,如果需要轉(zhuǎn)發(fā),必須加上配置:
proxy_set_heaer Host $Host;
(2) proxy_method
語法:proxy_method method;
配置塊:http、server、location
用于改變請求方法類型。例如 proxy_method POST; 客戶端發(fā)來的GET請求在轉(zhuǎn)發(fā)時方法名會改為POST。
(3) proxy_hide_header
語法:proxy_hide_header the_header;
配置塊:http、server、location
(4) proxy_pass_header
語法:proxy_pass_header the_header;
配置塊:http、server、location
(5) proxy_pass_request_body
語法:proxy_pass_request_body on | off;
默認(rèn):proxy_pass_request_body on;
配置塊:http、server、location
(6) proxy_pass_request_headers
語法:proxy_pass_request_headers on | off;
默認(rèn):proxy_pass_request_headers on;
配置塊:http、server、location
(7) proxy_redirect
語法:proxy_redirect [default|off|redirect replacement];
默認(rèn):proxy_redirect default;
配置塊:http、server、location
此配置項的作用是:當(dāng)上游服務(wù)器返回的響應(yīng)是重定向或刷新請求,該配置可以重設(shè)HTTP返回頭部中的location或refresh字段。
(8) proxy_next_stream
語法:proxy_next_stream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默認(rèn):proxy_next_stream error timeout;
配置塊:http、server、location
此配置項表示當(dāng)向一臺上游服務(wù)器轉(zhuǎn)發(fā)請求出現(xiàn)錯誤時,繼續(xù)換一臺上游服務(wù)器處理這個請求。proxy_next_stream 參數(shù)的作用是用來說明在哪些情況下回繼續(xù)選擇下一臺上游服務(wù)器轉(zhuǎn)發(fā)請求。
- error:當(dāng)向上游服務(wù)器發(fā)起連接、發(fā)送請求、讀取響應(yīng)時出錯
- timeout:發(fā)送請求或讀取響應(yīng)時發(fā)生超時
- invalid_header:上游服務(wù)器發(fā)送的響應(yīng)時不合法的
- http_50x:上游服務(wù)器返回的HTTP響應(yīng)碼是50x
- off:關(guān)閉proxy_next_stream功能
Nginx的反向代理模塊還提供了很多種配置,如設(shè)置連接的超時時間、臨時文件如何存儲,以及最重要的如何緩存上游服務(wù)器響應(yīng)等功能。這些配置可以通過閱讀ngx_http_proxy_module模塊的說明來了解。