事情是這樣的
一個前后台分離的項目,前台使用nginx發布端口為7701,后台使用tomcat發布端口為7702。在前台js中進行 Ajax 對后台請求。這台服務器是內網,於是把7701的端口映射成外網地址假設為(network:8808),那么可以通過外網連接外網地址訪問到7701的前台頁面。此時外網並不能做后台的網路訪問請求,因為7702的端口地址,外網無法訪問。
我們該如何解決
更改前台7701的 nginx.config 的配置,利用 nginx 的反向代理,將后台 7702 的地址也放到 7701 的端口下,即訪問的 7702 變成 7701/api(api名字可以自己指定)。然后將前端 js 請求后台的base地址改成( network:8808/api )
server {
listen 7701;
server_name 192.168.0.67;
location ^~/service { proxy_pass http://192.168.0.67:7702/; }
location / {
root D:\dist\app;
index index.html;
}
}
學習內容
nginx 反向代理,那么反向代理到底是什么
知乎精辟 :正向代理就是隱藏真實的客戶端,反向代理就是隱藏真實的服務端。(其實也不是每個人都能理解這句話的,比如我剛開始看到的時候。)
參考博客 : https://segmentfault.com/q/1010000003491873
博客摘要 :
A 找 B 直接溝通,這就等於沒有什么代理;
然而中間夾一個傳話的 C,C 就是代理了,A 通過 C 把信息傳遞給 B,然后 C 再把 B 的反饋轉達給 A。
在這個過程中,A 知道溝通的直接目標是 B,只不過由於各種原因無法直接和 B 面對面,需要中間人 C,這就是所謂“正向代理”,其實我們很少說正向代理,在英文原文里,這個叫 Forward Proxy,一般就直接叫代理,你翻譯成“轉交代理”或“傳達代理”都比“正向代理”強,然而沒必要,因為代理這個詞的本意就是如此。
另外一種情況則是:A 並不知道 B 的存在,它只知道找 C 就可以得到想要的回復,對於 A 來說有沒有 B 或者有多少個 B、D、E、F……都不重要,只要有 C 就夠了。而 C 則根據情況去獲取反饋然后響應給 A。
這種就叫反向代理了。理解其中的區別不要從“正反”兩個反義方向詞上做文章,英文里的 Forward 和 Reverse 並不是一對反義詞,Forward 和 Backward 才是,然而 Reverse 和 Backward 並不是一個意思……所以說技術書籍資料還就是得看原文的啊。
Forward Proxy(代理)
我想訪問 www.google.com,然而大家都知道它被牆了,我沒法直接訪問它。於是我連接了一個 VPN 服務並設定其為本地 HTTP 訪問的代理(比如說在 Mac 下勾選“通過 VPN 連接發送所有流量),然后我再訪問 www.google.com,此時我的請求被該 VPN 服務代理了,它幫我訪問了 www.google.com 然后把結果返回給我。
這個例子是代理的一種應用場景,但並非代表代理只能用於這個
最重要的特征是我知道 www.google.com 的存在,而且我訪問的網址也的確是 www.google.com,只不過我的訪問請求經由了 VPN 代理來轉交,同樣響應也是如此
在本例中,代理是透明的,用戶有可能不知道它的存在(通常是知道的,只不過代理的設置可能不是他自己來做)
Reverse Proxy(反向代理)
我有一個 Nginx 服務部署在 www.mysite.com 的 80 端口,用戶訪問它就可以看見我做的網站;在我的網站中有一些 Ajax 請求去獲取 JSON 數據,然而提供這些數據的 API Service 部署在服務器上的 8000 端口,該端口由於防火牆的阻撓使得用戶無法直接訪問到。
於是我重新配置了 Nginx,讓它把所有經由 :80/api/ 的訪問請求都代理給 localhost:8000,然后把響應返回給原始的請求方(即:Origin Host),這就是反向代理。現在我的用戶可以正常訪問 www.mysite.com 啦。
同上,這是反向代理的一種應用場景,但並非代表它只能這樣用
最重要的特征是我的用戶壓根不知道 localhost:8000 這個服務的存在,並且即使知道也訪問不到——開 VPN 也訪問不到,這是倆碼事!
對於用戶來講,唯一的“對話”方只有 www.mysite.com(80 端口),他們不知道也不必知道后面發生了什么
個人總結:
正向代理在客戶端做代理(比如瀏覽器設置代理服務器),反向代理就是在服務端做代理(比如上方我把 7702 服務端的地址用了 7701/api 地址代理)。
如有錯誤,敬請指正。