IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    未雨绸缪

    obaby发表于 2024-03-04 02:03:20
    love 0

    宜未雨绸缪,胜似临渴而掘井。自从打定主意要把闺蜜圈的服务迁移回国内之后,各种准备工作就已经开始。一面在准备服务器迁移的事情,另外一个是华为应用商店的上架。期间经过无数次拉扯之后,终于在上周一通过了,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请求里面?现在的程序员都这么牛逼了吗?靠这几行代码,简单的几句话就知道怎么用了?看来还是老了,脑子活动不了了,跟不上节奏了。

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

    The post 未雨绸缪 first appeared on obaby@mars.



沪ICP备19023445号-2号
友情链接