Nginx代理的幾種模式


Nginx代理的幾種模式

目錄

一、正向代理(Forward Proxy)
二、反向代理(reverse proxy)
三、透明代理

 

轉載自一位大佬

  通常我們都知道Nginx性能很高,尤其是作為一個代理服務器,因為它用的是epoll模型,就比如Python Django Web的性能不行,我們可能就會在前端加一個nginx代理,從而提高總體的處理性能問題,代理服務技術是在互聯網早期就出現被使用的。一般實現代理技術的方式就是在服務器上安裝代理服務軟件,讓其成為一個代理服務器,從而實現代理技術。常用的代理技術分為正向代理、反向代理和透明代理。

 

一、正向代理(Forward Proxy)

一般情況下,如果沒有特別說明,代理技術默認說的是正向代理技術。

  正向代理(forward)是一個位於客戶端 【用戶A】和原始服務器(origin server)【服務器B】之間的服務器【代理服務器Z】,為了從原始服務器取得內容,用戶A向代理服務器Z發送一個請求並指定目標(服務器B),然后代理服務器Z向服務器B轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理,如下圖所示:

 

 

從上圖看,所謂的正向代理就是代理服務器【Z】替代訪問方【用戶A】去訪問目標服務器【服務器B】。

下面就是正向代理的意義以及場景

1、用戶訪問本來無法訪問的服務器B的資源

 

 

假設最初用戶A要訪問服務器B需要經過R1和R2路由器這樣一個路由節點,如果路由器R1或者路由器R2發生故障,那么就無法訪問服務器B了。但是如果用戶A讓代理服務器Z去代替自己訪問服務器B,由於代理服務器Z沒有在路由器R1或R2節點中,而是通過其它的路由節點訪問服務器B,那么用戶A就可以得到服務器B的數據了。
現實中的例子就是“FQ”。不過自從VPN技術被廣泛應用外,“FQ”不但使用了傳統的正向代理技術,有的還使用了VPN技術。例如IP-SECT動態vpn技術等

2.加速訪問服務器B資源

  這種說法目前不像以前那么流行了,主要是帶寬流量的飛速發展。早期的正向代理中,很多人使用正向代理就是提速。
還是如圖2假設用戶A到服務器B,經過R1路由器和R2路由器,而R1到R2路由器的鏈路是一個低帶寬鏈路。而用戶A到代理服務器Z,從代理服務器Z到服務器B都是高帶寬鏈路。那么很顯然就可以加速訪問服務器B了。

3.Cache作用

 

 Cache(緩存)技術和代理服務技術是緊密聯系的(不光是正向代理,反向代理也使用了Cache(緩存)技術。如上圖所示,如果在用戶A訪問服務器B某數據F之前,已經有人通過代理服務器Z訪問過服務器B上得數據F,那么代理服務器Z會把數據F保存一段時間,如果有人正好取該數據F,那么代理服務器Z不再訪問服務器B,而把緩存的數據F直接發給用戶A。這一技術在Cache中術語就叫Cache命中。如果有更多的像用戶A的用戶來訪問代理服務器Z,那么這些用戶都可以直接從代理服務器Z中取得數據F,而不用千里迢迢的去服務器B下載數據了。

4.客戶端訪問授權

這方面的內容現今使用的還是比較多的,例如一些公司采用ISA Server做為正向代理服務器來授權用戶是否有權限訪問互聯網,如下圖所示:

 

 如上圖防火牆作為網關,用來過濾外網對其的訪問。假設用戶A和用戶B都設置了代理服務器,用戶A允許訪問互聯網,而用戶B不允許訪問互聯網(這個在代理服務器Z上做限制)這樣用戶A因為授權,可以通過代理服務器訪問到服務器B,而用戶B因為沒有被代理服務器Z授權,所以訪問服務器B時,數據包會被直接丟棄。

5.隱藏訪問者的行蹤

如下圖所示,我們可以看出服務器B並不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器B進行交互。如果代理服務器Z被用戶A完全控制(或不完全控制),會慣以“肉雞”術語稱呼。

 

 

總結:

  正向代理是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的IP地址,還有代理程序的端口。

Nginx正向代理配置示例如下:

server{
        resolver 8.8.8.8;
        resolver_timeout 30s; 
        listen 82;
        location / {
                proxy_pass http://$http_host$request_uri;
                proxy_set_header Host $http_host;
                proxy_buffers 256 4k;
                proxy_max_temp_file_size 0;
                proxy_connect_timeout 30;
                proxy_cache_valid 200 302 10m;
                proxy_cache_valid 301 1h;
                proxy_cache_valid any 1m;
        }
}
1、不能有hostname。 
2、必須有resolver, 即dns,即上面的8.8.8.8,超時時間(30秒)可選。 
3、配置正向代理參數,均是由 Nginx 變量組成。
proxy_pass $scheme://$host$request_uri;  
proxy_set_header Host $http_host;  
4、配置緩存大小,關閉磁盤緩存讀寫減少I/O,以及代理連接超時時間。
proxy_buffers 256 4k;  
proxy_max_temp_file_size 0;  
proxy_connect_timeout 30;  
5、配置代理服務器 Http 狀態緩存時間。
proxy_cache_valid 200 302 10m;  
proxy_cache_valid 301 1h;  
proxy_cache_valid any 1m; 
配置好后,重啟nginx,以瀏覽器為例,要使用這個代理服務器,則只需將瀏覽器代理設置為http://+服務器ip地址+:+82(82是剛剛設置的端口號)即可使用了。

二、反向代理(reverse proxy)

反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。

使用反向代理服務器的作用如下:

1.保護和隱藏原始資源服務器

 

 用戶A始終認為它訪問的是原始服務器B而不是代理服務器Z,但實用際上反向代理服務器接受用戶A的應答,從原始資源服務器B中取得用戶A的需求資源,然后發送給用戶A。由於防火牆的作用,只允許代理服務器Z訪問原始資源服務器B。盡管在這個虛擬的環境下,防火牆和反向代理的共同作用保護了原始資源服務器B,但用戶A並不知情。

2.負載均衡

 

 

當反向代理服務器不止一個的時候,我們甚至可以把它們做成集群,當更多的用戶訪問資源服務器B的時候,讓不同的代理服務器Z(x)去應答不同的用戶,然后發送不同用戶需要的資源。
當然反向代理服務器像正向代理服務器一樣擁有Cache的作用,它可以緩存原始資源服務器B的資源,而不是每次都要向原始資源服務器組請求數據,特別是一些靜態的數據,比如圖片和文件,如果這些反向代理服務器能夠做到和用戶X來自同一個網絡,那么用戶X訪問反向代理服務器X,就會得到很高質量的速度。這正是CDN技術的核心。如下圖所示:

 

 

反向代理結論與正向代理正好相反,對於客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。
基本上,網上做正反向代理的程序很多,能做正向代理的軟件大部分也可以做反向代理。開源軟件中最流行的就是squid,既可以做正向代理,也有很多人用來做反向代理的前端服務器。另外MS ISA也可以用來在Windows平台下做正向代理。反向代理中最主要的實踐就是WEB服務,近些年來最火的就是Nginx了。網上有人說Nginx不能做正向代理,其實是不對的。Nginx也可以做正向代理,不過用的人比較少了。

Nginx反向代理示例:

http {
#    省略了前面一般的配置,直接從負載均衡這里開始
#    設置地址池,后端3台服務器
    upstream http_server_pool {
        server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
        server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
        server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
    }
#    一個虛擬主機,用來反向代理http_server_pool這組服務器
    server {
        listen       80;
#        外網訪問的域名        
        server_name  www.test.com; 
        location / {
#           后端服務器返回500 503 404錯誤,自動請求轉發到upstream池中另一台服務器
            proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
            proxy_pass http://http_server_pool;
            proxy_set_header Host www.test.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
        access_log  logs/www.test.com.access.log  combined;
    }
}
最簡單的反向代理演示(在一台服務器上做代理服務器,將http請求轉發到另一台IIS服務器上,通過二級域名形式訪問。)編輯vim nginx.conf
server {
    listen    80;
    server_name test.zhoumengkang.com;
    location / {
        proxy_pass http://121.199.**.*:80;
    }
}
參考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html

三、透明代理

透明代理的意思是客戶端根本不需要知道有代理服務器的存在,它改編你的request fields(報文),並會傳送真實IP。注意,加密的透明代理則是屬於匿名代理,意思是不用設置使用代理了。
透明代理實踐的例子就是時下很多公司使用的行為管理軟件。如下圖所示:

 

 

 用戶A和用戶B並不知道行為管理設備充當透明代理行為,當用戶A或用戶B向服務器A或服務器B提交請求的時候,透明代理設備根據自身策略攔截並修改用戶A或B的報文,並作為實際的請求方,向服務器A或B發送請求,當接收信息回傳,透明代理再根據自身的設置把允許的報文發回至用戶A或B,如上圖,如果透明代理設置不允許訪問服務器B,那么用戶A或者用戶B就不會得到服務器B的數據。

Nginx透明代理配置示例:

# cat /etc/nginx/sites-enabled/proxy
       server {
                resolver        8.8.8.8;
                access_log      off;
                listen  [::]:8080;
                location / {
                        proxy_pass      $scheme://$host$request_uri;
                        proxy_set_header Host $http_host;
                        proxy_buffers   256 4k;
                        proxy_max_temp_file_size        0k;
                        }
                }
 
iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
RAW Paste Data
# cat /etc/nginx/sites-enabled/proxy
       server {
                resolver        8.8.8.8;
                access_log      off;
                listen  [::]:8080;
                location / {
                        proxy_pass      $scheme://$host$request_uri;
                        proxy_set_header Host $http_host;
                        proxy_buffers   256 4k;
                        proxy_max_temp_file_size        0k;
                        }
                }

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM