如何理解正向代理和反向代理?

288 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

正向代理

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器获取内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端必须设置正向代理服务器。

image.png

简单来说正向代理就是代理客户端,对客户端负责(我们作为客户端的角度去理解)。正向代理的用途如下👇👇👇

1.加速访问

image.png

客户端A直接访问服务端的话可能会非常慢,这时候可以借助代理服务器进行加速访问。例如游戏加速器,这个玩过吃鸡的小伙伴应该不陌生吧😄。

2.科学上网

18791669535515_.pic.jpg

比如国内浏览器访问 Google 时有一堵无形的墙,可以借助国外搭建的代理服务器(VPN),让代理服务器请求Google,然后代理把请求返回的内容返回给我们的客户端。

3.上网行为管理

从客户端的角度,代理可以记录客户端访问记录,也就是从客户端=>代理服务器这个过程中可以知道客户端访问了哪些网址,这个也是最近讨论比较多的公司监控员工操作的一个实现

1272931669544110_.pic.jpg

4.隐藏客户端

从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

1272931669544110_.pic (1).jpg

5.客户端访问授权

上网进行认证,只让部分IP可以访问外网,这个和上面的上网行为管理发生在一个阶段。

6.缓存数据

image.png

客户端A想要获取某些数据,这时候会通过代理服务器去服务端获取对应数据,返回给客户端A,并且代理服务器会把这份数据缓存起来;客户端B同样想要这份数据,这个时候会在代理服务器进行命中缓存,不再访问服务端。

反向代理

反向代理(Reverse Proxy)实际运行方式是以代理服务器来接收 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

image.png

反向代理简单来说就是代理服务器,对服务器负责(我们作为服务器的角度去理解)。那反向代理有哪些用途呢?👇👇👇

保护服务器

保证内网的安全,可以使用反向代理提供web应用防火墙功能,阻止web攻击。公司通常将反向代理作为公网访问地址,web服务器是内网(如上图👆)。

负载均衡

通过反向代理服务器来优化网站负载。

image.png

以nginx为例,负载均衡策略:

轮训

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

weight

指定轮训几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream bakend {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=8;
}

ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:

upstream bakend{
    ip_hash;
    server 192.168.0.14;
    server 192.168.0.15;
}

fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配

upstream backend{
    server server1;
    server server2;
    fair;
}

url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upsteam backend {
    server squid1:3128;
    server squid2:3129;
    hash $request_uri;
    hash_method crc32;
}

在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

解决跨域问题

基于node

以 express 为例: image.png 其他框架同理,一般都有proxy配置

基于nginx

因为浏览器的同源策略,当前端域名与后端域名不一致的时候导致请求失败。我们可以通过配置Nginx反向代理来解决。

nginx基本概念,见前端需要了解的nginx

案例1: 以下是两个服务对应两个端口,前端服务是8000对应路径是“/”,后端接口服务是3000,对应路径是“/api”,通过nginx配置分别代理到对应的端口号下,使得访问8080即可访问前端服务,又可以访问接口

image.png image.png

案例2:详细配置及释义

location /api {   
    # 请求host传给后端
    proxy_set_header Host $http_host;
    # 请求ip 传给后端
    proxy_set_header X-Real-IP $remote_addr;
    # 请求协议传给后端
    proxy_set_header X-Scheme $scheme;
    # 路径重写
    rewrite  /api/(.*)  /$1  break;
    # 代理服务器
    proxy_pass http://localhost:9000;
}
  • 拦截路径/api, 可以通过正则匹配。
  • proxy_set_header 允许重新定义或添加字段传递给代理服务器的请求头。
  • $http_host$remote_addr$scheme 为Nginx内置变量。
  • rewrite 根据rewrite后的请求URI,将路径重写,如:接口路径为 /user, 我们可以请求 /api/user。(为什么需要重写uri?因为在使用Nginx做反向代理的时候,需要匹配到跨域的接口再做转发,为了方便匹配,会人为的在原接口中添加一段路径(或标示, 如例子中的api),因此需要在匹配之后、转发之前把添加的那段去掉,因此需要rewrite。)
  • break 继续本次请求后面的处理 ,停止匹配下面的location。需要注意的是与之类似的last执行过程则是停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求,从上到下依次匹配location后面的规则。
  • proxy_pass 代理服务器。

原理:Nginx拦截到相关匹配规则, Nginx再将请求转发到http://localhost:9000,Nginx得到请求后再响应到前端,可以直接请求/api/user完成请求。