正向代理 | 反向代理 | 透明代理

正向代理

正向代理,英文名为Forward Proxy。一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。 正向代理是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的架构图如下:

使用正向代理的原因或优势有:

(1)通过代理服务器可以访问本来无法访问的资源

(2)访问加速

(3)缓存cache

(4)隐藏访问者的行踪

反向代理

反向代理,中文名为Reverse Proxy。反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理发送普通请求,但是反向代理上并没有需要的资源,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

反向代理的架构图如下:

使用反向代理的原因或优势有:

(1)保护和隐藏原始资源服务器

(2)负载均衡

透明代理

透明代理是相当于正向代理而言,透明代理的意思是客户端根本不需要知道有代理服务器的存在。如下为一个生产环境中使用透明代理的例子:

用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。

以Nginx的正向代理和反向代理的配置

(1)nginx正向代理的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
resolver 8.8.8.8;
resolver_timeout 30s;
listen 80;
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;
}
}

这里有resolver配置,即DNS服务器的配置。通过proxy_pass http://$http_host$request_uri;可以知道,代理服务器直接将代替客户将原始请求转发给真正的服务端。简单来看,代理服务器发出的http请求头和客户端发出的http请求头基本是一样的。

(2)nginx反向代理的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http {
#省略了前面一般的配置,直接从负载均衡这里开始
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 / {
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请求的请求头是变化的,例如请求url。

学习资料参考于:
http://z00w00.blog.51cto.com/515114/1031287