线上多域名实战

甲戌神展子江
• 阅读 1528

本文博主给大家分享线上多域名实战,当线上主域名不可用的情况下,启用备用域名完成网站高可用保障。

网站的高可用性一直是网站运维的重中之重。一旦网站宕机,不仅会造成巨大的经济损失,也会严重影响用户体验。备份域名就是一种实现网站高可用的重要手段。通过备份域名,可以在主域名不可访问时快速切换域名,保证网站正常运行。

一、前情回顾

博主上个星期,线上项目突然出现了少量用户无法打开项目网站,技术支持联系技术人员(也就是博主我)在用户电脑上复现了这一情况。

经过博主排查,发现在客户电脑访问主域名时,会出现连接超时,通过 curl 进一步分析连接详情,举例如下:

C:\Users\16697>curl -v www.wayn.com

* Uses proxy env variable http_proxy == 'http://11.22.11.22:4780'
*   Trying 11.22.11.22:4780...

发现线上主域名在用户电脑上返回的 CDN 节点 11.22.11.22 存在访问不通的情况。博主便跟运维沟通 CDN 节点不通的问题,运维回复是 CDN 节点不通是无法避免的,要看 CDN 厂商对于用户的覆盖情况,建议线上项目使用多域名,并且每个域名使用不同的 CDN 厂商,最大限度避免主备域名都不可用。

OK,得到的运维的意见,我们开始着手做多域名实现方案。

二、购买备用域名

实现域名高可用解决方案,首先需要准备一到两条与主域名功能和形式相似的备份域名。如下

主域名
www.wayn.com

备用域名一
bak1.wayn.com

备用域名二
bak2.wayn.com

购买备份域名后,需要注意一下两点:

  1. 需要在域名服务商那设置DNS记录,将主域名和备份域名指向同一个IP地址。同时也需要为两个域名设置相同的CDN加速和安全证书,保证用户访问体验一致。
  2. 将备份域名的网站配置(nginx配置文件)与主域名保持一致。确保使用备份域名也可以访问我们的网站。

三、主备域名切换实战

这里我们介绍一下通过 JavaScript 代码来实现网站的主备域名如何进行切换。

JavaScript 实现域名切换的流程如下:

  1. 在页面启动时,首先发起对主域名的请求,判断其是否能够正常响应。如果启动时主域名不可访问,就会访问备份域名。针对每个备用域名每隔一秒发送三次请求,如果都能访问成功则认为备用域名可用。代码如下:

    // ES6 的模块引入方式
    import fetch from 'node-fetch'
    
    const domain = 'https://www.wayn111.com'
    const bakDomains = ['http://bak1.wayn.com', 'http://baidu.com']
    
    masterDomainCheck()
    
    // 主域名检测,如果不可用会检查备用域名是否可用
    async function masterDomainCheck() {
      try {
     await fetch(domain)
     console.log('主域名启用成功')
      } catch (e) {
     // console.log(e)
     try {
       await getBakDomain()
       console.log('备用域名可用')
     } catch (e) {
       console.log('备用域名也不可用')
     }
      }
    }
    
    // 访问备用域名,返回其中可用的一个域名
    async function getBakDomain() {
      const apiPromiseList = []
      for (let i = 0; i < bakDomains.length; i++) {
     apiPromiseList.push(
       new Promise((resolve, reject) => {
         bakDomainCheck(bakDomains[i], 3, resolve, reject)
       })
     )
      }
      return await Promise.any([...apiPromiseList])
    }
    
    // 域名检测逻辑
    async function bakDomainCheck(url, count, resolve, reject) {
      console.log(count)
      if (count > 0) {
     try {
       await fetch(url)
       bakDomainCheck(url, --count, resolve, reject)
     } catch (e) {
       console.log('e')
       reject(e)
     }
      } else {
     console.log(`bak domain:${url} access success`)
     resolve({ url, count })
      }
    }

    以上代码经过博主实测,大家感兴趣可以将代码拷贝在本地跑一遍。

  2. 如果主域名启动时正常,则开始定时监测主域名的可访问性。每30秒发起一次请求,判断主域名的HTTP状态码是否为200。

    // 主域名正常,开始定时监测
    setInterval(() => {
      fetch('https://www.wayn111.com')
     .then(res => {
       if (res.status !== 200) {
         switchDomain() 
       }
     })  
    }, 30000)
  3. 一旦监测到主域名故障,开始调用 JavaScript 函数,找到页面所有包含主域名的链接,并将其替换为备份域名。

    // 开始替换页面内域名为备份域名
    function switchDomain() {
      let links = document.querySelectorAll('a')
      for (let i=0; i<links.length; i++) {
     if (links[i].href.indexOf('https://www.wayn111.com') > -1) {
       links[i].href = links[i].href.replace('https://www.wayn111.com'
               , 'https://bak1.wayn.com')
     }
      }
    }
  4. 继续定时监测主域名,在主域名恢复正常时,调用 JavaScript 函数将备份域名的链接替换回主域名。

    // 定时检查主域名故障恢复,一旦恢复再切回主域名  
    setInterval(() => {
      fetch('https://www.wayn111.com')
     .then(res => {
       if (res.status === 200) { 
         switchDomainBack()
       }
     })  
    }, 5000)
    
    function switchDomainBack() {
      let links = document.querySelectorAll('a')
      for (let i=0; i<links.length; i++) {
     if (links[i].href.indexOf('https://bak1.wayn.com') > -1) {
       links[i].href = links[i].href.replace('https://bak1.wayn.com'
               , 'https://www.wayn111.com')
     }
      }
    }
  5. 这样通过 JavaScript 检测域名状态与自动切换,可以最大限度减少域名切换造成的访问中断时间,确保网站高可用。

希望大家通过这个案例,能对线上用多域名来实现高可用网站有一个较为全面的认知。网站过于依赖某单一域名存在潜在风险,备份域名的引入主要是解决少数场景下用户访问不通我们网站的问题。

最后感谢大家阅读,喜欢的朋友可以点赞加关注,你的支持将是我的更新动力😘。

公众号【waynblog】每周更新技术干货、线上项目实战经验、高效开发工具等。
点赞
收藏
评论区
推荐文章
liam liam
3年前
这几个好玩又有趣的API,你用过了吗?
最近在逛ProductHurt时,发现一些好玩又有趣的API,你可能会觉得花里胡哨,but作为开发者也需要乐趣的!当然调试API离不开API管理工具,随手也给大家安利一个最近很热门的接口管理工具:🖼️ClearbitClearbit提供了网站Logo访问API,只要你输入你想要寻找网站图标的域名,就可以返回域名的相关logo图片以前要去爬域名的图标,还
待兔 待兔
11个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
人间小土豆 人间小土豆
3年前
买了域名后备案还要花钱吗?
只要在服务商那里购买了域名之后,备案是不会再收费的。什么是域名备案?一般来说,如果你只有网站的域名,但你没有分析到任何室内空间,那么你就不需要任何备案。域名备案其实就是网站备案,就是在工信部的系统软件中备案你的网站,相当于对网站进行实名验证。域名需要指向一个网站时就必须先进行备案,域名备案的目的就是为了防止在网上从事非法的网站经营活动,打击不良互联网信息的传
Stella981 Stella981
3年前
Spring Boot前后端分离项目配置SSL证书——HTTPS
网站添加免费SSL证书——HTTPS协议一、SSL证书的下载SpringBoot前后端分离项目配置SSL证书,需要申请两个证书。前端申请网站主域名的SSL证书,后端可以在域名管理里面新建一个子域名。例如我的项目前端域名为:www.mzwhzy.com,后端域名为:b
建站后搜索不到?进来看这里!各大搜索引擎收录指引!
创建网站后,为了让网站尽快的被搜索到,可以到各大搜索引擎提交网址,以便加快收录速度。另外,优质域名的收录速度会比二级域名的高很多,所以建议在创建网站后,购买或绑定优质域名,有助于网站的收录,同时,创建网站后较好有规律的不断更新内容,也能够提高搜索引擎的关注,因为搜索引擎总是对新鲜的内容感兴趣,有新的内容会刺激它更频繁的检索你的网站。(注:优质域名指“一级域名
Wesley13 Wesley13
3年前
DGA域名可以是色情网站域名
恶意域名指传播蠕虫、病毒和特洛伊木马或是进行诈骗、色情内容传播等不法行为的网站域名。恶意域名指传播蠕虫、病毒和特洛伊木马或是进行诈骗、色情内容传播等不法行为的网站域名。本文面临能够的挑战,就是恶意网站经营者所使用的各种技术。近年来,FFSN和DGA技术使得网络攻击更加隐蔽,隐患更难被清除。现网发现的DGA色情域名示例:api.e9ba38a7d
Wesley13 Wesley13
3年前
1.1 学习约定 1.2 需求分析 2.1 域名申请 2.2 域名解析 2.3 域名备案
1.1学习约定坚持坚持坚持1.2需求分析课程项目(搭建一个站点)博客、论坛、企业网站等等1.域名2.网站代码3.服务器4.装软件(搭环境)5.出问题,怎么解决?网站维护步骤:1.域名申请域名:去哪里申请?去哪里购买?怎么样去使用域名?解析?
Stella981 Stella981
3年前
Apache 设置域名泛解析
如果你的服务器,只做一个网站,基本不要配置如果有多虚拟主机的话,应该是把泛域名那个网站作为默认的虚拟主机设置服务器支持泛域名。<VirtualHost\:80       ServerAdminyourmail@yourdomain.com       DocumentRoot你的SupeSite程序的
Wesley13 Wesley13
3年前
ThinkPHP 常用模板设置
默认的替换规则:    \_\_ROOT\_\_:会替换成当前网站的地址(不含域名)     \_\_APP\_\_:会替换成当前应用的URL地址(不含域名)    \_\_MODULE\_\_:会替换成当前模块的URL地址(不含域名)    \_\_CONTROLLER\_\_(\_\_或者\_\_URL\_\_兼容考虑):会替
高防加速CDN 高防加速CDN
2年前
如何避免域名免遭黑客攻击?
由于许多网站和域名没有得到充分的保护,域名被黑客攻击是一个快速而简单的过程。通常情况下,域名所有者不会时刻查看网站,直到几个月后才意识到被黑客入侵。在域名遭到黑客入侵的情况下,所有者通常可以做得事情很少。为了避免由于域名攻击而造成的业务压力和头痛,您可以通
ZOS对象存储跨域资源访问的实现和使用
跨域指的是从一个域名去请求另外一个域名的资源,即跨域名请求。跨域时,浏览器不能执行其他域名网站的脚本,这是由浏览器的同源策略造成的,是浏览器施加的安全限制。同源策略是一种约定,是浏览器最核心也最基本的安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这是一个用于隔离潜在恶意文件的重要安全机制。