天天看點

初識Nginx——前後端釋出、Nginx反向代理

  

事情是這樣的

  一個前背景分離的項目,前台使用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 位址代理)。

如有錯誤,敬請指正。