在详解http报文
相关文章中咱们介绍了http协议是如何工做的,那么构建一个真实的网站还须要引入组件呢?一些常见的名词究竟是什么含义呢?html
在前面文章中咱们介绍过最简单的一种客户端-服务端响应模式,以下 nginx
这是http服务最简单的一种形式,服务端就一层web服务器。web
如今咱们服务端变复杂了,用户数增长了,并发量增长了。对咱们服务端要求增长了算法
为了解决这些问题,咱们须要引入中间层
也就是代理,在客户端和服务端中间插入一个中间环节,代理服务。代理,狭义上讲就是不生产内容,只是转发上下游的请求和响应。apache
代理服务按照是否匿名能够分为缓存
按照靠近客户端仍是服务端,分为安全
由于http协议最开始并无考虑代理服务,设计的协议只是针对客户端-服务器模式。根据咱们一般的架构标准,http协议层是不用关心使用者是如何使用的,代理服务这种中间产物天然不用考虑。服务端有获取客户端ip的需求,因此Squid这个缓存代理软件最早引入X-Forwarded-For
头字段,用来表示 客户端的真实 IP。bash
格式以下,从客户端到各个代理服务,记录下每一层的转发服务器
X-Forwarded-For: client, proxy1, proxy2
复制代码
这个需求是如此的普世,因此慢慢变成了标准,被各个代理服务普遍使用,因此后来被写入到RFC 7239标准之中了网络
HTTP 协议自己对代理服务并无什么说明,因此就衍生出了代理协议,代理协议是haproxy的做者Willy Tarreau于2010年开发和设计的一个Internet协议,经过为tcp添加一个很小的头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络状况复杂又须要获取客户IP时很是有用。
另外因为每一层代理服务都须要解析http header 头X-Forwarded-For
,而后追加本身的地址,因此这个成本也比较高。因此代理协议也变成了刚需
,虽然是haproxy提出来的,可是也被各大代理服务器支持了,如nginx、apache、squid。代理协议格式
PROXY TCP4/TCP6 客户端ip 应答方ip 请求方端口号 应答方端口号 \r\n
复制代码
这样请求方解析第一行就能够拿到客户端ip,不用再去处理http报文了。
负载均衡,其实就是分发请求。根据OSI七层协议
负载均衡分红两种
nginx是4层负载均衡,LVS是七层负载均衡。
因此小型网站,nginx就足够,当流量足够大时,负载均衡成为瓶颈了,就能够在前面引入了LVS一层。
关于具体的负载均衡算法,参考这边文章,这里再也不赘述
前面咱们提到过安全防御也是代理服务的一大重要功能。为了应对外部攻击,须要引入网络防火墙,WAF(Web Application Firewall)。工做在OSI 第七层,主要是对http报文进行更细致的审核,也就是各类filter。 好比
当服务的安全性要求没那么高时,或者对公司业务发展的ROI没那么高时,咱们一般就在nginx层面配置一些规则便可。需求升级时,咱们就要引入专门的模型,好比ModSecurity1
。需求再升级时,引入外部云厂商提供的WAF服务。
http服务端架构演进和咱们单应用架构演进有殊途同归之处。在业务不复杂的时候,可使用单体模块搞定(好比Nginx),当请求量增长,需求升级时,须要引入中间层来解决。当某个模块要求增长时,须要解耦出单独的模块来处理。
因此总体上看,一个中型的服务端架构以下图。
关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一块儿开始技术修行之路
相关阅读 详解http报文