什么是代理服务器
引入代理之后,作为代理的服务器相当于一个中间人的角色,对于客户端而言,表现为服务器进行响应;而对于源服务器,表现为客户端发起请求,具有双重身份。
代理服务器的作用
- 负载均衡:客户端的请求只会先到达代理服务器,后面到底有多少源服务器,IP 都是多少,客户端是不知道的。这个代理服务器可以拿到这个请求之后,可以通过特定的算法分发给不同的源服务器,让各台源服务器的负载尽量平均。
- 保障安全:利用心跳机制监控后台的服务器,一旦发现故障机就将其踢出集群。并且对于上下行的数据进行过滤,对非法 IP 限流,这些都是代理服务器的工作。
- 代理缓存:将内容缓存到代理服务器,使得客户端可以直接从代理服务器获得而不用到源服务器那里。
相关首部字段
- X-Real-IP
是一种获取用户真实 IP 的字段,不管中间经过多少代理,这个字段始终记录最初的客户端的IP。
相应的,还有X-Forwarded-Host和X-Forwarded-Proto,分别记录客户端(注意哦,不包括代理)的域名和协议名。
- 通用首部字段Via
via是为了追踪客户端与服务器之间的请求和响应报文的传输路径,话可以避免请求回环方式生。
via首部为了追踪传输路径,所以经常会和TRACE方法一起使用。比如代理服务器接受到由trace方法发送来的请求(其中max-forwards:0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到via首部后,返回该请求的响应。
- X-Forwarded-For
字面意思就是为谁转发, 它记录的是请求方的IP地址(注意,和Via区分开,X-Forwarded-For记录的是请求方这一个IP)。
X-Forwarded-For产生的问题
这意味着每经过一个不同的代理,这个字段的名字都要变,从客户端到代理1,这个字段是客户端的 IP,从代理1到代理2,这个字段就变为了代理1的 IP。
但是这会产生两个问题:
-
意味着代理必须解析 HTTP 请求头,然后修改,比直接转发数据性能下降。
-
在 HTTPS 通信加密的过程中,原始报文是不允许修改的。
由此产生了代理协议,一般使用明文版本,只需要在 HTTP 请求行上面加上这样格式的文本即可:
// PROXY + TCP4/TCP6 + 请求方地址 + 接收方地址 + 请求端口 + 接收端口
PROXY TCP4 0.0.0.1 0.0.0.2 1111 2222
GET / HTTP/1.1
...
这样就可以解决X-Forwarded-For带来的问题了。 X-Forwarded-For
为什么产生代理缓存?
如果每次客户端缓存失效都要到源服务器获取,那给源服务器的压力是很大的。缓存代理的机制。让代理服务器接管一部分的服务端HTTP缓存,客户端缓存过期后就近到代理缓存中获取,代理缓存过期了才请求源服务器,这样流量巨大的时候能明显降低源服务器的压力。
先了解Cache-Control指令
缓存请求指令
指令 | 说明 |
---|---|
no-cache | 强制向源服务器再次验证 |
no-store | 不缓存请求或者响应的任何内容 |
max-age=秒 | 响应的最大age值 |
nax-stale=秒 | 接受已过期的响应 |
min-fresh =秒 | 期望在指定时间内的响应任有效 |
no-transform | 代理不可更改媒体类型 |
only-if-cached | 从缓存获取资源 |
缓存响应指令
指令 | 说明 |
---|---|
pubilc | 允许代理服务器缓存 |
private | 紧急代理服务器缓存 |
no-cache | 缓存前必须先确认其有效性 |
no-store | 不缓存请求或响应的任何内容 |
no-transform | 代理不可更改媒体类型 |
must-revalidate | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age = [秒] | 响应的最大Age值 |
s-maxage = [秒] | 公共缓存服务器响应的最大Age值 |
缓存代理的控制分为两部分,一部分是源服务器端的控制,一部分是客户端的控制。
1.源服务器的缓存控制
-
cache-Control:public/private
在源服务器的响应头中,会加上Cache-Control这个字段进行缓存控制字段,那么它的值当中可以加入private或者public表示是否允许代理服务器缓存,前者禁止,后者为允许。 -
proxy-revalidate
must-revalidate的意思是客户端缓存过期就去源服务器获取,而proxy-revalidate则表示代理服务器的缓存过期后到源服务器获取。 -
s-maxage
s是share的意思,限定了缓存在代理服务器中可以存放多久,和限制客户端缓存时间的max-age并不冲突。
2.客户端的缓存控制
-
max-stale
表示客户端到代理服务器上拿缓存的时候,即使代理缓存过期了也不要紧,只要过期时间在多少秒之内,还是可以从代理中获取的。 -
min-fresh
表示代理缓存需要一定的新鲜度,不要等到缓存刚好到期再拿,一定要在到期前多少 秒之前的时间拿,否则拿不到。 -
only-if-cached
这个字段加上后表示客户端只会接受代理缓存,而不会接受源服务器的响应。如果代理缓存无效,则直接返回504(Gateway Timeout)。
参考:三元博客