关于正向代理与反向代理
今天面试过程中遇到了正向代理与反向代理的问题,回来后整理了这篇文章。
前言
说一下为什么会被问到这个问题吧,我在项目简历中有如下一段描述:
在部署方面,采用了 Nginx+Tomcat 的模式,其中 Nginx 的作用一方面是做反向代理、负载均衡,另一方面是做…
所以就勾起了面试官的…
小王呀,能说一下 Nginx 的负载均衡,以及正向代理跟反向代理有什么区别吗?
相信负载均衡大家应该都有了解,在写正反代理之前再来回顾一下吧。
负载均衡
1、负载均衡使用场景
举一个例子,假如现在有两台服务器 A、B 同时为用户提供服务,如果没有采用负载均衡的话,可能会出现这么个情况,A 占访问的 90%,B 占访问的 10%,或者是 B 占访问的 80%,A 占访问的 20%,总之用户具体访问哪个服务是不确定的,且不可控。所以这种情况的弊端就很明显了,显然我们是希望能够将用户的访问均衡的分配到这两台服务器上的,这才是负载均衡最大的意义。
负载均衡:将客户端的请求按照一定的规则分配到一群服务器上,并将处理结果返回给相应的客户端。
2、负载均衡实现方式
因为是基于 Nginx 的问题,所以就直接来看 Nginx 提供的五种实现负载均衡的方式:
2.1、轮询(默认)
这是 Nginx 默认采用的方式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕掉,能自动剔除;举例:服务器处理请求顺序:ABABABABA,假如 A 挂了,则全部成了 BBBBBBB
upstream backserver {
server 192.168.31.14;
server 192.168.31.15;
}
2.2、指定权重
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。权重越大表示被访问的优先级就越高,如下服务器请求处理顺序:ABBABBABBABB…
upstream backserver {
server 192.168.31.14 weight=1;
server 192.168.31.15 weight=2;
}
2.3、IP绑定 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。怎么讲?就是你如果访问了 A 服务,那么在未断开连接之前就一直保持着跟 A 的通讯,所以无论你在应用的哪个模块上总是保持着一台服务器的连接,这样就不会有分布式 session 的问题了。
upstream backserver {
ip_hash;
server 192.168.31.14:88;
server 192.168.31.15:80;
}
2.4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server 192.168.31.14:88;
server 192.168.31.14:80;
fair;
}
2.5、url_hash(第三方)
按访问 url 的 hash 结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。这个类似于上边提到的 ip_hash 的方式。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
3、负载均衡的作用
两点比较重要的作用总结:
- 解决服务器并发压力,提高应用处理性能。
- 提供故障转移,实现高可用。
正向代理与反向代理
终于到今天的主角了。关于代理,相信大家可能会有中间人这种概念,我们来看一下关于正向代理、反向代理到底指的是什么。
正向代理
正向代理是用在客户端的。我们来举一个例子,比如我们要访问谷歌等国外网站,我们需要使用梯子(V*N),挂上代理,此时,我们在百度上输入 IP 可能就会出现下图的情况:
也就是说,代理改变了浏览器,帮我们本地实现了转发,浏览器想访问谷歌,首先要访问梯子代理的地址,然后梯子帮我们完成请求转发,最后将请求返回给用户显示。
反向代理
反向代理是用在服务器端的。服务器端对外暴露的是一个虚拟IP,用户请求到该 IP 后,会转发到多个后端处理器中的一台来处理该具体请求。大型网站都有DNS(域名解析服务器),load balance(负载均衡器)等。
总结
正向代理与反向代理,两者的作用点不同,正向代理是用在客户端的,反向代理是用在服务器端的。
正向代理帮我们实现了内网访问外网,而反向代理则实现了外网访问内网。
内网访问外网:政府机关等内网通过挂载V*N代理访问外网,或者咱平时挂梯子访问谷歌。
外网访问内网:nginx对外只暴露一个端口,而内部代理2个或2个以上的端口应用。
关于负载均衡,主要作用就是帮助我们减轻服务器并发压力,提供故障转移,实现高可用,需要注意的是负载均衡只有在大于 2 台及以上才有意义。
我创建了一个java相关的公众号,用来记录自己的学习之路,感兴趣的小伙伴可以关注一下微信公众号哈:niceyoo