新聞中心
代理通常用于分發(fā)負(fù)載給多個(gè)服務(wù)器,從不同網(wǎng)站無(wú)縫顯示內(nèi)容,傳遞請(qǐng)求給能處理HTTP之外的應(yīng)用服務(wù)器。
當(dāng)Nginx代理請(qǐng)求時(shí),它發(fā)送請(qǐng)求給一個(gè)特定的代理服務(wù)器,獲取響應(yīng),并返回給客戶端。它可以為
HTTP服務(wù)器(其它Nginx服務(wù)器或任意其它服務(wù)器)代理請(qǐng)求或一個(gè)使用特殊協(xié)議的非HTTP服務(wù)器
(可以運(yùn)行一個(gè)使用特定框架開發(fā)的應(yīng)用,例如PHP或Python)。支持協(xié)議包括FastCGI、uwsgi、
SCGI和memcached。
為了傳遞請(qǐng)求給HTTP代理服務(wù)器,在location指令中指定proxy_pass指令:
location /some/path/ {
proxy_passhttp://www.example.com/link/;
}
該例子導(dǎo)致傳遞該location中的所有請(qǐng)求給指定地址的代理服務(wù)器。該地址可以指定為域名或IP
地址。地址也可以包括端口:
location ~ .php {
proxy_pass http://127.0.0.1:8000;
}
注意,上面的第一個(gè)例子,代理服務(wù)器的地址后面跟隨一個(gè)URI /link/。如果指定URI地址,它替
換匹配location參數(shù)的請(qǐng)求URI部分。例如,請(qǐng)求URI /some/path/page.html將代理到http:
//www.example.com/link/page.html。如果地址沒有指定URI,或不可能決定URI部分替
換,完整URI被傳遞(可能,修改)。
為了傳遞一個(gè)請(qǐng)求到非HTTP代理服務(wù)器,合適的**_pass指令應(yīng)該被使用:
fastcgi_pass傳遞一個(gè)請(qǐng)求給FastGGI服務(wù)器。
uwsgi_pass傳遞一個(gè)請(qǐng)求給一個(gè)uwsgi服務(wù)器。
scgi_pass傳遞一個(gè)請(qǐng)求個(gè)SCGI服務(wù)器。
memcached_pass傳遞一個(gè)請(qǐng)求給memcached服務(wù)器。
注意,在這些例子中,指定地址的規(guī)則可能有些不同。你也可能需要傳遞額外參數(shù)給服務(wù)器。
proxy_pass指令也能指向服務(wù)器組的名稱。在這種情況下,請(qǐng)求根據(jù)指定的方法分發(fā)請(qǐng)求給組中
的服務(wù)器。
2 傳遞請(qǐng)求頭默認(rèn),Nginx在代理請(qǐng)求中重新定義兩個(gè)頭字段,“Host”和“Connection”,消除頭字段的值
為空字符串。“Host”設(shè)置為$proxy_host變量,而“Connection”設(shè)置為close。
為了改變這些設(shè)置,以及修改其它頭字段,使用proxy_set_header指令。該指令能指定在
location或更高級(jí)別。它也能指定在特定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ù)器,設(shè)置它為空字符串即可:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
3 配置緩存默認(rèn),Nginx緩存代理服務(wù)器的響應(yīng)。響應(yīng)被存儲(chǔ)在內(nèi)部緩存中,直到整個(gè)響應(yīng)接收完成才會(huì)發(fā)
送給客戶端。緩存有助于優(yōu)化緩慢客戶端的性能,如果響應(yīng)從Nginx同步到客戶端會(huì)浪費(fèi)代理服
務(wù)器的時(shí)間。然而,當(dāng)緩存被啟用,Nginx允許代理服務(wù)器快速處理響應(yīng),當(dāng)客戶端需要下
載,Nginx用盡可能多的時(shí)間存儲(chǔ)響應(yīng)。
負(fù)責(zé)啟用和禁用緩存的指令是proxy_buffering。默認(rèn)設(shè)置為on,啟用緩存。
proxy_buffers指令控制分配給請(qǐng)求的緩存大小和數(shù)量。來(lái)自代理服務(wù)器響應(yīng)的第一部分存儲(chǔ)在
單獨(dú)的緩存中,使用proxy_buffer_size指令設(shè)置。這通常包含比較小的響應(yīng)頭和能比響應(yīng)剩下
部分的緩存小。
在下面的例子中,緩存的默認(rèn)書增加并且響應(yīng)的第一部分緩存大小比默認(rèn)值小。
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
如果緩存禁用,當(dāng)從代理服務(wù)器接收響應(yīng)時(shí)同步發(fā)送給客戶端。這種盡快和客戶端交互的行為是
可取的。
為了在特定location中禁用緩存,在location中設(shè)置proxy_buffering指令為off:
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在這種情況下,Nginx只使用proxy_buffer_size配置緩存存儲(chǔ)響應(yīng)當(dāng)前的一部分。
4 選擇流出IP地址如果你的代理服務(wù)器有多個(gè)網(wǎng)絡(luò)接口,有時(shí)你可能需要選擇特定源IP地址鏈接到代理服務(wù)器或
upstream。如果代理服務(wù)器在Nginx后面,配置從特定IP網(wǎng)絡(luò)或IP地址范圍接收連接可能是有用
的。
指定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/;
}
標(biāo)題名稱:Nginx反向代理
文章位置:http://fisionsoft.com.cn/article/cpodci.html