前言
nginx服務(wù)也支持代理服務(wù)窿给,其代理功能的實(shí)現(xiàn)是通過(guò)ngx_http_proxy_module此模塊來(lái)實(shí)現(xiàn)的。通常代理服務(wù)分為正向代理和反向代理抚芦。
正向代理:是指服務(wù)器代理請(qǐng)求者的身份訪問(wèn)服務(wù)資源倍谜,通常應(yīng)用于代理上網(wǎng)。
反向代理:指的是代理服務(wù)器接受連接請(qǐng)求叉抡,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器尔崔,并將從服務(wù)器上得到的結(jié)果返回給響應(yīng)的請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器
nginx對(duì)于這兩者都是支持的褥民,其實(shí)現(xiàn)均是使用ngx_http_proxy_module模塊來(lái)實(shí)現(xiàn)季春。那么接著我們就來(lái)一起看看nginx與此模塊相關(guān)的配置指令及示例。
ngx_http_proxy_module模塊
- 1消返、proxy_pass URL;
配置段:location, if in location, limit_except
proxy_pass指令可以說(shuō)是ngx_http_proxy_module模塊的核心指令了载弄,幾乎任何與代理相關(guān)的配置均與此指令相關(guān)。
通常其使用格式類似于:
proxy_pass http://host[:port][/uri];
值得注意的是proxy_pass的路徑后面有沒(méi)有/uri是有區(qū)別的撵颊,當(dāng)proxy_pass后面的路徑不帶uri時(shí)宇攻,其會(huì)將location的uri傳遞給后端主機(jī);如:
server {
...
server_name HOSTNAME;
location /blog/ {
proxy http://10.10.10.10;
}
...
}
上述location的/blog/
會(huì)傳遞給10.10.10.10主機(jī)倡勇,實(shí)際代理訪問(wèn)的位置為http://10.10.10.10/blog/
逞刷。
又如當(dāng)proxy_pass后面的路徑帶有/uri時(shí),其會(huì)將location的uri替換為proxy_pass的uri妻熊,如:
server {
...
server_name www.a.com
location /blog/ {
proxy_pass http://10.10.10.10/news/;
}
...
}
此時(shí)訪問(wèn)http://www.a.com/blog/
實(shí)際上就是訪問(wèn)http://10.10.10.10/news/
夸浅,/blog/
被替換成了/news/
。
此外還要注意點(diǎn)的是如果在location定義uri時(shí)使用了正則表達(dá)式匹配的模式扔役,或在if語(yǔ)句或limt_execept中使用proxy_pass指令帆喇,則proxy_pass之后必須不能使用uri; 用戶請(qǐng)求時(shí)傳遞的uri將直接附加代理到的服務(wù)的之后,如:
location ~* \.(jpg|png|gif)$ {
proxy_pass http://10.10.10.10;
}
- 2、proxy_set_header field value;
配置段:http, server, location
此指令用于設(shè)置發(fā)往后端服務(wù)器的請(qǐng)求報(bào)文的請(qǐng)求首部的值亿胸,如:
將真實(shí)的訪問(wèn)用戶IP送往后端服務(wù)器:
server {
listen 80;
server_name www.ilinux.io;
location /blog/blog.html {
#在代理服務(wù)器上將遠(yuǎn)程客戶端的Ip設(shè)置為X-Real-IP
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://10.10.10.11/news/news.html;
}
}
#在后端服務(wù)器坯钦,設(shè)置access日志的格式法严,將原本的$remote_addr替換為$http_x_real_ip
log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#在測(cè)試訪問(wèn)幾次后,查看后端服務(wù)器的access_log文件即可查看到相應(yīng)的訪問(wèn)客戶端IP
- 3葫笼、proxy_cache_path path;
配置段:http
用于配置代理緩存的路徑及其他參數(shù),其完整使用格式如下:
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
levels參數(shù)定義了cache保留路徑的層次結(jié)構(gòu)拗馒,最多支持三層級(jí)結(jié)構(gòu)路星。levels的值支持1或2,表示以多少個(gè)字符命名層級(jí)目錄诱桂。如levels=1:2:3洋丐,表示緩存路徑為三級(jí)目錄結(jié)構(gòu),其中一級(jí)子目錄以1個(gè)字符命名挥等,二級(jí)子目錄2個(gè)友绝,三級(jí)子目錄3個(gè)。
keys_zone參數(shù)用于定義cache zone的名稱及分配的內(nèi)存大小肝劲,如:keys_zone=cache1:100m迁客。
max_size參數(shù)用于設(shè)置緩存zone的最大容量是多少;
inactive參數(shù)用于設(shè)置這個(gè)zone中的緩存文件如果在指定的時(shí)間內(nèi)都沒(méi)有被訪問(wèn)辞槐,則文件會(huì)被cache manager進(jìn)程刪除掉掷漱。
配置示例:
proxy_cache_path /usr/local/nginx/proxy_cache_dir/cache1 levels=1:2 keys_zone=cache1:100m inactive=1d max_size=10g;
- 4、proxy_cache zone_name | off;
配置段:http, server, location
用于指定要調(diào)用的緩存zone榄檬,或者關(guān)閉緩存機(jī)制卜范。
配置示例:
server {
...
server_name HOSTNAME;
location /uri/ {
proxy http://hos[:port];
proxy_cache cache1;
}
...
}
** - 5、proxy_cache_key string;
**
配置段:http, server, location
用于定義緩存的關(guān)鍵字鹿榜。
配置示例:
proxy_cache_key $scheme$proxy_host$request_uri;
- 6海雪、proxy_cache_valid [code ...] time;
配置段: http, server, location
用于定義對(duì)特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時(shí)長(zhǎng)。
示例:
#對(duì)200,302,301狀態(tài)碼緩存1小時(shí)
proxy_cache_valid 200 302 301 1h;
#對(duì)其他的內(nèi)容緩存1分鐘
proxy_cache_valid any 1m;
- 7舱殿、proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
配置段: http, server, location
用于指定奥裸,當(dāng)后端服務(wù)器出現(xiàn)error,timeout怀薛,http_500等狀況時(shí)刺彩,即使緩存內(nèi)容已過(guò)去返回給用戶。
- 8枝恋、proxy_cache_methods GET | HEAD | POST ...;
配置段: http, server, location
當(dāng)客戶端使用指定的請(qǐng)求方法發(fā)送請(qǐng)求時(shí)创倔,該請(qǐng)求會(huì)被緩存下來(lái)。GET和HEAD是默認(rèn)就被指定的緩存方法焚碌。
- 9畦攘、proxy_hide_header field;
配置段:http, server, location
默認(rèn)情況下,nginx不會(huì)將報(bào)文首部“Date”十电,“Server”等字段從代理服務(wù)器傳遞給客戶端知押。而此指令叹螟,可讓管理員設(shè)置額外的不進(jìn)行傳遞的字段。
- 10台盯、proxy_connect_timeout time;
配置段: http, server, location
定義代理服務(wù)器的連接超時(shí)時(shí)長(zhǎng)罢绽,默認(rèn)為60s,最長(zhǎng)不超過(guò)75s静盅;
- 11良价、proxy_read_timeout time;
配置段: http, server, location、
用于定義nginx會(huì)等待多長(zhǎng)時(shí)間來(lái)獲得請(qǐng)求的響應(yīng)蒿叠。這個(gè)時(shí)間不是獲得整個(gè)response的時(shí)間明垢,而是兩次reading操作的時(shí)間。默認(rèn)為60s市咽。
- 12痊银、proxy_send_timeout time;
配置段:http, server, location
用于定義nginx發(fā)送請(qǐng)求給后端服務(wù)器的超時(shí)時(shí)間。這個(gè)時(shí)間不是獲得整個(gè)response的時(shí)間施绎,而是兩次sending操作的時(shí)間溯革。默認(rèn)為60s。
gx_http_headers_module模塊
此模塊用于在代理服務(wù)器響應(yīng)給客戶端的響應(yīng)報(bào)文中添加自定義首部或修改指定首部的值粘姜。
- 1鬓照、add_header name value [always];
配置段: http, server, location, if in location
用于添加自定首部,如:
server {
listen 80;
server_name www.ilinux.io;
location /blog/blog.html {
proxy_set_header X-Real-IP $remote_addr;
#添加自定義首部X-via表示代理服務(wù)器IP
add_header X-Via $server_addr;
#添加自定義首部X-Accel表示代理服務(wù)器的主機(jī)名
add_header X-Accel $server_name;
proxy_pass http://10.10.10.11/news/news.html;
}
}
- 2孤紧、expires [modified] time;
expires epoch | max | off;
配置段:http, server, location, if in location
此指令用于定義客戶端本地緩存超時(shí)時(shí)間或Cache-Control首部的值豺裆。
示例:
#表示指定路徑上的圖片在客戶端上緩存3天才失效
location ~* \.(gif|jpg|jpeg|png) {
root /var/mywww/html/public/
expires 3d;
}
關(guān)于ngx_http_proxy_module和ngx_http_headers_module模塊的其他可用指令可參考鏈接:http://nginx.org/