关于正向代理与反向代理

今天面试过程中遇到了正向代理与反向代理的问题,回来后整理了这篇文章。

前言

说一下为什么会被问到这个问题吧,我在项目简历中有如下一段描述:

在部署方面,采用了 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、负载均衡的作用

两点比较重要的作用总结:

  1. 解决服务器并发压力,提高应用处理性能。
  2. 提供故障转移,实现高可用。

正向代理与反向代理

终于到今天的主角了。关于代理,相信大家可能会有类似于中间人这种概念,我们来看一下关于正向代理、反向代理到底指的什么。

正向代理

正向代理是用在客户端的。我们来举一个例子,比如我们要访问谷歌等国外网站,我们需要使用梯子(V*N),挂上代理,此时,我们在百度上输入 IP 可能就会出现下图的情况:

也就是说,代理改变了浏览器,帮我们本地实现了转发,浏览器想访问谷歌,首先要访问梯子代理的地址,然后梯子帮我们完成请求转发,最后将请求返回给用户显示。

反向代理

反向代理是用在服务器端的。服务器端对外暴露的是一个虚拟IP,用户请求到该 IP 后,会转发到多个后端处理器中的一台来处理该具体请求。大型网站都有DNS(域名解析服务器),load balance(负载均衡器)等。

总结

正向代理与反向代理,两者的作用点不同,正向代理是用在客户端的,反向代理是用在服务器端的。
正向代理帮我们实现了内网访问外网,而反向代理则实现了外网访问内网。

内网访问外网:政府机关等内网通过挂在V*N代理访问外网,或者咱平时挂梯子访问谷歌。
外网访问内网:nginx对外只暴露一个端口,而内部代理2个或2个以上的端口应用。

关于负载均衡,主要作用就是帮助我们减轻服务器并发压力,提供故障转移,实现高可用,需要注意的是负载均衡只有在大于 2 台及以上才有意义。

我创建了一个java相关的公众号,用来记录自己的学习之路,感兴趣的小伙伴可以关注一下微信公众号哈:niceyoo

posted @ 2019-10-17 20:33  niceyoo  阅读(...)  评论(... 编辑 收藏