Nginx正向代理和反向代理

大致的概念

正向代理

代理服務(wù),也稱為正向代理服務(wù)涌攻。
如果把局域網(wǎng)外Internet想象成一個巨大的資源庫现横,那么資源就分布在Internet的各個站點上,局域網(wǎng)內(nèi)的客戶端要訪問這個庫里的資源必須統(tǒng)一通過代理服務(wù)器才能對各個站點進行訪問壳影。
也就是說正向代理服務(wù)器不支持外部對內(nèi)部網(wǎng)絡(luò)的訪問請求。

反向代理

與正向代理相反弥臼,如果局域網(wǎng)向Internet提供資源宴咧,讓Internet上的其他用戶可以訪問局域網(wǎng)內(nèi)的資源,也可以設(shè)置使用一個代理服務(wù)器径缅,它提供的服務(wù)就叫反向代理服務(wù)掺栅。

總結(jié):

正向代理服務(wù)器用來讓局域網(wǎng)客戶機接入外網(wǎng)以訪問外網(wǎng)資源,反向代理服務(wù)器用來讓外網(wǎng)的客戶端接入局域網(wǎng)中的站點以訪問點中的資源纳猪。

Nginx配置正向代理

配置指令

resolver 指令:指定DNS服務(wù)器的IP地址氧卧。

resolver address ... [valid=time]

參數(shù)解析:
address : DNS服務(wù)器的IP地址。如果不指定端口號氏堤,默認使用53端口沙绝。
time : 設(shè)置數(shù)據(jù)包在網(wǎng)絡(luò)中的有效時間。這個命令的主要原因是,在訪問站點時闪檬,有很多情況使得數(shù)據(jù)包在一定時間內(nèi)不能被傳遞到目的地星著,但是又不能讓該數(shù)據(jù)包無限制的存在,于是就需要設(shè)定一段時間粗悯,當(dāng)數(shù)據(jù)包在這段時間內(nèi)沒有到達目的地虚循,就會被丟棄,然后發(fā)送者會接收到一個消息为黎,并決定是否要重發(fā)該數(shù)據(jù)包邮丰。

例子:

resolver 127.0.0.1 [::1]:5353 valid=30s

resolver_timeout 指令:該指令用于設(shè)置DNS服務(wù)器域名解析超時時間。

resolver_timeout 30s;

proxy_pass 指令:該指令用于設(shè)置代理服務(wù)器的協(xié)議和地址铭乾,它不僅僅用于Nginx服務(wù)器的代理服務(wù)剪廉,更主要用于反向代理。

proxy_pass http://$http_host$request_uri;

正向代理配置例子:

...
server {
    resolver 8.8.8.8;
    listen 82;
    location / {
        proxy_pass proxy_pass http://$http_host$request_uri;
    }

}
...

注意:server塊中 不要設(shè)置 server_name 指令炕檩,既不要設(shè)置虛擬主機的名稱或者IP斗蒋。但是resolver 指令是必須的,如果沒有這個指令笛质,Nginx服務(wù)器無法處理接收到的域名泉沾。

Nginx反向代理配置

配置指令

1. proxy_pass 指令:用來設(shè)置被代理服務(wù)器的地址,包括傳輸協(xié)議妇押、主機名稱或者IP地址加端口號跷究、URI等要素。還可以接受以“unix”開始的UNIX-domain套接字路徑敲霍。

proxy_pass http://www.xxx.com/uri;
proxy_pass http://localhost:8080/uri;
proxy_pass http://unix:/tmp/backend.socket:/uri/;

代理一組服務(wù)器例子:

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
    # server http://192.168.1.3:8001/uri/;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;
   } 
}
.....

注意:使用這個 proxy_pass 指令的時候俊马,如果代理的URL中是否包含了URI,Nginx服務(wù)器處理方式都不相同肩杈。如果URL中不包含URI柴我,Nginx服務(wù)器不會改變原地址的URI;但是如果包含了URI扩然,Nginx服務(wù)器將會使用新的URI代替原來的URI艘儒。
看下面例子:

比如指定了URI

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass http://192.168.1.1:8001/loc/;
   } 
}

那么請求 “http://www.my.com/server/” 發(fā)起請求,夫偶,Nginx服務(wù)器會把地址轉(zhuǎn)向 "http://192.168.1.1:8001/loc/" 就把 "/server/" 替換掉為 "/loc/"

比如沒有指定了URI

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass http://192.168.1.1:8001;
   } 
}

那么請求 “http://www.my.com/server” 發(fā)起請求界睁,,Nginx服務(wù)器會把地址轉(zhuǎn)向 "http://192.168.1.1:8001/server", 原有的URI不變

proxy_pass 指令的URL末尾是否加 "/" 的問題:

#配置1 
proxy_pass http://192.168.1.1;
#配置2 
proxy_pass http://192.168.1.1/;

測試實例1:

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      #配置1 
      proxy_pass http://192.168.1.1;
      #配置2 
      proxy_pass http://192.168.1.1/;
   } 
}

在這個配置中 localhost 塊使用 "/" 作為 uri 變量的值來匹配不包含URI的請求URL索守。由于請求URL中不包含URI晕窑,因此配置1 和 配置 2 的效果一樣。比如 "http://www.myweb.com/index.html"卵佛,配置1 和 配置2 都會轉(zhuǎn)向到 "http://192.168.1.1/index.html"

測試實例2:

server {
   ...
   listen 80;
   server_name www.myweb.com;
   location /server/ {
      #配置1 
      proxy_pass http://192.168.1.1;
      #配置2 
      proxy_pass http://192.168.1.1/;
   } 
}

在這個配置中,localhost塊使用 “/server/” 作為 uri 變量的值來匹配包含URI “/server/” 的請求URL。
這時候使用配置1 和 配置2 的轉(zhuǎn)向結(jié)果就不一樣了截汪。使用配置1的時候疾牲,不會改變原地址的URI;使用配置2的時候衙解,proxy_pass 指令中的URI變量包含了URI “/”阳柔,Nginx服務(wù)器就會將原地址的URI替換為“/”.
比如 "http://www.myweb.com/server/index.html",使用配置2的時候蚓峦,會轉(zhuǎn)向到 "http://192.168.1.1/index.html"舌剂,原地址的 /server/ 會被替換掉!

proxy_pass 在上面所述的替換URI的問題, 所替換的URI是針對 localhost 匹配的URI替換暑椰。

比如:
配置

localhost /server/ { 
  proxy_pass http://127.0.0.1:8080/ 
}

那么請求 http://www.xxxx.com/server/name/index.html 的時候霍转,只會把 /server/ 給 截斷/替換 掉,不會把 /name 給 截斷/替換 掉一汽!最終 http://www.xxxx.com/server/name/index.html 變成 http://127.0.0.1:8080/name/index.html

2. proxy_hide_header 指令:該指令用于設(shè)置Nginx在發(fā)送HTTP響應(yīng)時避消,隱藏一些頭域信息。
該指令可用于 http塊召夹、server塊或者localhost塊

proxy_hide_header field;

3. proxy_pass_header 指令:默認情況下岩喷,Nginx服務(wù)器發(fā)送響應(yīng)報文時,報文頭信息中不包含 "Date"监憎、"Server"纱意、"X-Accel"等來自被代理服務(wù)器的頭域信息。該指令可以設(shè)置這些頭域信息以被發(fā)送鲸阔。

proxy_pass_header field;

4. proxy_pass_request_body 指令:用于配置是否將客戶端請求的請求頭發(fā)送給代理服務(wù)器偷霉。

proxy_pass_request_body on | off;

默認設(shè)置為開啟(on),可以在http塊隶债、server塊或者location塊中進行配置腾它。

5. proxy_pass_request_headers 指令:指令用于配置是否將客戶端請求的請求頭發(fā)送給代理服務(wù)器。

proxy_pass_request_headers on | off;

默認設(shè)置為開啟(on)死讹,開關(guān)可以在http塊瞒滴、server塊或者localhost塊中進行配置。

6. proxy_set_header 指令:指令可以更改Nginx服務(wù)器接收到的客戶端請求的請求頭信息赞警,然后將新的請求頭發(fā)送給被代理的服務(wù)器妓忍。

proxy_set_header field value;

field 要更改的信息所在的頭域
value 更改的值

默認情況下,該指令的設(shè)置為:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

例子:

proxy_set_header Host $http_host; # 將目前Host頭域的值填充成客戶端的地址
proxy_set_header Host $host; # 將目前l(fā)ocaltion 塊的 server_name指令值填充到Host頭域
proxy_set_header Host $host:$proxy_port; # 將目前l(fā)ocaltion 塊的 server_name指令值和listener指令值填充到Host頭域

7.proxy_set_body 指令 :可以更改Nginx服務(wù)器接收到的客戶端請求的請求體信息愧旦,然后將新的請求體發(fā)送給被代理的服務(wù)器世剖。

proxy_set_body value;

value 支持使用文本、變量或者變量的組合

8.proxy_bind 指令 :強制將與代理主機的連接綁定到指定的IP地址笤虫。通俗來講就是旁瘫,在配置了多個基于名稱或者基于IP的主機的情況下祖凫,如果我們希望代理連接由指定的主機處理,就可以使用這個配置酬凳。

proxy_bind  address;

address 為主機的IP地址
注意:Nginx 版本在0.8.22 及 以上支持該指令惠况。

9.proxy_connect_timeout 指令:指令配置Nginx服務(wù)器與后端被代理服務(wù)器嘗試建立連接的超時時間。

proxy_connect_timeout time;

time 為設(shè)置的超時時間宁仔,默認為 60s

10.proxy_read_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出read請求后稠屠,等待響應(yīng)的超時時間。

proxy_read_timeout time;

time 為設(shè)置的超時時間翎苫,默認為 60s

11.proxy_send_timeout指令:指令配置Nginx服務(wù)器向后端被代理服務(wù)器(組)發(fā)出write請求后权埠,等待響應(yīng)的超時時間。

proxy_send_timeouttime;

time 為設(shè)置的超時時間煎谍,默認為 60s

12.proxy_http_version 指令:用于設(shè)置Nginx服務(wù)器提供代理服務(wù)的HTTP協(xié)議版本攘蔽。

proxy_http_version 1.0 | 1.1;

13.proxy_method 指令:用于設(shè)置Nginx服務(wù)器請求被代理服務(wù)器時使用的請求方法,一般為POST 或者 GET粱快。設(shè)置了該指令秩彤,客戶端的請求方法將被忽略。

proxy_method method;

method 的值可以設(shè)置為 POST 或者 GET

14.proxy_ignore_client_abort 指令:用于設(shè)置在客戶端中斷網(wǎng)絡(luò)請求時事哭,Nginx服務(wù)器是否中斷對被代理服務(wù)器的請求漫雷。

proxy_ignore_client_abort on | off;

默認設(shè)置為 off,當(dāng)客戶端中斷網(wǎng)絡(luò)請求時鳍咱,Nginx服務(wù)器中斷對代理服務(wù)器的請求降盹。

可配置的指令太多了,就不一一列出來了谤辜。

均衡負載配置

主要使用proxy_pass指令和upstream指令

配置一:對請求一般輪詢

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    # 默認 weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;

   } 
}
.....

配置二:對請求進行加權(quán)輪詢

.....
# 配置后端服務(wù)器組
upstream my_proxy {
    # 默認weight = 1
    server http://192.168.1.1:8001 weight = 5;
    server http://192.168.1.2:8001 weight = 2;
    server http://192.168.1.4:8001;
}
server {
   ...
   listen 80;
   server_name www.myweb.com;
   location / {
      proxy_pass my_proxy;

   } 
}
.....

配置三:對特定資源實現(xiàn)均衡負載

.....
# 配置后端服務(wù)器組
upstream video_proxy {
    # 默認weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}

# 配置后端服務(wù)器組
upstream file_proxy {
    # 默認weight = 1
    server http://192.168.1.5:8001;
    server http://192.168.1.6:8001;
    server http://192.168.1.7:8001;
}

server {
   ...
   listen 80;
   server_name www.myweb.com;

   # 針對 video 請求
   location /video/ {
      proxy_pass video_proxy;

   } 

   # 針對 file 請求
   location /file/ {
      proxy_pass file_proxy ;

   } 
}
.....

配置四:針對不同域名實現(xiàn)均衡負載

.....
# 配置后端服務(wù)器組
upstream bbs_proxy {
    # 默認weight = 1
    server http://192.168.1.1:8001;
    server http://192.168.1.2:8001;
    server http://192.168.1.4:8001;
}

# 配置后端服務(wù)器組
upstream home_proxy {
    # 默認weight = 1
    server http://192.168.1.5:8001;
    server http://192.168.1.6:8001;
    server http://192.168.1.7:8001;
}

server {
   ...
   listen 80;
   server_name www.myHome.com;

   location / {
      proxy_pass home_proxy;
   } 

}

server {
   ...
   listen 81;
   server_name www.myBbs.com;

   location / {
      proxy_pass bbs_proxy ;
   } 

}
.....

配置五:處理跨域

server {

   listen 81;
   server_name localhost;

   location / {
            proxy_pass http://localhost:8188/;
            # 設(shè)置是否允許 cookie 傳輸
            add_header Access-Control-Allow-Credentials true;
            # 允許請求地址跨域 * 做為通配符
            add_header Access-Control-Allow-Origin * always;
            # 允許跨域的請求方法
            add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

            if ($request_method = 'OPTIONS') {
                return 204;
            }
        }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓄坏,一起剝皮案震驚了整個濱河市漆羔,隨后出現(xiàn)的幾起案子擦剑,更是在濱河造成了極大的恐慌狭吼,老刑警劉巖缴渊,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纲酗,居然都是意外死亡窝趣,警方通過查閱死者的電腦和手機誉裆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門推正,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恍涂,“玉大人,你說我怎么就攤上這事植榕≡俨祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵尊残,是天一觀的道長炒瘸。 經(jīng)常有香客問我淤堵,道長,這世上最難降的妖魔是什么什燕? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任粘勒,我火速辦了婚禮竞端,結(jié)果婚禮上屎即,老公的妹妹穿的比我還像新娘。我一直安慰自己事富,他們只是感情好技俐,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著统台,像睡著了一般雕擂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贱勃,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天井赌,我揣著相機與錄音,去河邊找鬼贵扰。 笑死仇穗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戚绕。 我是一名探鬼主播纹坐,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舞丛!你這毒婦竟也來了耘子?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤球切,失蹤者是張志新(化名)和其女友劉穎谷誓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吨凑,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捍歪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀骤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片费封。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蒋伦,靈堂內(nèi)的尸體忽然破棺而出弓摘,到底是詐尸還是另有隱情,我是刑警寧澤痕届,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布韧献,位于F島的核電站末患,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锤窑。R本人自食惡果不足惜璧针,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渊啰。 院中可真熱鬧探橱,春花似錦、人聲如沸绘证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚷那。三九已至胞枕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魏宽,已是汗流浹背腐泻。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留队询,地道東北人派桩。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像娘摔,于是被迫代替她去往敵國和親窄坦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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