V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
firsthym
V2EX  ›  问与答

web 服务器如何代理缓存一个静态页面?

  •  
  •   firsthym · Jul 18, 2017 · 3506 views
    This topic created in 3219 days ago, the information mentioned may be changed or developed.
    大家好,
    我的 centos linode 主机编译了 apache 和 mariadb,用 wordpress 搭了一个游戏资讯类网站( www.mists.cn ),里面用到了第三方 js 库(以下简称 gw2armory ),gw2armory 又会去自己的服务器和游戏官方的 wiki 取数据(我没有具体研究过这个库,估计应该是这样的实现)。现在的问题是:
    用户请求一个我的网站页面非常慢,一方面是因为 apache 服务器在新加坡,二是因为 gw2armory 在用户浏览器端又要去请求、并实时生成页面内容。
    我在想,因为绝大部分页面是不会改动的,能不能我服务器端先去运行第三方 js 库 gw2armory,生成一个静态缓存页面,然后大陆用户就能直接请求这个静态页面。
    有点像代理?是吗?具体怎么做请指点一下。如果有其他优化建议,也请告诉我。谢谢!
    Supplement 1  ·  Jul 18, 2017
    我再补充一下场景:
    我的域名是 mists.co ,现在的页面里面有一个 js 请求:
    <script async="" src="https://gw2armory.com/gw2aEmbeds.js"></script>
    这个第三方 js 负责生成我的页面内容。我现在想缓存它生成的页面内容为一个静态文件。可以实现吗?
    Supplement 2  ·  Jul 18, 2017
    再描述清楚一点:
    用户请求我的网站 mists.cn ,请求的页面一部分是我的 apache 服务器 wordpress,另一部分则是第三方 js 动态生成的。由于第三方 js 请求的国外主机动态生成很慢。能否提前缓存一个 html 呢?
    16 replies    2017-07-18 16:24:05 +08:00
    jarlyyn
        1
    jarlyyn  
       Jul 18, 2017 via Android
    首先,你需要的是反向代理。其次,编译 Apache 也是闲的蛋疼,有这功夫不如上 nginx。
    firsthym
        2
    firsthym  
    OP
       Jul 18, 2017
    @jarlyyn 反向代理需要用户设置浏览器吗?
    jarlyyn
        3
    jarlyyn  
       Jul 18, 2017 via Android
    @firsthym

    不需要。反向是给服务器做代理。
    firsthym
        4
    firsthym  
    OP
       Jul 18, 2017
    @jarlyyn 反向代理生成的页面如何缓存成静态页面呢?
    jarlyyn
        5
    jarlyyn  
       Jul 18, 2017
    @firsthym

    用 http 服务器的缓存功能。

    一般这种操作都是 nginx 做的。apache 的反代做过,缓存不熟
    firsthym
        6
    firsthym  
    OP
       Jul 18, 2017
    @jarlyyn 谢谢你的回复。
    我的问题是,如何缓存第三方 JS 渲染的页面为一个静态 html 页面?
    timwei
        7
    timwei  
       Jul 18, 2017
    激战 2 好游系呀

    要不试试本地起个 node,常驻去 gw2armory 爬取数据后放 redis/memcached。

    自己的服务就只需要从本地的数据库拉取数据
    jarlyyn
        8
    jarlyyn  
       Jul 18, 2017
    @firsthym

    一般这样缓存都是 js 和数据都缓存。不太可能去缓存 js 渲染的页面。

    同时这样的缓存一般还要进行原始地址的替换。
    firsthym
        9
    firsthym  
    OP
       Jul 18, 2017
    @timwei 我很喜欢这个游戏!谢谢你的建议。你的意思是,搭一个 Nodejs 服务器,然后去爬 gw2armory 的数据吗? nodejs 没有玩过,但它也是去官方 API 抓取数据哦。gw2armory 是一个开源项目,但是我没研究过,看不大懂。。
    firsthym
        10
    firsthym  
    OP
       Jul 18, 2017
    @jarlyyn 有没有服务器端模拟浏览器的 mod?你说的原始地址转换,是不是可以通过 rewrite mod 来实现呢?
    jarlyyn
        11
    jarlyyn  
       Jul 18, 2017
    @firsthym

    可以有办法渲染,但是各种 js 事件都无法执行,意义实在一般
    firsthym
        12
    firsthym  
    OP
       Jul 18, 2017
    难道这种靠 js 来渲染出的页面就没有办法缓存吗?有没有什么浏览器容器跑在 server 上的?或者 nodejs server 可以执行出 html 输出页面吗?
    timwei
        13
    timwei  
       Jul 18, 2017
    我做完 Predator 就退坑了,之后 Rifle Warrior 好像就砍刀了哈

    ---

    看了下你的站,接这库多用在表示 build 中的游戏装备数据。

    要不自己接官方 Wiki API 储存下会用到的数据?
    firsthym
        14
    firsthym  
    OP
       Jul 18, 2017
    通过 node.js 似乎找到了一个解决方案,phantomjs ?
    timwei
        15
    timwei  
       Jul 18, 2017
    phantomJS/Selenium 等模拟浏览器的方案,应该是无法。

    毕竟只能存下渲染后的 html

    但是 js 绑定的事件并没有办法
    timwei
        16
    timwei  
       Jul 18, 2017
    举个栗

    拿 phantom 渲染 <div class="gw2-slot" data-armory-embed="items" data-armory-ids="24702"></div>

    的确会跑出:

    <div class="gw2-slot" data-armory-ids="24702">
    <div data-reactroot="" class="ky25a gw2a-items-embed">
    <div class="_2iSAg _2s9vh _2fMTs _8i8np _2TpFq">
    <div class="_2iSAg _2s9vh d0pLi" style="background-image: url(&quot;https://render.guildwars2.com/file/FEF77764F24C0548271F29337268970C092DA5D3/220717.png&quot;);">
    </div>
    </div>
    </div>
    </div>

    可是这元素绑的 mouseover 事件却存不了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2897 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 15:27 · PVG 23:27 · LAX 08:27 · JFK 11:27
    ♥ Do have faith in what you're doing.