简单说说什么是正向代理和反向代理,以及他们的区别|nginx反向代理配置教程

615 阅读4分钟

目录

正向代理(Forward Proxy)

一、说明

二、举几个具体的例子

反向代理Reverse Proxy)

一、说明

二、举几个具体的例子

反向代理配置教程


正向代理(Forward Proxy)

一、说明

一般的访问流程是客户端直接向目标服务器发送请求并获取内容,比如大家通过浏览器,输入对应的网址,baidu.com、qq.com、taobao.com、zygxsq.cn/daohang 等,就可以直接进入对方的网站。

这时候使用正向代理后,客户端改为 向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。

正向代理的作用一般是用来隐藏真实客户端的,通过代理服务器为客户端收发请求,使真实客户端对服务器不可见。

二、举几个具体的例子

①你的浏览器无法直接访问谷哥,这时候可以通过一个代理服务器来帮助你访问谷哥,那么这个服务器就叫正向代理。

②还有大家办公经常要用的V。P。N,也是类似的原理,通过家里的电脑连接公司的代理服务器,然后公司的代理服务器真正的去访问公司内部资料。这样大家的访问记录都会在代理服务器上有记录。

反向代理Reverse Proxy)

一、说明

还是与上面的一般访问流程对比,

这时候使用反向代理后,直接收到请求的服务器是代理服务器,然后将请求转发给内部网络上真正进行处理的服务器,得到的结果返回给客户端。

反向代理的作用是用来隐藏真实服务器的,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。

二、举几个具体的例子

假如公司实现了前后端分离,前端部署了一台服务器,11.11.11.11,后端的接口部署了很多的接口,比如专门处理订单服务的一台服务器11.11.11.12,专门处理单点登录和JWT的一台服务器,11.11.11.13,专门处理图片的一台服务器:11.11.11.14......总之后台有很多的接口,这时候呢,前台只要通过特定的前缀,比如前台请求订单服务的,就加个 /order/geyXXXXX;请求登陆的,加个前缀 /login/getXXXXX;请求图片的,加个/img/getXXXX ......这样,在代理服务器,通过拦截特定前缀,就可以将请求指定到特定的其他服务器上,这样就实现了反向代理,也实现了跨域请求


简单的说,一般给客户端做代理的都是正向代理,给服务器做代理的就是反向代理。

反向代理配置教程

用于反向代理的一般大家使用nginx或者apache等,我这里就举nginx反向代理的配置例子,通过upstream实现

#配置被代理的服务器 ,这里配置多个order服务器,表示负载均衡,这样就可以轮询的将所有的order的请求请求到这里的两台服务器上
    upstream order{
        server 11.11.11.12:8080;
        server 11.11.11.22:8080;
    }

同理,配置登陆的服务器,图片的服务器等等

upstream login{
        server 11.11.11.13:8080;
        server 11.11.11.23:8080;
    }



upstream img{
        server 11.11.11.14:8080;
        server 11.11.11.24:8080;
    }

然后呢,就可以通过监听不同的前缀,将请求反向代理到指定的服务器上

......
server{
     location /order {
		proxy_pass http://order;
		break;
		#下面这两条配置,意思是将http头转发给后端应用,不然你后端应用服务拿客户端IP地址的时候拿到的是nginx代理的地址而不是客户端的。
       proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
}
     }

	location /login {
		proxy_pass http://login;
		break;
     }

	location /img {
		proxy_pass http://img;
		break;
     }
}
......

还有一个非常要注意的一点,就是proxy_pass http://login   和proxy_pass http://login/  虽然多了一个 / 但是这是两个非常大的区别

location /login {
proxy_pass http://login;\         break;
}

如果是proxy_pass http://login  ,就是将请求链接完整的拼接上,如果是proxy_pass http://login/ ,就是将login给去掉后,后面的给拼接上

举个简单的例子,比如我现在前端请求的是 /login/getUserxx

通过下面的反向代理,实际请求的是 11.11.11.13:8080/login/getUserxx 或者 1.11.11.23:8080/login/getUserxx

location /login {
proxy_pass http://login;\         break;
}

但是通过下面带/ 的反向代理后,实际请求的是 11.11.11.13:8080/getUserxx 或者 1.11.11.23:8080/getUserxx

location /login {
proxy_pass http://login/ ;
break;
}

当然这里只是简单的介绍了一下反向代理的基本配置,还有很多很多的配置,大家也可以网上搜索一下,其他大佬们的教程


参考文章

mp.weixin.qq.com/s/hjqlpr3ev…

www.cnblogs.com/mrlinfeng/p…

blog.csdn.net/martingpf/a…

blog.csdn.net/qq_29298577…

感谢原作者的分享,让技术人能够更快的解决问题