一、介绍在实际中,当客户端不能直接向服务端发起请求时,我们就需要一个代理服务。代理可以实现客户端和服务端的通信,我们的Nginx也可以实现相应的代理服务。代理分为正向代理和反向代理。本文将演示Nginx配置正向代理和反向代理的场景。2.正向代理和反向代理的区别正向代理和反向代理的区别我在知乎上找了两张图可以帮助我们很好的理解:房子给代理:A(client)想从C(server)那里租房子,但是A(client)不认识C(server),不能租。B(agent)知道C(server)可以租这个房子,所以你让B(agent)帮你租这个房子。在这个过程中,C(server)不认识A(client),只认识B(agent)。C(server)不知道A(client)租了房子,只知道房子租给了B(agent)。反向代理:Client1>Proxy<1>服务器端的反向代理同样用了一个租房的例子:A(client)要租房子,B(agent)把房子租给他。这时候C(服务器)其实就是楼主。B(代理人)是把房子租给A(客户)的中介。在这个过程中,A(客户)并不知道这套房子的房东是谁。他可能认为这个房子是B(代理人)。从上面的例子和图片我们可以知道,正向代理和反向代理的区别在于代理对象不同,正向代理的代理对象是客户端,反向代理的代理对象是服务器。三、Nginx代理配置演示1、正向代理配置场景演示正向代理很常见,我们科普在线就是一种正向代理。下面我们来演示一下这种正向代理的场景。首先,我在我的A服务器的nginx中设置了访问控制。在访问控制之前,我访问A下的test.html是这样的:我们打开/etc/nginx/conf.d/default.conf,如果我们访问A的话,加上这样一条判断语句如果IP不是118.126.106.11(我的B服务器),return403.location/{if($remote_addr!~*"^118\.126\.106\.11"){return403;}root/opt/app/demo/html;indexindex.htmlindex.htm;添加后,重新加载nginx,访问test.html:此时我本地浏览器被限制,无法访问该资源。现在登录我的B服务器,打开/etc/nginx/conf.d/default.conf添加resolver和proxy_pass,设置如下:server{listen80;server_namelocalhostnginx.tangll.cn;解析器8.8.8.8;location/{proxy_passhttp://$http_host$request_uri;}error_page500502503504/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的资源了。以上是正向代理的场景演示。在这个过程中,我们可以知道我们的client想要A的资源,但是只有B可以得到A的资源,所以让B代理帮我们访问A的资源。整个过程中,A只知道B拿走了他的资源,不知道client拿走了。2.反向代理配置场景演示反向代理的演示比较简单。首先在/etc/nginx/conf.d/:server下新建test.conf{listen8080;server_namelocalhostnginx.tangll.cn;位置/{root/opt/app/demo/html;索引index.html索引。htm;}error_page500502503504404/50x.html;location=/50x.html{root/usr/share/nginx/html;}}可以看到我的服务器监听了8080端口,但是我的服务器本身8080端口没有对外开放,只开放了80端口。所以此时我们访问不到test.html:然后我们打开我们的/etc/nginx/conf.d/default.conf添加proxy_pass设置如下:server{listen80;server_namelocalhostnginx.tangll.cn;位置/{root/usr/share/nginx/html;indexindex.htmlindex.htm;}#Setproxy#location~/test.html${#proxy_passhttp://127.0.0.1:8080;#}error_page500502503504404/50x.html;location=/50x.html{root/usr/share/nginx/html;}}我们设置proxy在匹配到test.html最后的url时访问本机的8080端口进行比较我们先注释掉,然后直接在80端口访问test.html:可以看到返回的404此时。这个时候取消注释,我们重新加载nginx,然后使用80端口访问test.html。这时候我们就可以访问配置在8080端口上的资源了。以上就是一个反向代理演示的完成。在这个过程中,我们可以知道客户端要访问test.html,但是test.html实际上是配置在8080端口下的,需要通过代理才能获取到。.也就是说,中间经过了哪些代理过程,客户端并不知道,只有服务器知道。客户端只知道自己拿到了test.html,也就是8080端口下配置的资源内容。4.小结通过上面的类比和演示例子,可以理解正向代理和反向代理的区别以及Nginx正向的简单配置代理和反向代理。正向代理和反向代理的区别上面也提到了代理对象不同。正向代理的代理对象是客户端,反向代理的代理对象是服务器。最后一句话总结这篇文章就是站在客户端的代理服务器是正向代理,站在原服务器上的代理服务器是反向代理。Nginx可以通过proxy_pass设置代理服务。
