web 服务器如何代理缓存一个静态页面? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
firsthym
V2EX    问与答

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

  •  
  •   firsthym 2017-07-18 08:54:26 +08:00 3247 次点击
    这是一个创建于 3061 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家好,
    我的 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     Solana     5691 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 86ms UTC 02:48 PVG 10:48 LAX 18:48 JFK 21:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86