scaleqiao 2020-10-22
1. 正向代理与反向代理的区别
1.1 什么是代理服务器?
所谓代理服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。
上面描述的还不是特别了解,接下来我们就认识一下正向代理和反向代理的区别
1.2 正向代理的概念
正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
结论就是:正向代理:客户端 <一> 代理 一>服务端 正向代理,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
1.3 反向代理的概念
例如:用户访问 http://www.test.com/readme,但 www.test.com 上并不存在 readme 资源,它是偷偷从另外一台服务器上取回来,然后作为转交的内容返回给用户,但用户并不知情。这里所提到的 www.test.com 这个域名对应的服务器就设置来反向代理功能。
结论就是:客户端 一>代理 <一> 服务端 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
网友的神图,加深理解
1.4 两者区别
从用途上来讲:
从安全性来讲:
总结:
2. Nginx 正向代理与反向代理实战
2.1 正向代理配置场景演示
正向代理很常见,我们正常上网就是一种正向代理。 接下来我们演示正向代理的一个场景:
首先在A服务器(IP:192.168.1.110)的Nginx设置访问控制,访问控制之前访问 A 下的test.html是这样的,如下:
location / { if ( $remote_addr !~* "^192\.168\.1\.44") { return 403; } root html; index index.html index.htm; }
添加后reload一下nginx再访问test.html,如下:
此时,在 A服务器 的本地浏览器就是被限制来,访问不了该资源。
server { listen 8080; server_name localhost; 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系统,可以从网络设置中选择高级,然后选择代理。(这里是在 A服务器配置代理)
结果证明,此时在 A服务器 的客户端已经可以成功访问 A 服务器的资源。
以上就是正向代理的一个场景演示,这个过程中可以知道,我们客户端是想要 A 的资源,但是 A 的资源只有 B 能拿到,便让 B 代理去帮助我们访问 A 的资源。整个过程 A 只知道 B 拿了它的资源,并不知道客户端拿到。
2.2 反向代理配置场景演示
反向代理的演示更为简单一些。
server { listen 8080; server_name localhost; location / { root 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 结果是访问不到的.
server { listen 80; server_name localhost; location / { root 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; } }
此时便可以访问8080端口配置的资源了,如下:
以上便完成了一个反向代理的演示,这个过程中我们可以知道,客户端想要访问的是 test.html,但是 test.html 实际上是 8080 端口下配置的,中间经过了代理才能拿到。也就是说客户端并不知道中间经历了什么代理过程,只有服务端知道。客户端只知道他拿到了 test.html 也就是8080端口下配置的资源。
某些公司会墙特定网站,如果你有一个可访问的域名和服务器,就可以通过nginx反向代理来来解决这些问题。比如现在我们用mirror.example.com镜像www.baidu.com,以下是详细操作。