网上的资料都各显神通很乱,我在网上看过很多资料后,且断续经历过很长时间,终于搞懂了。这篇文章很简短。
理论知识
nginx apache 都是 web 服务服务器软件。
nginx为什么性能那么高,为什么比apache好?
主要因为nginx的请求处理模式是异步非阻塞,apache是同步阻塞。
什么是同步阻塞?
一个http请求的过程,简单来说是这样:用户点击一个页面,会先连接到 web 服务器,apache再连接我们的web应用(比如php python),web应用会连接数据库以及处理些业务,这就需要一些时间处理,再最终返回给用户。
这个过程,如果web应用花了3秒,同步阻塞模式(apache)会等待3秒,等待3秒之后拿到结果,再返回给用户。然后再处理下一个用户请求。
什么是异步非阻塞?
上面的http请求过程,如果web应用花了3秒,异步非阻塞模式(nginx)不等待,马上去处理下一个用户请求。3秒后web应用处理完会有事件主动通知说我处理完了,然后再返回给用户。
什么是正向代理?
如图,用户的电脑上不了某网站,所以通过能上这网站的代理服务器,去上了这个网站。中间这代理服务器,代表用户,去上某网站,这叫正向代理。用户和代理服务器是一伙的。
什么是反向代理?
代理服务器,代表了这个网站,挡在前面。代理服务器和应用服务器是一伙的。用户上某网站时,会先自动到达代理服务器,然后代理服务器再分配请求给具体网站服务器。这叫反向代理。
什么是负载均衡?
现在再来理解负载均衡,就很容易明白了。负载均衡就是通过反向代理来实现的,用户请求某网站时,代理服务器按照一定规则轮流请求多台应用服务器中的一台(这个网站弄了三台服务器)。这就达到了提升网站并发能力的效果。
负载均衡策略:
(1) 轮询
轮流把用户请求的流量分配给每一台应用服务器。缺点是不能保存会话,比如用户存在session里的登录信息。
(2) 权重 weight
按机器的不同能力,分配不同的权重。比如一台服务器配置好,一台配置差,前者权重就可以配置高一些。
(3) ip_hash
按ip去计算hash,然后每个ip对应分配给固定的应用服务器。缺点是,用户拿着手机在公交车上上网时,网络时好时坏,切换网络,就不会分配到原来的那一台。
一般在企业中,我们会使用最简单的轮询,这轮询没什么不好的,简单方便。会话信息不一致问题,有很多解决办法,比如单独的验证服务器,或者无状态的JSON Web Token (JWT)方式。