V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
firsthym
V2EX  ›  问与答

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

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

    不需要。反向是给服务器做代理。
    firsthym
        4
    firsthym  
    OP
       2017-07-18 09:56:18 +08:00
    @jarlyyn 反向代理生成的页面如何缓存成静态页面呢?
    jarlyyn
        5
    jarlyyn  
       2017-07-18 10:03:14 +08:00
    @firsthym

    用 http 服务器的缓存功能。

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

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

    自己的服务就只需要从本地的数据库拉取数据
    jarlyyn
        8
    jarlyyn  
       2017-07-18 12:46:41 +08:00
    @firsthym

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

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

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

    ---

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

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

    毕竟只能存下渲染后的 html

    但是 js 绑定的事件并没有办法
    timwei
        16
    timwei  
       2017-07-18 16:24:05 +08:00
    举个栗

    拿 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 事件却存不了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:03 · PVG 23:03 · LAX 07:03 · JFK 10:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.