阿里云上部署高可用nginx集群方案

阿里云的SLB七层负载均衡的策略过于单调,而且不能写一些复杂规则,如果我们后端服务的一些规则改变了,那就需要改所有服务器上的nginx配置文件,比较麻烦而且有一定风险。例如我们后端服务是用php写的,那么我们希望服务器上的nginx配置只是用来反向代理fastcgi协议,其他例如缓存、访问控制、路由策略等一些复杂的策略在负载均衡这里来做,这样只需要配置一次nginx,大大提升效率。

而且阿里云上的slb是不支持一个https监听上挂多个ssl证书,这个时候,我们就可以在后端的nginx上配置ssl监听,就可以支持多个https服务了。另一个问题就是阿里云SLB七层监听与后端ECS建立的http请求是短连接,可以抓包看到请求头部Connection为close,这在大流量场景下性能成问题,需要频繁建立连接。

首先这里放上简单的架构图:

这里用阿里云的SLB4层负载均衡,后面挂一个主备服务器组,这个主备服务器组上面部署两套一模一样的nginx。

然后开通阿里云的NAS,同时挂载到这两个nginx服务器的相同目录。这样我们设置的缓存文件可以在两个服务器上共享,如果主nginx挂掉了,至少缓存文件还是可用的。

最后我们配置上主nginx配置文件实时同步到备nginx机器上。我这边是使用inotify-tools实现的

如何对nginx服务器的配置进行修改?

如果业务量逐渐上升了,nginx服务器当前的配置快不能满足需求了(这个指标需要关注nginx机器的负载,达到一定程度之后,就要注意了。),这个时候就需要对服务器进行升配,那么升配需要重启服务器,怎么整?

这个时候,我们可以先对nginx slave进行升配,升级配置过程中,禁止再进行新的nginx配置文件修改,例如添加新的虚拟主机、删除虚拟主机等。完成之后,将主服务器关机,这个时候,所有的流量会切换到slave服务器上,这个时候再对master进行升配,升配完成之后,开机启动之后,slb自动会将流量再次切换到master上。

这样就可以对nginx服务器进行升配了。

与k8s中ingress controller的相似之处

在k8s中,ingress 需要处理全局负载均衡,我们通常部署多个ingress controller pod,或者直接使用daemonset方式在每台机器上部署一个ingress controller pod,然后service使用nodePort的方式在节点上绑定一个端口,然后在SLB中添加四层监听,后端服务器组为这些ingress,端口为nodePort指定的端口,这里可以使用主备服务器,也可以使用虚拟服务器组,虚拟服务组就是每个ingress controller都会接到流量进来,但是可以开启健康检查及时摘除后端出问题的ingress。

但是这里注意,在配置ingress controller的service的时候需要指定service.spec.externalTrafficPolicy 的值为 Local,也就是只转发到当前节点的pod中,否则后端pod无法获取真实的客户端ip,除此之外,还减少了转发到其他的节点性能消耗。

《阿里云上部署高可用nginx集群方案》有1条留言

留下评论