本文介紹代理服務(wù)器的基本配置。 您將學(xué)習(xí)如何通過(guò)不同協(xié)議將NGINX請(qǐng)求傳遞給代理的服務(wù)器,修改發(fā)送到代理服務(wù)器的客戶端請(qǐng)求標(biāo)頭,以及配置來(lái)自代理服務(wù)器的響應(yīng)緩沖。
代理服務(wù)器的基本配置目錄
代理通常用于在多個(gè)服務(wù)器之間分配負(fù)載,無(wú)縫地顯示來(lái)自不同網(wǎng)站的內(nèi)容,或者通過(guò)HTTP以外的協(xié)議將請(qǐng)求傳遞給應(yīng)用服務(wù)器。
當(dāng)NGINX代理請(qǐng)求時(shí),它將請(qǐng)求發(fā)送到指定的代理服務(wù)器,獲取響應(yīng),并將其發(fā)送回客戶端。 可以使用指定的協(xié)議將請(qǐng)求代理到HTTP服務(wù)器(另一個(gè)NGINX服務(wù)器或任何其他服務(wù)器)或非HTTP服務(wù)器(可以運(yùn)行使用特定框架開(kāi)發(fā)的應(yīng)用程序,如PHP或Python)。 支持的協(xié)議包括FastCGI,uwsgi,SCGI和memcached。
要將請(qǐng)求傳遞給HTTP代理服務(wù)器,則在一個(gè)location塊內(nèi)指定proxy_pass指令。 例如:
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
此示例配置將在此location處理的所有請(qǐng)求傳遞到指定地址(http://www.example.com/link/)處的代理服務(wù)器。該地址可以指定為域名或IP地址。 該地址還可能包括一個(gè)端口:
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
請(qǐng)注意,在上述第一個(gè)示例中,代理服務(wù)器的地址后面是URI為 /link/。 如果URI與地址一起指定,它將替換與location參數(shù)匹配請(qǐng)求URI的部分。 例如,這里使用/some/path/page.html的URI請(qǐng)求將被代理到http://www.example.com/link/page.html。 如果地址被指定為沒(méi)有URI,或者不可能確定要替換的URI部分,則會(huì)傳遞完整的請(qǐng)求URI(可能是修改)。
要將請(qǐng)求傳遞給非HTTP代理服務(wù)器,應(yīng)使用適當(dāng)?shù)?code>**_ pass指令:
fastcgi_pass 將請(qǐng)求傳遞給FastCGI服務(wù)器uwsgi_pass 將請(qǐng)求傳遞給uwsgi服務(wù)器scgi_pass 將請(qǐng)求傳遞給SCGI服務(wù)器memcached_pass 將請(qǐng)求傳遞給memcached服務(wù)器請(qǐng)注意,在這些情況下,指定地址的規(guī)則可能不同。 您可能還需要向服務(wù)器傳遞其他參數(shù)(有關(guān)詳細(xì)信息,請(qǐng)參閱參考文檔)。
proxy_pass指令也可以指向一組命名的服務(wù)器。 在這種情況下,根據(jù)指定的方法在組中的服務(wù)器之間分配請(qǐng)求。
默認(rèn)情況下,NGINX在代理請(qǐng)求“Host” 和 “Connection”中重新定義了兩個(gè)頭字段,并消除了其值為空字符串的頭字段。 “Host”設(shè)置為$proxy_host變量,“Connection”設(shè)置為關(guān)閉(close)。
要更改這些設(shè)置,以及修改其他header字段,請(qǐng)使用proxy_set_header指令。 該指令可以在一個(gè)或多個(gè)位置(location)指定。 它也可以在特定的server上下文或http塊中指定。 例如:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
在此配置中,“Host”字段設(shè)置為 $host 變量。
為了防止頭域被傳遞給代理服務(wù)器,請(qǐng)將其設(shè)置為空字符串,如下所示:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
默認(rèn)情況下,NGINX緩存來(lái)自代理服務(wù)器的響應(yīng)。 響應(yīng)存儲(chǔ)在內(nèi)部緩沖區(qū)中,并且不會(huì)發(fā)送到客戶端,直到收到整個(gè)響應(yīng)。 緩沖有助于通過(guò)慢客戶端優(yōu)化性能,如果響應(yīng)從NGINX同步傳遞到客戶端,這可能會(huì)浪費(fèi)代理服務(wù)器時(shí)間。 然而,當(dāng)啟用緩沖時(shí),NGINX允許代理服務(wù)器快速處理響應(yīng),而NGINX存儲(chǔ)響應(yīng)時(shí)間與客戶端需要下載的時(shí)間一樣長(zhǎng)。
負(fù)責(zé)啟用和禁用緩沖的指令是proxy_buffering。 默認(rèn)情況下,它被設(shè)置為開(kāi)啟且緩沖已啟用。
proxy_buffers指令控制分配給請(qǐng)求的緩沖區(qū)的大小和數(shù)量。 來(lái)自代理服務(wù)器的響應(yīng)的第一部分存儲(chǔ)在單獨(dú)的緩沖區(qū)中,其大小由proxy_buffer_size指令設(shè)置。 這部分通常包含一個(gè)比較小的響應(yīng)頭,并且可以比其余的響應(yīng)的緩沖區(qū)小。
在以下示例中,緩沖區(qū)的默認(rèn)數(shù)量增加,并且響應(yīng)的第一部分的緩沖區(qū)的大小小于默認(rèn)值。
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
如果緩存被禁用,則在從代理服務(wù)器接收緩沖時(shí),響應(yīng)將同步發(fā)送到客戶端。 對(duì)于需要盡快開(kāi)始接收響應(yīng)的快速交互式客戶端,此行為可能是可取的。
要禁用特定位置的緩沖,請(qǐng)?jiān)?code>location塊中將proxy_buffering偽指令設(shè)置為off,如下所示:
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在這種情況下,NGINX只使用由proxy_buffer_size配置的緩沖區(qū)來(lái)存儲(chǔ)響應(yīng)的當(dāng)前部分。
如果您的代理服務(wù)器有多個(gè)網(wǎng)絡(luò)接口,有時(shí)您可能需要選擇特定的源IP地址才能連接到代理服務(wù)器或上游。 如果NGINX后端的代理服務(wù)器只配置為接受來(lái)自特定IP網(wǎng)絡(luò)或IP地址范圍的連接,在這種情況下,這個(gè)配置選項(xiàng)就很有用。
指定proxy_bind指令和必要網(wǎng)絡(luò)接口的IP地址:
location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}
location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}
IP地址也可以用變量指定。 例如,$server_addr變量傳遞接受請(qǐng)求的網(wǎng)絡(luò)接口的IP地址:
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
}