nginx模塊之ngx_http_proxy_module和ngx_http_headers_module模塊

前言

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;
        }
}
客戶端訪問(wèn)情況

- 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;

}
HTTP報(bào)文的expires字段

關(guān)于ngx_http_proxy_module和ngx_http_headers_module模塊的其他可用指令可參考鏈接:http://nginx.org/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市号显,隨后出現(xiàn)的幾起案子臭猜,更是在濱河造成了極大的恐慌,老刑警劉巖押蚤,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑歌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡揽碘,警方通過(guò)查閱死者的電腦和手機(jī)次屠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雳刺,“玉大人劫灶,你說(shuō)我怎么就攤上這事∫磋耄” “怎么了本昏?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)枪汪。 經(jīng)常有香客問(wèn)我涌穆,道長(zhǎng)怔昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任宿稀,我火速辦了婚禮趁舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝沸。我一直安慰自己赫编,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布奋隶。 她就那樣靜靜地躺著,像睡著了一般悦荒。 火紅的嫁衣襯著肌膚如雪唯欣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天搬味,我揣著相機(jī)與錄音境氢,去河邊找鬼。 笑死碰纬,一個(gè)胖子當(dāng)著我的面吹牛萍聊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦析,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼寿桨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了强戴?” 一聲冷哼從身側(cè)響起亭螟,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骑歹,沒(méi)想到半個(gè)月后预烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡道媚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年扁掸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最域。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谴分,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羡宙,到底是詐尸還是另有隱情狸剃,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布狗热,位于F島的核電站钞馁,受9級(jí)特大地震影響虑省,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僧凰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一探颈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧训措,春花似錦伪节、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呀闻,卻和暖如春化借,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捡多。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蓖康, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垒手。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓蒜焊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親科贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泳梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)榜掌,斷路器鸭丛,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • Nginx簡(jiǎn)介 解決基于進(jìn)程模型產(chǎn)生的C10K問(wèn)題,請(qǐng)求時(shí)即使無(wú)狀態(tài)連接如web服務(wù)都無(wú)法達(dá)到并發(fā)響應(yīng)量級(jí)一萬(wàn)的現(xiàn)...
    魏鎮(zhèn)坪閱讀 2,005評(píng)論 0 9
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一、I/O模型 (一)I/...
    哈嘍別樣閱讀 895評(píng)論 0 4
  • 1.簡(jiǎn)介: ? Nginx:engine X 唐责,2002年鳞溉,開源,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,868評(píng)論 0 3
  • 各位大大們,你們都知道這個(gè)消息了吧朴恳! http://bbs.haier.com/forum/food/859802...
    天天愛分享的最新資訊閱讀 349評(píng)論 0 1