首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Velocity Beijing 2015
O'Reilly Velocity
Web Performance and Operations
http://velocityconf.com/
YSlow
Best Practices for Speeding Up Your Web Site
华为云
V2EX  ›  Velocity

类似知乎等的图片服务域名采用 zhimg.com 而不是 img.zhihu.com,有什么优点吗

  •  4
     
  •   sincway · 2015-02-14 17:11:57 +08:00 · 11244 次点击
    这是一个创建于 1373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Google 等也喜欢这么干,类似 googlevideo.com、google-analytics.com 等域名用来分管某个服务。这样做的好处是什么?应该不只是偏好问题吧?

    感觉这样做应该有原因的,子域名也可以单独指定 NS 记录的,用起来和顶级域名区别也不大..

    另外在自己开发 App 时只用一个域名有缺点吗?Thanks
    49 回复  |  直到 2015-03-04 15:31:42 +08:00
        1
    Livid   V2EX Moderator   2015-02-14 17:15:25 +08:00   ♥ 10
    如果 Cookie 的数据量很大,那么用单独的图片域名就不会需要在每一个图片请求时都包括 cookie 数据,可以节约流量,提高性能。
        2
    14ly   2015-02-14 17:17:22 +08:00   ♥ 1
    感觉以前有类似帖子?还有单域最高并发限制和安全因素
        3
    msg7086   2015-02-14 17:17:56 +08:00   ♥ 1
    防止cookie在子域名上发送。
        4
    msg7086   2015-02-14 17:18:40 +08:00
    (是不是应该加一句欢迎回到地球→_→
        5
    sincway   2015-02-14 17:20:22 +08:00
    @msg7086 好吧。还是学生,对大项目接触不多,没想到这个...
        6
    KyonLi   2015-02-14 17:20:28 +08:00 via Android   ♥ 2
    国内的话可能有一部分监管的原因吧,如果有一个子域名下出现不和谐内容可能导致整个挂掉,用不同主域名可以规避这样的问题
        7
    a2z   2015-02-14 17:23:57 +08:00   ♥ 1
    利用同源策略,安全。
        8
    skybr   2015-02-14 17:30:42 +08:00   ♥ 2
    除了上面几位说的, 还有就是浏览器对同一个域的并发数有限制.
        9
    zhicheng   2015-02-14 17:35:27 +08:00 via Android   ♥ 31
    能回答出 Cookie 的,给 2 分。能补充浏览器连接数限制的,加 2 分。能再补充 TCP慢启动的(这是缺点)加 3 分。能再补充浏览器渲染之类的,再加 3 分。至今仍没有人答出来过,虽然面过的前端不多。
    =========
    这是我常用的面试题,在一个 thread 里回复过。
        10
    Gary   2015-02-14 17:36:33 +08:00   ♥ 1
    浏览器对同一个域的并发限制
        11
    weisoo   2015-02-14 17:37:38 +08:00
    什么cookie什么并发数量,都不重要,重要原因就是6楼所说的
        12
    BlueFly   2015-02-14 17:38:40 +08:00
    @zhicheng 惨了,连@Livid 都2分严重低分这怎么破?
        13
    sincway   2015-02-14 17:39:04 +08:00
    @zhicheng 请问和浏览器渲染有什么关系呢?
        14
    sincway   2015-02-14 17:40:23 +08:00   ♥ 1
    @weisoo Youtube 也有 ytimg.com 的... 它不需要考虑什么监管吧
        15
    nsa   2015-02-14 17:49:09 +08:00 via iPad
    @BlueFly 规则和技术也是会更新的,也给你2分,呵呵,够么?不够再随便加,和印钞票似的。。
        16
    zhicheng   2015-02-14 17:50:40 +08:00 via Android
    @BlueFly Cookie 已经对了~
    @sincway 你可以研究一下 HTML 里边引用资源的位置和响应速度对整个页面的影响,以及HTTP协议的特点。
        17
    zhicheng   2015-02-14 17:52:33 +08:00 via Android
    显然Cookie是有性能和安全双重影响的。
        18
    xiezefan   2015-02-14 17:55:17 +08:00
    @zhicheng Hi, 能科普下这个和 TCP慢启动 有什么关系么? 科普了下 TCP慢启动指在建立连接后,主键增加数据包的发送量, 以防止出现大量数据包造成网络堵塞的问题. 暂时联想不到这个这个问题的关系
        19
    s51431980   2015-02-14 17:59:17 +08:00
    我感觉楼主问的主要是 “用 zhimg.comimg.zhihu.com ”,所以 cookie 是主要考虑因素

    如果问“用 img.zhihu.com/some.jpgzhihu.com/some.jpg ”,连接数才是主要考虑因素

    @Livid 的答案足够了
        20
    kaneg   2015-02-14 18:10:32 +08:00 via iPhone
    子域名应该和主域名的连接数是分开控制的吧
        21
    anouser   2015-02-14 18:16:15 +08:00
    @zhicheng 详细说说对浏览器渲染有啥影响?没理解,至于css javascript放到html头还是尾和域名用啥是两回事吧。

    浏览器有并发限制,动态内容用一个域名,静态内容用一个域名会加快资源的载入速度且不会阻塞。
    当然,你还要考虑dns解析的时间,多一个域名,浏览器就要多解析一下。这在移动网络下是一个问题,尤其是你的网站是全球可访问的时候。chrome有dns预解析的技术,在桌面上这个问题不大。
    另外cookie不用发过去,加快访问速度,并且可以防止子网站出现漏洞,整个站点的session被劫持的影响。
        22
    anjianshi   2015-02-14 18:30:21 +08:00   ♥ 2
    https://developer.yahoo.com/performance/rules.html
    见 Use Cookie-free Domains for Components 小节,针对楼主的问题,说的已经很详细了
        23
    raincious   2015-02-14 18:33:21 +08:00   ♥ 5
    主要其实还是Cookie的问题。并发数只是另一方面,因为img.zhihu.com和zhihu.com被浏览器视为两个域名,会各自并发进行下载。

    zhimg.com是接收不到给zhihu.com设置的Cookie的,但是img.zhihu.com能收到,所以这是主要原因。

    http://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work

    但这又是双刃剑了。DNS查询每个域名需要时间,HTTP需要重新启动握手请求等等。所以这不意味着你能滥用多域名并发的好处。

    > 另外在自己开发 App 时只用一个域名有缺点吗?Thanks

    这取决于你要怎么干了。如果你设置了xxxx.com的Cookie,这就意味着所有到达xxxx.com以及xxx.xxxx.com的HTTP访问都会被带上Cookie,显然这不利于优化。

    但是如果你仅仅只给比如app.xxxx.com设置了Cookie,那么无论是aaa.xxxx.com或bbb.xxxx.com又或是assets.xxxx.com还都是访问不到的。

    不过这样太麻烦了不是么?
        24
    fising   2015-02-14 18:34:35 +08:00 via iPad
    img.zhihu.comwww.zhihu.com 不是同一个域,应该没有浏览器并发限制吧?@zhicheng
        25
    Showfom   2015-02-14 19:33:35 +08:00 via iPhone
    楼主还有一个事情 DNS 服务器其实不联系用同一个后缀的 参考 AWS ROUTE 53
        26
    lyragosa   2015-02-14 19:36:05 +08:00
    还好我们100人小网站界从来不考虑这种事情xd
        27
    zhicheng   2015-02-14 20:33:45 +08:00
    @raincious @kaneg @s51431980
    知道一了,不知道有二?难道 yahoo 和 youtube 的 yimg.comytimg.com 用的是裸域?

    @anouser
    你需要非常仔细的补充一下 HTTP 方面的知识,如果之后还不明白,干脆当我在瞎掰吧。
        28
    Smartype   2015-02-14 21:01:45 +08:00 via iPhone
    @zhicheng 沟通,交流。共同成长。其实我也好奇这和浏览器渲染有什么关系。希望明示,瞎掰也愿意听听/看看
        29
    denghongcai   2015-02-14 21:23:31 +08:00
    @zhicheng 我也好奇,希望明示
        30
    zhicheng   2015-02-14 21:27:11 +08:00   ♥ 18
    @Smartype
    那我简单说一下,HTTP 协议 的特点是无状态,所以 HTTP 协议只能做到,
    请求1->回复1->请求2->回复2
    在 keep-alive 的时候就没有这么弱了,但依然受限于 HTTP 无状态,只能做到 ,
    请求1->请求2->回复1->回复2

    那么为什么这和浏览器渲染有关系,其实没关系,如果你设计得好。但设计得不好就有关系了,如果你把 css,js和img放到同一个 hostname 下,并且请求顺序可能会成为 img->css->js 或 css->img->js 或 js->img->css 那么问题就来了,如果一个 img 尺寸是 500K ,那么不管 css 和 js 有多小,依然要等着img返回之后才能返回。

    所以,完整的正确的答案是。
    1,Cookie ,减少流量增强性能并且降低安全隐患。
    2,降低连接数限制造成的阻塞。
    3,增加了连接数,所以多了慢启动。
    4,小资源快速返回,使网页渲染更加迅速。
        31
    denghongcai   2015-02-14 21:36:29 +08:00   ♥ 1
    浏览器对DOM树的解析是按照顺序而来的,除非你把img写到最前面,这样才会有影响。这是基本的开发原则,有人把img放到head里来加载的?
        32
    dant   2015-02-14 21:52:22 +08:00   ♥ 3
    @zhicheng keep-alive 的工作方式是
    请求1--(等待)->回应1-->请求2--(等待)->回应2 ... 请求n--(等待)->回应n
    ------------------------------------ 连接1 --------------------------------------------
    请求n+1--(等待)->回应n+1-->请求n+2--(等待)->回应n+2 ... 请求2n--(等待)->回应2n
    ------------------------------------ 连接2 --------------------------------------------------------------

    你所说的方式属于 pipelining, HTTP/1.1, SPDY 和 HTTP/2 有实现。但是 HTTP/1.1 pipelining 在大部分浏览器上都是默认禁用的,Chrome 甚至直接移除了这个功能。
        33
    zhicheng   2015-02-14 22:08:34 +08:00
    @dant 你说的对,这是 pipelining 之后的 keep alive 。
        34
    raincious   2015-02-14 22:20:22 +08:00   ♥ 1
    @zhicheng

    所以感谢你解释了HTTP加载顺序的问题,回答挺完善。但,这一点答主根本就没有问啊 :D

    如果真的想了解的话可以参考: https://developers.google.com/web/fundamentals/performance/critical-rendering-path/?hl=zh-cn

    建议你再补充一点细节,比如Firefox等对img等外链标签的优化,是如何让它们在分析完HTML之后让JavaScript和CSS(Render Blocking Points)一直优先加载的 :)
        35
    zhicheng   2015-02-14 22:24:14 +08:00
    @raincious
    哈哈,我就猜肯定会有人说“楼主根本就没有问这个”。所以我说少了不是,说多了也不是。毕竟我前边已经说了,如果不明白,当我瞎掰好了。
        36
    qiuai   2015-02-14 22:28:51 +08:00   ♥ 3
    @zhicheng 其实对于问得出这种问题的人,就没必要说这么多.

    让他们自己看看YSlow的评分标准就是了...

    我本来想回答,不过想了想就没回...因为你也不知道他问这个的目的是什么...
    如果他是前端,他又不关注服务器的部分,如果他是后端,他又不关注前端和渲染的部分...
    所以我现在在V2EX不回这种问题了.回了还会被人质疑,弄的跟自己是笨蛋似的...
    最无奈的就是会有人挖坟来跟你对峙...我前天就遇到了一个...也是无奈.
        37
    coolcfan   2015-02-15 00:06:47 +08:00
    变相增加代理自动切换规则编写难度=.=(开个玩笑)
        38
    kiritoalex   2015-02-15 00:53:35 +08:00 via iPhone
    twitter→t.co
    感觉很多案例都是如此
        39
    sophymax   2015-02-15 01:22:25 +08:00 via iPad   ♥ 1
    技术上的原因livid说的很靠谱,在国内还有一些其他顾虑,比如去年acfun的A岛出现不和谐内容,被有关部门发现,随后域名商完全停止了解析,视频站和A岛用的同一个主域名,所以A站就因为一个辅助功能而被封域名了,acfun.com域名到现在还不能用,可以认为com域名是永久封杀了。对国外的,域名被盗的话,这个情况也很麻烦,鸡蛋都在一个篮子里了
        40
    myliyifei   2015-02-15 02:57:47 +08:00
    @anouser chrome的DNS异步解析,默认没有开吧
        41
    myliyifei   2015-02-15 02:58:40 +08:00   ♥ 1
    @sophymax A站的CEO现在被关在北京。。。失联中
        42
    111111111111   2015-02-15 08:23:53 +08:00 via Android
    感谢本楼各位回复的大神,大开眼界
        43
    flyz   2015-02-15 09:10:04 +08:00
    @myliyifei A岛也关闭了,再也不能愉快的丧尸了。。。╭( ̄m ̄*)╮
        44
    skyline75489   2015-02-15 12:42:53 +08:00
    @dant 为什么现在的浏览器会默认关闭 pipeline 呢?开启的话对加载速度应该有一点提示吧
        45
    tolerious   2015-02-15 14:27:40 +08:00
    脑洞大开
        46
    soulgeek   2015-02-15 19:00:39 +08:00
    之前看到各种图片cdn却没有深究,受教了!
        47
    vileer   2015-02-16 11:06:30 +08:00
    @raincious app只用一个域名我觉得问题应该不大,因为写app的时候很少会用cookies传递信息,做认证类的一般都是带token,其他的按需加参数就好了
        48
    Biwood   2015-02-16 12:49:42 +08:00 via Android
    涨姿势了,之前做过这种项目,但是没有深究
        49
    emonber   2015-03-04 15:31:42 +08:00   ♥ 1
    @skyline75489 HTTP pipelining 要求:服务端需要将响应按顺序返回,在上一响应完全应答之前,不能发送下一响应。比如客户端按顺序请求了 /html 和 /css,服务端需要按顺序返回 /html 和 /css 响应。

    考虑这样的场景,服务端并行处理客户端的请求,/css 响应先于 /html 生成,但 /css 响应需要等待 /html 响应生成后才能发送,这就产生了阻塞延迟——线头阻塞(head-of-line blocking)。

    除此之外,HTTP 服务器对响应的缓存还会造成性能损失,而对客户端请求数量的未加限制还容易引发对服务器的攻击。

    出于上述原因,部分 HTTP 服务器、代理并未实现 HTTP pipelining,或实现不正确(比如,并行化处理而不考虑应答顺序)。浏览器厂商由于担心线头阻塞的影响或是 pipelining 被代理破坏(所有请求都得重新发送),也大多采取保守的选择(默认关闭 HTTP pipelining 选项)。

    更多信息可以参考这里:
    http://chimera.labs.oreilly.com/books/1230000000545/ch11.html#HTTP_PIPELINING
    http://stackoverflow.com/questions/14810890/what-are-the-disadvantages-of-using-http-pipelining
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   764 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 20ms · UTC 19:10 · PVG 03:10 · LAX 11:10 · JFK 14:10
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1