未雨绸缪

宜未雨绸缪,胜似临渴而掘井。自从打定主意要把闺蜜圈的服务迁移回国内之后,各种准备工作就已经开始。一面在准备服务器迁移的事情,另外一个是华为应用商店的上架。期间经过无数次拉扯之后,终于在上周一通过了,https://appgallery.huawei.com/#/app/C110023409

于是也更新了一下官网的下载链接,把华为应用商店的地址加进去了,这份胜利来之不易。

https://dayi.ma

虚拟机

本来是想着备案通过之后,再写一篇文章。然而域名备案预计 11 天完成,到现在已经半个月了还在审核阶段,这种事情也没有什么办法,只能耐心等待。

之前也提过,为了备案买了一台阿里云一年 99 块钱的虚拟机。本来是想把服务部署到这台虚拟机上的,但是感觉性能有点太拉跨。就放弃了这个想法,把之前在腾讯清凉云海外部署的 moe-counter 和 umami 给迁移到了这台服务器上,同时也换了个备案的域名。为了解决服务的问题,在腾讯清凉云上又买了一台服务器。服务的迁移部署好处理,但是域名切换且有点麻烦。

新服务器部署之后,原有的域名要么通过 cdn 反代,要么通过 nginx 反代,但是这两种代理由于一个在国内,一个在国外。并且原来用的域名没有备案,cdn 反代可用率并不高,经常会出现各种诡异的问题。另外一个方法就是继续保留原有的服务运行,数据库链接新系统的数据库。这样基本可以保证接口以及数据可用性。

随之而来的是另外一个问题,如果继续有用户用原有的接口上传文件就会让文件停留在旧服务器上。清凉云服务器开通的时候一个月一块钱买了 cos 存储,但是这个轻量云存储却没有设置文件回源的功能,这么一来就没法使用系统自动回源了。使用 cos 进行文件存储的意义也就不大了,目前主要是头像文件。虽然文件不大,不多,但是访问不到确实让人觉得有些恶心。

之前用的文件服务并没有使用 nginx 进行文件访问,正好,这样也就给了根据文件状态进行回源的可能性。直接重新定义 django 的 404 错误。针对文件进行独立处理:

def page_not_found(request,exception):
    # 全局404处理函数
    raw_uri = request.get_raw_uri()
    # print('raw uri',request.get_raw_uri())
    if ('media/files' in raw_uri) and ('from=source' not in raw_uri):
        req_path = request.path
        # req_p=request.get_full_path()
        # print('path=' ,req_path)
        redirect_uri = raw_uri.replace(settings.HOST,settings.RHOST)+'?from=source'
        save_path = settings.MEDIA_ROOT + req_path.replace('media/', '')
        print(redirect_uri)
        # print('save path=', save_path)
        # 将远程文件保存到本地
        sp = Path(save_path)
        if not sp.parent.exists():
            sp.parent.mkdir(parents=True,exist_ok=True)
        http_req = requests.get(redirect_uri)
        if http_req.status_code == 200:
            with open(save_path, 'wb') as f:
                f.write(requests.get(redirect_uri).content)
            return HttpResponseRedirect(redirect_uri)
    response = render(request,'404.html')
    response.status_code = 404
    return response

对于文件请求,如果本地不存在,直接向原始服务器请求相关的资源如果状态为 200 保存文件并且重定向到远程服务器地址,如果远程服务器返回错误,直接返回 404错误,那么当接口再次访问上次访问的文件时候应该就可以从本地进行拉取。当然,这个接口没有考虑现成安全的问题也没有锁,但是鉴于现有的这点点用户量接口访问应该也不会太频繁,应该也足够能应付当前的状况。

HttpDns

之前说过的另外一个问题就是域名劫持,这个问题目前移动端比较通用的解决方案就是使用 httpdns。阿里和腾讯都提供了这个服务,并且有一定的免费额度。微信小程序也提供了相关的功能,然而 uniapp 在集成的时候却发现相关的文档异常的匮乏,基于 uni.request实现的 httpdns 基本找不到,唯一能够找到的腾讯的插件,代码里面的功能让人摸不着头脑。
插件是 20 年的,到现在已经过去了 3 年,没有任何的更新,文档也只是简单的介绍了一下如何进行接入,而接入之后便没了任何文档。
给出的文档地址更是挂掉的:https://openapp.qq.com/docs/DCloudUni-app/httpdns.html
不过依赖于互联网博物馆,我还是找到了相关的文档:
https://web.archive.org/web/20220707140157/https://openapp.qq.com/docs/DCloudUni-app/httpdns.html#_1-%E6%8F%92%E4%BB%B6%E4%BB%8B%E7%BB%8D
然后顺藤摸瓜,找到了示例代码地址:https://github.com/obaby/tencentcloud-uniapp-plugin-example/blob/master/pages/httpdns/index.vue 这个是我 fork 的。源代码看腾讯的。
代码更是简单,

 methods: {
    // 设置域名
    setValue(e) {
      this.domainName = e.target.value;
    },
    // 开始DNS解析
    async startResolution() {
      try {
        uni.showLoading({
          mask: true
        });
        this.status = true;
        this.ipArr = [];
        const params = {
          domainName: this.domainName,
          isEnc: true
        };
        const result = await describeDnsResult(params);
        this.ipArr = result.split(';');
        this.domainText = this.domainName;
        uni.hideLoading();
      } catch (error) {
        uni.showToast({
          icon: 'none',
          title: error.message
        });
      } finally {
        this.status = false;
      }
    }
  }
};

就一个请求解析,解析完之后呢?这个结果怎么用?怎么放到 uni.request请求里面?现在的程序员都这么牛逼了吗?靠这几行代码,简单的几句话就知道怎么用了?看来还是老了,脑子活动不了了,跟不上节奏了。

哎,还说什么未雨绸缪,但是绸缪就已经无从下手。

☆版权☆

* 网站名称:obaby@mars
* 网址:https://lang.ma/
* 个性:https://oba.by/
* 本文标题: 《未雨绸缪》
* 本文链接:https://loli.gifts/2024/03/15722
* 短链接:https://oba.by/?p=15722
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

38 comments

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      其实也还好,毕竟已经完成了各种备案。
      在国内被监管也属于正常。不过就是流程太繁琐,太长了。
      让人精疲力尽。

  1. Level 4
    Microsoft Edge 123 Microsoft Edge 123 Windows 10 Windows 10 cn广东省广州市 联通

    我本想回归祖国怀抱,奈何这些虾J8流程太恶心。一次次放弃,就只能在海外漂泊

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      是的,太恶心了。
      要想回归,明知道恶心也得忍着。

  2. Level 3
    Google Chrome 122 Google Chrome 122 Windows 10 Windows 10 cn甘肃省庆阳市 电信

    这个折腾劲真是厉害,良心云买了个域名,现在几个月了,都没有勇气开始备案。

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      人生在于折腾,永不休止。
      现在开始吧,开始了就感觉没那么难了。

  3.  Level 5
    Firefox 123 Firefox 123 Windows 10 Windows 10 cn云南省昆明市 电信

    其实国内备案已经蛮快,多走几次就轻车熟路了,现在我都是如果官方没啥问题一般提交文件一次性过,估计阿里腾讯备案以及我常备的几个省审核员都有些熟悉我了,近一次备案显示20天,8天就过了出乎意料。最后一段文字感同身受呀,我这个不懂技术的,真是看着很多官方文档头疼,比如近期docker搭了密码托管网站,官方文件给了个自定义页面模板的方法,但只讲存放自定义模版的目录名叫上,文件怎么命名绝口不提,害得我去官方网站英语求助,到现在没人回复,估计人家看不懂我英语哈。

  4.  Level 5
    Firefox 123 Firefox 123 Windows 10 Windows 10 cn云南省昆明市 电信

    地址显示好像咱用的都不准了,显示昆明,刚开始还显示丽江。咱用得估计是同一个库,但是也有人的博客显示正确。

    1. 公主 Queen 
      Google Chrome 120 Google Chrome 120 Windows 10 Windows 10 cn山东省青岛市 联通

      纯真的数据库经常更新,不过更新之后也不见得更准确。

  5.   Level 3
    Google Chrome 121 Google Chrome 121 Windows 10 Windows 10 cn江西省 移动/数据上网公共出口

    备案等待是真的折磨

  6.  Level 3
    Google Chrome 122 Google Chrome 122 Windows 10 Windows 10 cn河北省秦皇岛市 电信

    这么强的项目,支持,以后给我未来女朋友用

    1. 公主 Queen 
      Google Chrome 120 Google Chrome 120 Windows 10 Windows 10 cn山东省青岛市 联通

      小程序的备案还是挺快的。腾讯的效率比工信部高多了。

  7. Level 2
    Microsoft Edge 122 Microsoft Edge 122 Windows 10 Windows 10 cn云南省昆明市 联通

    备案最晚也就20天,最早一个周吧,一些地方的管局审核是真的快,有些3天 dance

  8.  Level 5
    IBrowse r IBrowse r Android 12 Android 12 cn河南省漯河市 联通

    好事多磨,等不久的将来全部顺利搞定,期间的种种曲折艰辛历程完全可以攻略出书了,根据真人真事改编。 cool

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      嗯嗯,你说的很对。嘻嘻,昨天终于通过了。
      不过这种改变没人看啊,太普通了,就是普通程序媛的一天,嘻嘻

    1. 公主 Queen 
      Google Chrome 120 Google Chrome 120 Android 10 Android 10 cn山东省青岛市 联通

      ecs不就是虚拟主机吗?哈哈哈 不过叫ecs显得高级点而已。虚拟服务器 虚拟主机差不多 都一样垃圾。 mail

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注