轉載于簡書:https://www.jianshu.com/p/ae76c223c6ef
一、介紹
實踐中用戶端無法直接跟服務端發起請求的時候,我們就需要代理服務。代理可以實作用戶端與服務端之間的通信,我們的Nginx也可以實作相應的代理服務。代理分為正向代理和反向代理,此文就來示範一下Nginx配置正向代理和反向代理的場景。
二、正向代理和反向代理的差別
正向代理和反向代理的差別我在知乎上找到兩張圖可以幫助我們很好的了解:
正向代理:用戶端 <一> 代理 一>服務端
正向代理簡單地打個租房的比方:
A(用戶端)想租C(服務端)的房子,但是A(用戶端)并不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子是以你找了B(代理)幫忙租到了這個房子。
這個過程中C(服務端)不認識A(用戶端)隻認識B(代理)
C(服務端)并不知道A(用戶端)租了房子,隻知道房子租給了B(代理)。
反向代理:用戶端 一>代理 <一> 服務端
反向代理也用一個租房的例子:
A(用戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(用戶端)。
這個過程中A(用戶端)并不知道這個房子到底誰才是房東
他都有可能認為這個房子就是B(代理)的
由上的例子和圖我們可以知道正向代理和反向代理的差別在于代理的對象不一樣,正向代理的代理對象是用戶端,反向代理的代理對象是服務端。
三、Nginx代理的配置示範
1、正向代理配置場景示範
正向代理很常見,我們的科學上網就是一種正向代理。
我們接下來示範正向代理的這麼一個場景。
首先我在我的A伺服器的nginx設定通路控制
通路控制之前我通路A下的test.html是這樣的:
我們打開/etc/nginx/conf.d/default.conf
我們加入這麼一個判斷語句
如果通路A的IP不是118.126.106.11(我的B伺服器)則傳回403.
location / {
if ( $remote_addr !~* "^118\.126\.106\.11") {
return 403;
}
root /opt/app/demo/html;
index index.html index.htm;
}
添加後reload一下nginx再通路test.html:
此時本地我的浏覽器就是被限制了,通路不了該資源。
現在我登入上我的B伺服器,打開/etc/nginx/conf.d/default.conf
添加
resolver
和
proxy_pass
,設定如下:
server {
listen 80;
server_name localhost nginx.tangll.cn;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
resolver
為DNS解析,這裡填寫的IP為Google提供的免費DNS伺服器的IP位址
proxy_pass
配置代理轉發
至此便是配置了B伺服器所有通路根一級的請求全部都代理轉發對應到$http_host$request_uri去了,
$http_host
就是我們要通路的主機名,
$request_uri
就是我們後面所加的參數。
簡單的說至此就是相當于配置好了我們請求了B伺服器,B伺服器再去請求我們所請求的位址。
那麼接下來我們來看一下結果,我們在本地配置好代理,我這裡是mac系統,可以從網絡設定中選擇進階,然後選擇代理
填入我們B伺服器的IP,然後我們來看一下代理是否成功。
我們登入http://www.ip138.com/ 可以看到此時我們的IP位址已經為B伺服器的IP,說明代理成功。
然後我們再來通路一下test.html:
結果證明,此時的用戶端已經可以成功通路A伺服器的資源。
以上就是正向代理的一個場景示範,這個過程中可以知道,我們用戶端是想要A的資源,但是A的資源隻有B能拿到,便讓B代理去幫助我們通路A的資源。整個過程A隻知道B拿了他的資源,并不知道用戶端拿到。
2、反向代理配置場景示範
反向代理的示範更為簡單一些。
首先在/etc/nginx/conf.d/下建立一個test.conf:
server {
listen 8080;
server_name localhost nginx.tangll.cn;
location / {
root /opt/app/demo/html;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
可以看到我server裡listen的是8080端口,但是我的伺服器本身不對外開放8080端口,隻開放了80端口。
是以我們此時通路test.html結果是通路不到的:
然後我們打開我們的/etc/nginx/conf.d/default.conf
添加
proxy_pass
設定如下:
server {
listen 80;
server_name localhost nginx.tangll.cn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#設定代理
#location ~ /test.html$ {
# proxy_pass http://127.0.0.1:8080;
#}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
我們設定當比對test.html結尾的URL時就去代理通路本機的8080端口
為了對比我們先注釋掉,然後直接80端口通路一下test.html:
可以看到此時傳回的404。
這時候取消注釋我們reload一下nginx然後用80端口通路test.html
此時便可通路8080端口配置的資源。
以上便是完成了一個反向代理的示範,這個過程中我們可以知道,用戶端想要通路的是test.html,但是test.html實際上是8080端口下配置的,中間經過了代理才能拿到。也就是說用戶端并不知道中間經曆了什麼代理過程,隻有服務端知道。用戶端隻知道他拿到了test.html也就是8080端口下配置的資源内容。
四、總結
由上的打比方和示範例子可以體會到正向代理與反向代理的差別和Nginx正向代理和反向代理的簡單配置。正向代理和反向代理的差別上邊也說過在于代理的對象不一樣,正向代理的代理對象是用戶端,反向代理的代理對象是服務端。
最後一句話總結此文就是
代理伺服器站在用戶端那邊就是正向代理,
代理伺服器站在原始伺服器那邊就是反向代理,
Nginx通過
可以設定代理服務。
proxy_pass
其他解釋:
什麼是反向代理?
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接配接請求,然後将請求轉發給内部網絡上的伺服器,并将從伺服器上得到的結果傳回給internet上請求連接配接的用戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
反向代理的好處
1、保護了真實的web伺服器,web伺服器對外不可見,外網隻能看到反向代理伺服器,而反向代理伺服器上并沒有真實資料,是以,保證了web伺服器的資源安全。
2、反向代理為基礎産生了動靜資源分離以及負載均衡的方式,減輕web伺服器的負擔,加速了對網站通路速度(動靜資源分離和負載均衡會以後說)
3、節約了有限的IP位址資源,企業内所有的網站共享一個在internet中注冊的IP位址,這些伺服器配置設定私有位址,采用虛拟主機的方式對外提供服務;