开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
正向代理
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器获取内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端,客户端必须设置正向代理服务器。
简单来说正向代理就是代理客户端,对客户端负责(我们作为客户端的角度去理解)。正向代理的用途如下👇👇👇
1.加速访问
客户端A直接访问服务端的话可能会非常慢,这时候可以借助代理服务器进行加速访问。例如游戏加速器,这个玩过吃鸡的小伙伴应该不陌生吧😄。
2.科学上网
比如国内浏览器访问 Google 时有一堵无形的墙,可以借助国外搭建的代理服务器(VPN),让代理服务器请求Google,然后代理把请求返回的内容返回给我们的客户端。
3.上网行为管理
从客户端的角度,代理可以记录客户端访问记录,也就是从客户端=>代理服务器这个过程中可以知道客户端访问了哪些网址,这个也是最近讨论比较多的公司监控员工操作的一个实现
4.隐藏客户端
从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
5.客户端访问授权
上网进行认证,只让部分IP可以访问外网,这个和上面的上网行为管理发生在一个阶段。
6.缓存数据
客户端A想要获取某些数据,这时候会通过代理服务器去服务端获取对应数据,返回给客户端A,并且代理服务器会把这份数据缓存起来;客户端B同样想要这份数据,这个时候会在代理服务器进行命中缓存,不再访问服务端。
反向代理
反向代理(Reverse Proxy)实际运行方式是以代理服务器来接收 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理简单来说就是代理服务器,对服务器负责(我们作为服务器的角度去理解)。那反向代理有哪些用途呢?👇👇👇
保护服务器
保证内网的安全,可以使用反向代理提供web应用防火墙功能,阻止web攻击。公司通常将反向代理作为公网访问地址,web服务器是内网(如上图👆)。
负载均衡
通过反向代理服务器来优化网站负载。
以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 为例:
其他框架同理,一般都有proxy配置
基于nginx
因为浏览器的同源策略,当前端域名与后端域名不一致的时候导致请求失败。我们可以通过配置Nginx反向代理来解决。
nginx基本概念,见前端需要了解的nginx。
案例1: 以下是两个服务对应两个端口,前端服务是8000对应路径是“/”,后端接口服务是3000,对应路径是“/api”,通过nginx配置分别代理到对应的端口号下,使得访问8080即可访问前端服务,又可以访问接口
案例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完成请求。