V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
imdjh
V2EX  ›  云计算

我是认真的,请不要使用七牛 对象存储,特别是基于 HTTP 的“免费服务”

  •  
  •   imdjh · 2017-11-08 21:03:24 +08:00 · 17039 次点击
    这是一个创建于 2578 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近捣鼓了一个小脚本,把国外 feed 拉到七牛 对象存储,国内客户端拉起来更快嘛。因为“对开发者”免费,做做实验挺不错的。我也算七牛老用户了,刚开 https 那会儿就申请了,记得当时还要充钱才能申请的。闲话就说这么多。


    可是在使用中遇到这些问题,请诸位留意这些坑(如果你看完觉得这都是小意思,还要继续用的话):
    0. HTTPS 流量均收费(只是提一下)
    1. 对于绑定过 HTTPS 的 bucket。请求 HTTPS 得到的 max-age 和设置页面是一致的。而 HTTP 链接则是 max-age 时长一周(不会被改动)。
    2. 上一点提到了,如果你用 HTTP 请求,那么你的文件(我的情况是 xml ),会被地域节点缓存一周。而且你请求 HTTP 返回的是 200,不是 304 http not-modified。对于 HTTP 请求,我试过联通宽带、电信手机、移动手机、甚至挂**国内代理** 和国外 vps 都能得到新旧不同的版本。
    3. 删除一个文件后。过 30 分钟,照旧能访问,无论 HTTP 或是 HTTPS。

    对于第 2 和第 3 点,我想请诸位玩一个游戏。访问同一资源的 HTTP 和 HTTPS 链接,回复下你得到的 xml 内容和所在地里位置。
    如果包含‘ 5 楼‘,那么就是昨天的热榜内容。如果有’鹦鹉‘那么就是今天的。当然啦,还可能被删除了,op 于 8:22 操作的删除。
    HTTP==》 http://7xo6xf.com1.z0.glb.clouddn.com/v2ex-hot-topic.xml
    HTTPS==》 https://dn-imdjh.qbox.me/v2ex-hot-topic.xml
    第 1 条附言  ·  2017-11-09 08:48:15 +08:00

    感谢各位的回复,现附上事件更新。

    由于七牛给出的外链接“无法删除”,重新创建了一个bucket,改掉代码中所有涉及bucket字段。

    先说结果吧,外链内容依旧不更新。

    为了防止出现“用人脑无法理解”的回帖,这里附上步骤截图,所有截图均已上传wayback machine.

    0.创建bucket,华东地区。

    bucket showbox

    1. 主机,使用官方工具qshell最新发布。根据官方文档(github)强制指定上传主机为回源为 HTTP协议的华东源站 非“加速”站点。执行命令

    2. 立即查看本地和外链SHA1哈希值。

    3. 等待超过max-age的时间后,重新查看外链SHA1哈希值。

    vps showbox

    华东地区客户端视角,执行如下验证

    1. 立即查看外链SHA1哈希值。

    2. 等待超过max-age的时间后,重新查看外链SHA1哈希值。

    local showbox

    现初步结论,max-age和外链内容是否更新 无关

    初步假设,七牛对象存储提供的外链不调用 刷新cdn缓存API 就不更新 内容。


    PS,诸位看清楚了,至始至终我针对的都是 对象存储的外链内容

    提供的外链和上传的内容不一致,难道应该强行甩锅给 cdn 概念?哦,那为什么之前用 https就是没问题的 呢?(这个新开的bucket没有申请https协议的CDN服务)

    第 2 条附言  ·  2017-11-09 22:34:36 +08:00

    感谢各位的友善回帖,作为时隔原帖24小时后的第二篇附言。这里我本人先给七牛道歉。你们的存储做的很好,这不假,可就是用户找不到对象。所以这“对象存储”产品就是个玩笑

    本次遇到的问题中,使用的都是官方发布最新工具,如图为证:

    tool SHA1 hash

    官方文档对于缓存更新只字未提,archive.is网页存档为证:

    https://developer.qiniu.com/kodo/api/1312/upload

    https://github.com/qiniu/qshell/blob/master/docs/fput.md

    作为开发者群体中的一员,我可能是被提供更抽象的CDN机制“惯坏了”,可不能否认的是所谓“门槛”说难听点就是一个深坑,官方还以为用户能知道文档只字未提(第二遍强调)。

    我觉得再怎么解释这都是不该出现的结果。请扪心自问下,用户上传数据要干什么?难倒是给你们源站磁盘添光增彩?(对此的验证请参见附言第一篇)

    退一步说,撇开别的不谈。为什么同样是对象存储服务,HTTPS协议的外链被主动更新了,HTTP的没有更新?

    最后说下解决方案吧,感谢L11层@提供的链接,调用七牛的CDN刷新API,官方文档见此。实际项目中可以参考这个小脚本qiniu_renew_helper.sh


    FYI:

    1. 原帖中的HTTP内容经过24H仍然没有被主动发现删除。本人没有对此执行API缓存刷新,也不想这么做。目的有二:窥探一个过期URL到底多久能被主动发现,提醒读者在删除七牛“对象存储”后一定要调用CDN刷新API

    2. 是在捣鼓这个项目V2EX 最热主题 RSS 源 - 非官方 /t/404766时发现的,有兴趣的可以点击看详情。

    3. 七牛的CDN刷新API 并没有你想象中那么可靠。写了这篇帖子引来不少人骂我,痛定思痛,某些事还得靠事实说话。

    写了个小脚本循环拉取CDN内容和本地进行对比。临时执行作为抽查提供的CDN缓存健康状态,源码见qiniu_validator.sh,演示外链如下:

    asciicast

    以上

    Thu Nov 9 22:33:08 CST 2017

    第 3 条附言  ·  2017-11-12 23:56:04 +08:00

    承蒙各位厚爱,这里是附言3,也是v2ex允许的最后一条附言。HTTP的内容依旧存在,距删除当日已经过去4天,已经试过使用缓存刷新API能够实现删除文件。

    相信诸位或多或少看过了附言2中的演示视频。因为在无意中看CDN日志发现在视频演示中出现过,但从没贴过文字链接的私人用feed地址被广为盗用,占总CDN日流量的 94%

    wth with v2ex people

    人群分布:

    wth with these place

    请求UA:

    wth with ua

    po的荷包不足以支持诸位爬虫大佬爬私人资源,故删除泄露的私人feed资源,用OPML形式公开泄露订阅源的新地址,文件opml.xml

    以上,

    Sun Nov 12 23:54:10 CST 2017

    46 条回复    2017-11-15 13:58:52 +08:00
    falcon05
        1
    falcon05  
       2017-11-08 21:33:33 +08:00 via iPhone
    删除要手动刷新 url 吧?
    Chalice
        2
    Chalice  
       2017-11-08 21:37:04 +08:00
    {"error":"Document not found"}
    gy6221
        3
    gy6221  
       2017-11-08 21:38:47 +08:00   ❤️ 1
    妖都
    http5 楼,https document not found
    allenhu
        4
    allenhu  
       2017-11-08 21:40:22 +08:00 via Android   ❤️ 3
    你没用过 cdn 吧
    imdjh
        5
    imdjh  
    OP
       2017-11-08 21:42:35 +08:00
    忘记了最终要的一点,自己补充下(刚才气疯了,下楼跑了几圈):
    4. /!\HTTP 协议下的回源策略有严重问题 /!\

    展开说下,
    首先是前提:相信各位都知道”回源“是涉及 cdn 的术语,可是我标题写的是”对象存储“。没错,七牛自带 cdn,无论你用不用”融合 cdn “(其实就是 https 协议的 cdn )主机位于国外,工具是官方的 qshell 最新发布版。用的是 qshell fput,看过文档就是道,fput 是需要一个本地文件作为参数的。


    再是我遇到的问题: 本地文件被更新过了,qshell 返回正常退出(我手工运行过,过程 success )。但是 HTTP 协议下的文件没有被更新。这里你可以说是 op 中提到的第一点 max-age 的问题,本地节点已经缓存了。好吧,强制你用 https 咯?

    FYI:
    如果想说”回源更新需要时间的呀”,这里明确告诉你,我等了 24h,脚本每小时运行一次,也就是 24 次的更新 24H 的时长,可是依旧是 24H 前的版本。
    imdjh
        6
    imdjh  
    OP
       2017-11-08 21:43:12 +08:00
    @allenhu 见 L5,忘记了说一点。
    imdjh
        7
    imdjh  
    OP
       2017-11-08 21:44:16 +08:00
    @falcon05 这是七牛比较好的一个方面,和 dropbox 一样的,美丽的 url。
    imdjh
        8
    imdjh  
    OP
       2017-11-08 21:46:44 +08:00
    @gy6221
    @Chalice
    感谢回复,请问 HTTP 和 HTTPS 均是无法访问吗?
    我这边 HTTP 和 HTTPS 均能访问。

    FYI:
    我这边的测试工具一直都是 curl
    imdjh
        9
    imdjh  
    OP
       2017-11-08 21:49:08 +08:00
    @allenhu 如果你觉得回源更新可以长达 25+次,还毫无反应,那我无话可说。

    对了,我的设备都比较蠢,没法用常用的 http://example.com/xxxx.js?random-hash
    难道这些设备就应该被排除在 cdn 使用范围外么?
    imdjh
        10
    imdjh  
    OP
       2017-11-08 21:51:53 +08:00
    @gy6221 对了,忘记说。
    恭喜,这个 feed 被成功缓存 1 周~
    记录下时间戳吧:Wed Nov 8 21:51:43 CST 2017
    quericy
        11
    quericy  
       2017-11-08 22:50:08 +08:00
    记得七牛的回源是遵循客户端请求协议的回源,http 访问会是 http 的回源,https 访问会是 https 的回源

    不过七牛的回源确实有时候在一些节点上很迷,主动刷新的 url 拉取还会有问题
    MinonHeart
        12
    MinonHeart  
       2017-11-08 23:19:11 +08:00
    我七牛账户的余额就是不给退,无奈╮(╯▽╰)╭
    imdjh
        13
    imdjh  
    OP
       2017-11-08 23:19:55 +08:00
    @quericy
    感谢回复, **回源是遵循客户端请求协议的** 这个我原来不知道。客户端使用的是 qshell,刚才看了文档,说是自动选取的上传节点。估计是给传到国外源站咯。我再等 24H 看下指定了 HTTP 源站点时,是否有还会复现。

    之所以那么气氛,是因为出现了在 HTTP 协议下(免费流量):
    1. 联通宽带 - 老版本
    2. 电信手机 - 老版本
    3. 移动手机 - 新版本
    4. 江苏电信(网上被扫出来的代理) - 老版本
    5. 国外 - 老版本

    这不一致情况让人无比抓狂。
    imdjh
        14
    imdjh  
    OP
       2017-11-08 23:22:25 +08:00
    附上截图:
    https://web.archive.org/web/20171108151432/

    从国外主机访问 HTTPS,文件依旧存在。
    sexrobot
        15
    sexrobot  
       2017-11-08 23:28:41 +08:00
    自己不知道 CDN 的机制,还出来秀智商。
    imdjh
        16
    imdjh  
    OP
       2017-11-08 23:36:45 +08:00
    @sexrobot 呵呵
    imdjh
        17
    imdjh  
    OP
       2017-11-08 23:41:34 +08:00
    @sexrobot 事实都写进 wayback machine 了,还要舔?
    仅凭借文件删除 3 小时未更新这一点来说,这个“对象存储”呵呵,可以叫做小 wayback 了吧。

    不说别的,我现在的处境就是,改动所有涉及到 bucket 的代码。
    为什么?因为文件删除不了,我需要新创建一个 bucket,才能“改动”文件。
    jellybool
        18
    jellybool  
       2017-11-08 23:45:11 +08:00
    所有我半年前转 upyun 了
    liangchaoboy
        19
    liangchaoboy  
       2017-11-08 23:49:40 +08:00   ❤️ 1
    cdn 基于边缘节点缓存,设置 加速域名缓存规则(指边缘节点的缓存时间)短些或者
    更新文件后刷新 cdn 缓存,api 接口 : https://developer.qiniu.com/fusion/api/1229/cache-refresh
    rrfeng
        20
    rrfeng  
       2017-11-09 00:44:17 +08:00 via Android
    我竟然不知道说什么好。。。

    花这么长时间吐槽,都足够研究一下到底是为什么了。
    pynix
        21
    pynix  
       2017-11-09 00:46:57 +08:00
    就这智商,基本靠别对象。。。储存了。。。
    dangyuluo
        23
    dangyuluo  
       2017-11-09 05:33:28 +08:00 via iPhone
    你可以试试将删除这个时间手动通知一下更新 CDN 边缘节点?
    Trim21
        24
    Trim21  
       2017-11-09 06:17:08 +08:00 via iPad
    @imdjh 没能用人脑还原出这个标签原本的样子。。。你原来是想发啥?
    colordog
        25
    colordog  
       2017-11-09 07:05:47 +08:00 via iPhone
    我能说我注册了账户几年没用过,然后再登录提醒我欠费账户冻结,联系销售代表么,连登录进去看看的资格都不给我
    kimown
        26
    kimown  
       2017-11-09 07:22:06 +08:00 via Android
    从一开始接触到现在用,觉得七牛的 cdn 做的挺烂的,还有 js sdk 也烂,但不得不用,也许他们主要业务不是 cdn,不理解删除或者修改文件后,不主动清空缓存,需要在地址上附加 url 是什么脑回路
    renothing
        27
    renothing  
       2017-11-09 07:46:12 +08:00
    楼主可能对 cdn 有什么误会。
    大概说一下,CDN 有两类,一类是 push 方式主动更新节点的。一类是 pull 方式被动更新节点的。楼主说的情况大概是后一类。
    imnpc
        28
    imnpc  
       2017-11-09 08:20:44 +08:00
    配置个 https 需要 24 小时
    有商最慢不过几小时
    psirnull
        29
    psirnull  
       2017-11-09 08:30:37 +08:00 via iPhone
    被七扭坑过几千块, 之前注册后测试传了东西忘了删,过了一年提示欠费几千块,每个月还不停累加, 就起靠这样骗钱的。
    49gd
        30
    49gd  
       2017-11-09 08:32:22 +08:00
    @renothing 楼主的槽点可能是明明是对象存储 整的跟 cdn 一样
    imdjh
        31
    imdjh  
    OP
       2017-11-09 08:54:39 +08:00
    @renothing 感谢友善回复。可能七牛就是你说的第二类,需要手动调用刷新缓存 API 来更新。有时间我会更新下的。另外,已验证并非 11L@quericy 所说的按照上传站点的协议更新。

    很搞不懂 https 外链内容就是好的。可能官方做 https 的时候用心了吧 =]
    imdjh
        32
    imdjh  
    OP
       2017-11-09 08:56:22 +08:00
    @49gd Bingo,感谢友善回复。没错,我调用的一直是“网页控制台”给出的“外链”。
    OneNian
        33
    OneNian  
       2017-11-09 09:11:09 +08:00 via iPhone
    七牛不适合频繁更新
    我是这样觉得
    就算加了 url 后缀,文件仍然不能更新,而是又缓存了一个“新文件”,但是七牛 web 后台也只能看到那个没更新的文件。
    所以最好像 ghosts 那样,静态文件加个 ?xxxx
    OneNian
        34
    OneNian  
       2017-11-09 09:14:57 +08:00 via iPhone   ❤️ 1
    只能被动,去手动刷新,才能让所有节点都更新。
    不同节点可能会缓存到不同版本。
    zangbob
        35
    zangbob  
       2017-11-09 09:43:37 +08:00   ❤️ 1
    我就不明白你们,为了那一点儿免费用,天天跟七牛折腾,费不费劲呐。。

    又拍的价格也不贵,随便充点儿钱,再加个联盟,可劲儿用都够了。
    SourceMan
        36
    SourceMan  
       2017-11-09 09:45:11 +08:00
    我是认真的,按照你的描述,某里云一样是 laji
    zhchyu999
        37
    zhchyu999  
       2017-11-09 10:29:26 +08:00
    七牛提供免费服务,获得了一个仇人
    slgz
        38
    slgz  
       2017-11-09 13:56:34 +08:00
    的确,七牛是有这样一个问题, 比如同一个 bucket, 然后相同的文件名(路径也相同), 最后存的图片还是节点缓存的图片, 不是新的图片,
    imdjh
        39
    imdjh  
    OP
       2017-11-09 22:45:01 +08:00
    @slgz 请麻烦看下原帖附言 2,其实是七牛没告诉我们每次变动都要调用 CDN 刷新 API。可笑的是,HTTPS 就没这个问题。

    我自己测试成功了,希望你改了代码后也能顺利 =]

    FYI:
    官方文档链接==》 https://developer.qiniu.com/fusion/api/1229/cache-refresh
    imdjh
        40
    imdjh  
    OP
       2017-11-09 22:47:31 +08:00
    @liangchaoboy 非常感谢你提供的文档,问题完美解决。HTTP 内容在 2 分钟左右就被更新。

    监控节点在华东和美国。用的是单一 URL 作为参数的刷新。希望能给之后的用户一个参考。更多内容请见原帖附言 2
    imdjh
        41
    imdjh  
    OP
       2017-11-09 22:53:00 +08:00
    @SourceMan 哈哈,我的立场一直是七牛。就事论事,友商没用过不敢下结论。不能说是恨铁不成钢,像是被“儿子”给坑了的那种感觉吧。
    cjpjxjx
        42
    cjpjxjx  
       2017-11-10 11:44:53 +08:00 via iPad
    很早就发现了这个问题,WordPress 博客用了七牛加速之后,有时候在服务器上修改了一个 css 样式,保存之后,清除浏览器缓存,刷新页面,无效,登录七牛控制面板,刷新缓存,还是无效,直接删除七牛上的文件,依旧无效,访问文件外链,居然还能访问??一般遇到这情况,都是等个几十分钟到几个小时后才好
    bubue
        43
    bubue  
       2017-11-10 23:10:11 +08:00
    可以设置实时更新的呀,都不知道吗?- -
    imdjh
        44
    imdjh  
    OP
       2017-11-10 23:20:19 +08:00
    @bubue 你好,我使用了“七牛 实时更新”作为关键字搜索了谷歌和百度,前 5 条结果均没有相关回答。
    如果能配置的话,还请点明告知,谢谢。
    a32b88z
        45
    a32b88z  
       2017-11-12 21:18:30 +08:00
    借楼主的地盘吐槽一下新浪的 SCS.

    新浪 SCS 用了大半年,虽然感觉它就是基本上抄袭 amazon 的 s3,但总体感觉还行,反正算「能用」吧。

    但上周 1 突然发现不能访问,访问时报错「 ip 非法请求」,俺使用其 api 时是绑定了访问者的 ip 的。但用了好几个月,怎么突然出现这种错误呢?

    向新浪提交了工单,过了 2 个小时,有了第一次回复,新浪征求我的意见竟然是:您能取消 IP 限制吗?

    没想到竟然有这种回复。我马上答复「必须要限制 ip 访问」,因为我在 SCS 上都是存放的企业信息。如果云上的资源不能限制 IP, 谁还改用?

    然后,过了大概 1 小时,恢复正常访问。
    cgnbkm
        46
    cgnbkm  
       2017-11-15 13:58:52 +08:00
    最初把 css 放七牛也发现文件不刷新,就给文件加个版本号,h5 里面引用新文件即可。如果需要禁止访问删除的文件,只能刷新 cdn,一般情况下不用管的。
    就为这破事折腾这么久,真是闲得蛋疼.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:45 · PVG 10:45 · LAX 18:45 · JFK 21:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.