Nginx 正向代理与反向代理实战
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 两者区别
从用途上来讲:
- 正向代理的典型用途是为在防火墙内的局域网客户端提供访问 Internet 的途径。正向代理还可以使用缓冲特性减少网络使用率。
- 反向代理的典型用途是将防火墙后面的服务器提供给 Internet 用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级 URL 策略和管理技术,从而使处于不同的 web 服务器系统的 web 页面同时存在于同一个 URL 空间下。
从安全性来讲:
- 正向代理允许客户端通过它访问任意网站并且因此客户端自身,因此你必须采取安全措施以确保为经过授权的客户端提供服务。
- 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
总结:
- 开放的反向代理应用: Nginx 和 Nat123。Nginx 是单纯的反向代理,需要自行搭建发现代理服务才能使用,效果高。Nat123 是结合来 NAT 和反向代理的应用,可以直接使用,解决80端口问题等,速度快。
2. Nginx 正向代理与反向代理实战
2.1 正向代理配置场景演示
正向代理很常见,我们正常上网就是一种正向代理。 接下来我们演示正向代理的一个场景:
首先在A服务器(IP:192.168.1.110)的Nginx设置访问控制,访问控制之前访问 A 下的test.html是这样的,如下:
- 在A服务器的Nginx修改配置文件,加入一个判断语句,如果访问A的的 IP 不是 192.168.1.44 (B 服务器IP)则返回403.
location / { if ( $remote_addr !~* "^192\.168\.1\.44") { return 403; } root html; index index.html index.htm; }
添加后reload一下nginx再访问test.html,如下:
此时,在 A服务器 的本地浏览器就是被限制来,访问不了该资源。
- 接下来,在 B服务器 上修改Nginx配置文件,添加 resolver 和 proxy_pass ,设置如下:
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 反向代理配置场景演示
反向代理的演示更为简单一些。
- 首先我们新建一个test.conf的配置文件,启动对应这个配置文件的服务:
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 结果是访问不到的.
- 修改Nginx的默认配置文件,添加 proxy_pass 设置如下:
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,以下是详细操作。