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

2017-07-18 08:54:26 +08:00
 firsthym
大家好,
我的 centos linode 主机编译了 apache 和 mariadb,用 wordpress 搭了一个游戏资讯类网站( www.mists.cn ),里面用到了第三方 js 库(以下简称 gw2armory ),gw2armory 又会去自己的服务器和游戏官方的 wiki 取数据(我没有具体研究过这个库,估计应该是这样的实现)。现在的问题是:
用户请求一个我的网站页面非常慢,一方面是因为 apache 服务器在新加坡,二是因为 gw2armory 在用户浏览器端又要去请求、并实时生成页面内容。
我在想,因为绝大部分页面是不会改动的,能不能我服务器端先去运行第三方 js 库 gw2armory,生成一个静态缓存页面,然后大陆用户就能直接请求这个静态页面。
有点像代理?是吗?具体怎么做请指点一下。如果有其他优化建议,也请告诉我。谢谢!
2884 次点击
所在节点    问与答
16 条回复
jarlyyn
2017-07-18 09:20:01 +08:00
首先,你需要的是反向代理。其次,编译 Apache 也是闲的蛋疼,有这功夫不如上 nginx。
firsthym
2017-07-18 09:31:19 +08:00
@jarlyyn 反向代理需要用户设置浏览器吗?
jarlyyn
2017-07-18 09:37:23 +08:00
@firsthym

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

用 http 服务器的缓存功能。

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

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

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

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

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

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

---

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

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

毕竟只能存下渲染后的 html

但是 js 绑定的事件并没有办法
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 事件却存不了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/376064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX