浅析Nginx 正向代理与反向代理
1、正向代理和反向代理的概念
無論是正向代理,還是反向代理,說到底,就是代理模式的衍生版本罷了。我們都學(xué)習(xí)過代理設(shè)計模式,都知道代理模式中有代理角色和被代理角色,為什么這么說,因為這兩個角色對于我們理解正向和反向代理非常重要,下面會講到。
下面我將引入這樣一個場景,很多時候我們上網(wǎng)的網(wǎng)速特別慢,或者說由于×××問題導(dǎo)致我們無法訪問到國外的網(wǎng)站,通常這些情況我們會通過給瀏覽器配置一個網(wǎng)速快的、可以×××的代理ip及端口號來解決我們的問題,那么配置好之后,大概的請求流程如下圖所示:
我們首先請求代理服務(wù)器,然后代理服務(wù)器幫我們?nèi)タ焖僭L問國外的網(wǎng)站,對于這種代理方式,我們就稱之為正向代理。請記住,上面說到代理模式的兩個角色中,我們當(dāng)前的角色為 被代理者,也就是瀏覽器這個角色。更重要的是,正向代理的本質(zhì)是我們?nèi)フ埱笸獠康馁Y源,如果以生產(chǎn)者、消費者模式來區(qū)分,我們屬于消費者。
總結(jié):
1、正向代理,我們的角色是 被代理者
2、正向代理,我們不對外提供服務(wù),反而是對外消費服務(wù),屬于消費者
反向代理,很顯然,就是和正向代理相反,如果說正向代理是男,那么反向代理就是女了,親,此處不再糾結(jié)其他情況!下面我用一副圖片解釋下反向代理:
看完上面的圖片,請你想象一下這么一個場景,假設(shè)你現(xiàn)在是某公司技術(shù)總監(jiān),你們公司需要對外提供一套web服務(wù),那么你打算怎么做呢?
答案是可以通過反向代理來完成。通常你們公司擁有自己的IDC機房,機房通訊通常采用局域網(wǎng)交換機,internet網(wǎng)用戶請求是無法直接訪問到局域網(wǎng)內(nèi)的web服務(wù)的,因此這個時候,你需要一臺反向代理服務(wù)器來接收internet web請求,然后將請求分發(fā)到局域網(wǎng)中的不同主機上進(jìn)行處理,處理完成之后再做出響應(yīng)。因此,反向代理大概就是這么一個場景。請記住,反向代理中,我們的角色是 局域網(wǎng) web服務(wù)。
總結(jié):
1、反向代理,我們的角色是 局域網(wǎng) web服務(wù)
2、反向代理,我們對外提供服務(wù),屬于服務(wù)提供者
2、nginx正向代理和反向代理實例解析
nginx在正向代理方面的應(yīng)用非常地少,因此,對于正向代理的相關(guān)配置指令也不多,下面是一個nginx作為正向代理服務(wù)器的配置實例,配置僅供參考。
server {
resolver 192.168.1.1; #指定DNS服務(wù)器IP地址
listen 8080;
location / {
proxy_pass http://$http_host$request_uri; #設(shè)定代理服務(wù)器的協(xié)議和地址
}
}
解釋下上面的指令,resolver配置DNS服務(wù)器的ip地址,可以配置多個。你可能會問,正向代理中為什么需要配置DNS服務(wù)器的ip地址呢?其實答案很簡單,你想象下假如現(xiàn)在你的瀏覽器配置了正向代理服務(wù)器,你現(xiàn)在在瀏覽器中輸入網(wǎng)頁鏈接,根據(jù)正向代理原理,該url請求將會被正向代理服務(wù)器執(zhí)行,問題來了,如果你的代理服務(wù)器不配置DNS解析服務(wù),nginx怎么知道你這個oneSite.cn到底是個什么鬼,到底對應(yīng)因特網(wǎng)的ip地址是什么?所以這就是需要配置resolver指令的原因所在。
listen指令配置nginx監(jiān)聽瀏覽器請求的端口號。
proxy_pass指令配置接收到被代理瀏覽器發(fā)來的請求之后,需要幫忙執(zhí)行的請求是什么,$http_host$request_uri指明目的主機和uri,屬于nginx變量,一般不需要修改。
nginx反向代理的相關(guān)配置如下,在這里小編搭建兩個Spring boot小demo模擬上面反向代理的web服務(wù),相關(guān)源代碼可以在github獲取。
demo工程啟動端口號為8081,demo1工程啟動端口為8082,對于所有的請求前綴帶/demo的都將轉(zhuǎn)發(fā)到demo工程進(jìn)行處理,對于所有的請求前綴帶/demo1的都將轉(zhuǎn)發(fā)到demo1工程進(jìn)行處理。
nginx配置如下:
server {
listen 80;
location /demo {
proxy_pass 網(wǎng)頁鏈接
}
location /demo1 {
proxy_pass 網(wǎng)頁鏈接
}
}
啟動demo和demo1兩個工程之后,瀏覽器輸入下面地址:
可以看到,外部統(tǒng)一使用80端口訪問服務(wù)時,nginx根據(jù)路徑前綴進(jìn)行代理,然后返回執(zhí)行結(jié)果。對于nginx反向代理路徑配置有幾點需要注意,使用時要非常謹(jǐn)慎。
上面proxy_pass指令配置的url為網(wǎng)頁鏈接,注意在該url后面不能使用/demo1后綴進(jìn)行代替,否則就報錯了。為什么呢?首先nginx會判斷proxy_pass指令中配置的url地址是否包含uri,如果在proxy_pass指令中配置的url地址不包含uri,那么nginx將會使用請求路徑的uri進(jìn)行轉(zhuǎn)發(fā),如果在proxy_pass指令中配置的url地址包含uri,則nginx會忽略請求location中的uri,轉(zhuǎn)而使用你在proxy_pass中配置的uri進(jìn)行覆蓋,轉(zhuǎn)發(fā),另外,/也是一種uri,哈哈,要特別小心哈~
舉例子:
假設(shè)請求地址為:http://localhost/demo/getServerInfo.json,location配置為/demo,proxy_pass配置為http://xxxx:port,則會使用http://xxxx:port/demo/getServerInfo.json進(jìn)行轉(zhuǎn)發(fā),結(jié)果正確。如果proxy_pass配置為http://xxxx:port/demo1,則會使用http://xxxx:port/demo1進(jìn)行轉(zhuǎn)發(fā),因為/demo1覆蓋了/demo
歡迎工作一到五年的Java工程師朋友們加入Java高級交流群:854630135
群內(nèi)提供免費的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
哦對了,喜歡就別忘了關(guān)注一下哦~
轉(zhuǎn)載于:https://blog.51cto.com/13954634/2294223
總結(jié)
以上是生活随笔為你收集整理的浅析Nginx 正向代理与反向代理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF圆角按钮与触发颜色变化
- 下一篇: Centos7+Nginx+Keepal