解读 Nginx 如何实现“代理 + 双机热备”?
技术背景
最近在将自己的一个小项目部署到腾讯云服务器,数据库和服务器各自独立,docker 部署,突然前两天接到领导的需求,对目前服务器做 Nginx 负载均衡和双机热备,之前在一家互联网公司,目前在一家国企工作,对于目前公司的技术追求不作评论,看公司的要求是能达到想要的效果就行,简而言之就是负载均衡 + 双机热备,后一种有作用之外,负载均衡根本没必要做(用户数顶天几百人..)而且你双机热备做完,云数据库挂了项目不还是崩了.. 国企就这样,能给上面领导交差别耽误别人每天 5:30 下班,咱都不知道,咱也不敢问 … 闲话不多说,还是进入今天的重点吧。
实现方案
部署三台本地虚拟机,项目服务器两台 +Nginx 服务器一台,使用 docker 部署,除了安装虚拟机需要点时间,其他只需要有一份 docker 镜像和项目镜像,服务器安装 docker 即可,镜像制作本文不再阐述,只侧重于解决方案和 Nginx 的实现原理。想一下如果 Nginx 服务器挂了,整个系统实际上没有崩,但通过 Nginx 服务器地址是访问不了了,这种情况下,实际生产环境中我们该如何处理?直接开放主机或者备机域名?重新配置一台 Nginx 服务器?还是怎样?
代理的实现原理
正向代理
正向代理的用途有局域网内机器借助代理服务访问局域网外的网站,主要是为了增强局域网内部的安全,使得网外的威胁因素不容易影响到网内,起到一部分防火墙的功能;使用代理服务器也可以对局域网内的机器对外网的访问进行必要的监控和管理。正向代理服务器不支持外网对内部网络的网络请求。
反向代理
反向代理是将局域网内的机器接入代理服务器以访问外网的资源,反向代理最常用的就是对请求实现负载均衡,负载均衡大致分四种:1:加权轮询规则的负载均衡;2:对特定资源实现负载均衡;3: 对不同域名实现负载均衡;4:实现带有 URL 重写的负载均衡。
示例
我在本地安装了三台虚拟机,mac 机器还行带得动居然.. 总体算流畅,把另外两台服务器部署启动起来,不是很麻烦,有个 jar 包或者 war 包,只需要服务器安装 docker 环境,docker 启动起来就可以了,就是安装虚拟机有点费时间,有现成的虚拟机的话,不要半个小时,另一台服务器安装下 Nginx 服务器,加上配置所需选项,楼主只简单配置了一下,然后将 Nginx 服务启动起来,可以在主机或者虚拟机测试,Nginx 服务器的地址和配置路径,把其中一台项目服务器停掉,测试一下是否能访问,能正常访问说明配置成功了,这里只说明 Nginx 简单的实现双机热备,如果需要更好的服务高可用方案,光靠 Nginx 显然行不通,可采用 Keepalived 方案,本篇文章只讲述 Nginx 如何实现的代理和双机热备模式。
双机热备的实现原理
如上图所示,upstream 指令配置了 dynaminc 后端服务器组,proxy_pass 配置了被代理服务器的地址;如果要实现负载均衡,在被代理服务器地址后加上轮询权重 weight 参数;不加默认等于 1,backup 参数表示当主服务器挂了之后才访问备用机,否则不访问;Nginx 服务器与客户端是一对多的关系,Nginx 的 Web 请求处理机制要求 Nginx 要有并行处理请求的能力;Nginx 实现并行处理能力的方式是多线程 + 异步机制;异步机制采用的是异步非阻塞方式。