Nginx正向代理與反向代理

1、介紹

實踐中客戶端沒法直接跟服務端發起請求的時候,咱們就須要代理服務。代理能夠實現客戶端與服務端之間的通訊,咱們的Nginx也能夠實現相應的代理服務。代理分爲正向代理和反向代理,此文就來演示一下Nginx配置正向代理和反向代理的場景。html


2、正向代理和反向代理的區別

正向代理和反向代理的區別我在知乎上找到兩張圖能夠幫助咱們很好的理解:python


 
 

 
 
正向代理:客戶端 <一> 代理 一>服務端

正向代理簡單地打個租房的比方:nginx

A(客戶端)想租C(服務端)的房子,可是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子因此你找了B(代理)幫忙租到了這個房子。瀏覽器

這個過程當中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。服務器

反向代理:客戶端 一>代理 <一> 服務端

反向代理也用一個租房的例子:網絡

A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)纔是房東。
B(代理)是中介把這個房子租給了A(客戶端)。app

這個過程當中A(客戶端)並不知道這個房子到底誰纔是房東
他都有可能認爲這個房子就是B(代理)的spa

由上的例子和圖咱們能夠知道正向代理和反向代理的區別在於代理的對象不同,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。3d

3、Nginx代理的配置演示

一、正向代理配置場景演示

正向代理很常見,咱們的***就是一種正向代理。
咱們接下來演示正向代理的這麼一個場景。
首先我在個人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
添加 resolverproxy_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拿了他的資源,並不知道客戶端拿到。

 

二、反向代理配置場景演示

反向代理的演示更爲簡單一些。
首先在/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端口下配置的資源內容。

4、總結

由上的打比方和演示例子能夠體會到正向代理與反向代理的區別和Nginx正向代理和反向代理的簡單配置。正向代理和反向代理的區別上邊也說過在於代理的對象不同,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。
最後一句話總結此文就是
代理服務器站在客戶端那邊就是正向代理,
代理服務器站在原始服務器那邊就是反向代理,
Nginx經過proxy_pass能夠設置代理服務。

做者:唐龍隆 連接:https://www.jianshu.com/p/ae76c223c6ef 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索