事情是這樣的
一個前背景分離的項目,前台使用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 位址代理)。
如有錯誤,敬請指正。