本文作者:刘鹏

原创声明:本文为阅文前端团队 YFE 成员出品,请尊重原创,转载请联系公众号 ( id: yuewen_YFE ) 获取授权,并注明作者、出处和链接。

之前我们的文章(文章链接)也有介绍过,Webnovel (起点海外)在去年年初就将首页以及全部阅读页都接入了 Google 的 AMP 技术,并且从体验和数据上来说都取得了不错的效果。在去年年底我们又进行了一次迭代,把更多的阅读页内容也加入到了 AMP 当中。用户可以在 Google Search 当中搜索到我们的小说内容,并且很快就可以进行阅读。但是同时我们也发现了一些问题,用户在搜索结果的第一个落地页显示的内容是我们的,但是 URL 却是 Google 的 URL。虽然 Google 在顶部加了一个 m.webnovel.com 来源的标识,但是很多用户依然会误解,并且给我们的统一品牌宣传带来了影响。

显然 Google AMP 团队也注意到了这一点,在去年年底的时候推出了 AMP WebPackage 技术来解决这个问题。

WebPackage 背景

讲到 Package,大家可能想到的都是 Webpack,Rollup,Parcel 这些打包工具。而我们这次讲的是 Web Package。Web Package 解决了什么问题呢?它可以让你把你的文件打包给第三方,但是浏览器访问的时候却可以识别出来你真实的域名。我想很多同学第一反应就是想到 CDN,因为现在 CDN 都是托管在第三方的云厂商,为了在云厂商配置我们自己的域名,我们必须把自己的证书私钥配置在云厂商的后台管理页面上,这样可以实现用户访问的是云厂商的 CDN 服务器但是显示的却是我们自己的域名。这种操作带来两个问题,一个是存在着被第三方云厂商泄漏我们证书私钥的风险,另一个是证书过期的时候要记得去第三方平台更新。而 Web Package 就是用来解决这些问题的。

Web Package 的这个特性也正好可以用来解决我们上面发现的问题。

之前的 Google AMP 技术可以让用户在 Google Search 搜索结果页面当中非常迅速地进入到搜索结果页面。为了保证加载速度尽可能地快,Google Search 其实是将符合 AMP 标准的页面缓存进 Google 的 CDN 当中,当命中搜索结果的时候,再从 Google CDN 中加载进来,从而保证了非常快的加载速度。这其实跟我们平常使用 CDN 加速是一样的。必然会带来一个问题,就是展示出来的页面 URL 是 Google 的地址,而非我们自己的域名地址。就如图 1 所示。

为了解决上面的问题,让用户有更好的体验,Google AMP 团队在去年将 Web Package 引入到了 AMP 技术当中。我们也有幸成为了首批接入这个技术的国内发布商。在昨天刚刚结束的 Google AMP 2019 会议上,也得到了 Google 官方的认可。

实现 Web Package 中的 Signed-HTTP-Exchanges

在接入 AMP Web Package 过程中,最重要的一步是将我们的内容返回给 Google 爬虫,而这些内容是需要使用我们的证书进行加密的,这个技术称为 Signed-HTTP-Exchanges (缩写为 SXG)。下面我们将详细介绍如何实现 SXG 并最终在从 Google Search 结果无缝浏览我们的站点。

整个操作不算复杂,一共分为以下三步:

1. 从你的 CA 厂商那获取一个支持 SXG 的证书

这是最重要的一步。如上所述,返回给 Google 爬虫的内容需要使用证书进行非对称加密。而这个证书是必须拥有一个 SXG 的扩展。截止此文章发布日期,只有 Digicert 证书颁发商是支持颁布此类型证书的。并且此证书必须使用 EC 密钥(非 RSA 密钥)以及 prime256v1 算法生成。

需要注意的是,这个证书仅用来给返回谷歌爬虫的 AMP 文档进行加密。之前接入层是什么证书依旧使用什么证书,是没有影响的(需要注意生成新证书不能导致现在在用的旧证书被颁发商吊销)。

2. 在服务器上按照 amppackage 官方步骤部署 amppkg

部署 amppkg 没有什么值得说明的,唯一需要注意的是 amppkg 的配置文件。要捕获请求参数的时候需要加上 QueryRE = “.*”,其他也没有要特别注意的。

amppkg.toml
----------
Port = 'port listening'
CertFile = 'path/to/fullchain.pem' # SXG cert from your CA
KeyFile = 'path/to/privkey.pem' # SXG cert key
OCSPCache = '/tmp/amppkg-ocsp'
[[URLSet]]
[URLSet.Sign]
Domain = "amppackageexample.com"
QueryRE = ".*" # to capture query string
复制代码

3. 配置 AMP SXG 回源

下面是简单的 AMP SXG 回源的架构图。

然后就是配置回源接入层了,为了更详细描述这个问题,我们画一个 Webnovel AMP 的回源流程图。

现在 Google 爬虫抓取 SXG 加密的 AMP 文档会有两次请求操作。第一次是一个正常的爬取操作,如果后台是支持给 SXG 加密的 AMP 内容文件的,则可以在返回的 header 头上加上 Vary: AMP-Cache-Transform,Accept,Google 爬虫识别到这个 header 头之后就可以进行第二次爬取操作,并且会在 header 头上带上 AMP-Cache-Transform: google 用来跟第一次爬取操作进行区分。我们的接入层反向代理在识别到这个头部之后,将请求转发到对应的 amppkg server,amppkg server 将对应的内容返回给爬虫即可。

虽然我们给 amppkg server 配置了一个证书,但是这个证书仅用来对内容进行加密,连接是不加密的。所以我们的反向代理转发到 amppkg server 依然用 http 而非 https。

upstream amppkg { proxy_pass http://IP:PORT; }
upstream webnovelBackend { proxy_pass http://IP:PORT; }
location ^~ /amp/ {if ($http_amp_cache_transform = "google") {rewrite ^/(.*)$ /ampSXG/$1 last;break;}# allow google to fetch SXG (Signed Exchange AMP HTML)add_header Vary "AMP-Cache-Transform, Accept";proxy_pass         http://webnovelBackend;
}
location ^~ /ampSXG/ {# some detail omittedproxy_pass         http://amppkg/priv/doc/https://m.webnovel.com/;
}
# this location is for browser to get cert for verifying SXG document
location ^~ /amppkg/ {proxy_pass         http://amppkg/amppkg/;
}
复制代码

到了这里就完成了整个后台的配置,可以用官方提供的方法来进行验证。要想正式环境(Chrome 73 以及以上才支持 SXG 功能)验证就需要等待一段时间,让 Google 爬虫来爬取这些 SXG 加密的 AMP 文档内容了。

结果展示

下面是 Webnovel 在实现 SXG 之后的一个演示视频。

接入了 AMP Packager 之后的 AMP 和之前有什么区别呢?虽然我们的数据还不够多,但是我们分析结果看来,最终跳出率,以及每 session 浏览的页面数对比之前都得到了比较好的优化。待 Chrome 73+版本得到更多普及之后数据会更加明显,后续再跟大家进行分享。

Tips: 有一个小技巧,正常情况下从 Google Search 引流过来的用户只能享受第一个落地页面的 Google Cache 加速。后续就是我们自己网站的内容了,需要我们自己进行接入优化。但是很多时候在全球化的接入能力上,我们相对 Google 来说还是偏弱的。有没有什么办法让用户尽可能地都浏览 Google Cache 缓存里面的页面呢?在用户需要进行一些进一步操作的时候,我们再切到我们自己的页面。我们研究了一下发现还是可行的。我们的 AMP 页面对应 Google Cache 中的地址是有一个映射关系,比如说我们的 Webnovel AMP SXG 首页对应 Google Cache 缓存的地址就是 m-webnovel-com.ampproject.org/wp/s/m.webn… ,我们在页面当中跳转的 AMP SXG 页面都换成对应的 Google Cache 地址就满足了我们的需求,即有效利用了 Google Cache 又让用户像在我们自己站点上操作一样。 视频如下:

引用文章:

  1. medium.com/@lewpengfei…
  2. github.com/ampproject/…
  3. www.digicert.com/account/iet…
  4. github.com/WICG/webpac…

查看更多分享,请关注阅文集团前端团队公众号:

转载于:https://juejin.im/post/5cb97f446fb9a0686362dd22

Google AMP WebPackage 在 Webnovel 的应用相关推荐

  1. 关于 AMP,Webnovel 都做了些什么?

    本文作者:任家乐 原创声明:本文为阅文前端团队 YFE 成员出品,请尊重原创,转载请联系公众号 ( id: yuewen_YFE ) 获取授权,并注明作者.出处和链接. 引言 AMP 是什么?它全称 ...

  2. 消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

    消除安卓SDK更新时的"https://dl-ssl.google.com refused"异常的方法 消除安卓SDK更新时的"https://dl-ssl.google ...

  3. 2018 Google kickstart Problem A. Planet Distance

    题目描述 Small dataset 3 ≤ N ≤ 30. Large dataset 3 ≤ N ≤ 1000.input 2 5 1 2 2 3 3 4 2 4 5 3 3 1 2 3 2 1 ...

  4. Google Colab 免费GPU服务器使用教程 挂载云端硬盘

    一.前言 二.Google Colab特征 三.开始使用 3.1在谷歌云盘上创建文件夹 3.2创建Colaboratory 3.3创建完成 四.设置GPU运行 五.运行.py文件 5.1安装必要库 5 ...

  5. Google Colab——用谷歌免费GPU跑你的深度学习代码

    Google Colab简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究.这款工具现在可以免费使用,但是不是永久免费暂时还不确定.Google Col ...

  6. Google Colab使用教程

    简介 Google Colaboratory是谷歌开放的云服务平台,提供免费的CPU.GPU和TPU服务器. 目前深度学习在图像和文本上的应用越来越多,不断有新的模型.新的算法获得更好的效果,然而,一 ...

  7. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

  8. Google Pixel 超分辨率--Super Resolution Zoom

    Google Pixel 超分辨率–Super Resolution Zoom Google 的Super Res Zoom技术,主要用于在zoom时增强画面细节以及提升在夜景下的效果. 文章的主要贡 ...

  9. Error:Could not download guava.jar (com.google.guava:guava:19.0): No cached version available for of

    今天从git导入demo 报错 Error:Could not download guava.jar (com.google.guava:guava:19.0): No cached version ...

最新文章

  1. grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)
  2. Android中动态更新ListView
  3. 怎么让图片手机上排列_PS手机卷轴样机,分分钟让图片变得高大上!
  4. boost::hana::zip_shortest用法的测试程序
  5. hadoop关键进程
  6. 电路维修(信息学奥赛一本通-T1448)
  7. 添加mysql组合主键_mysql怎么添加复合主键?
  8. Linux 命令(50)—— date 命令
  9. 打开计算机打不开运行错误怎么办,注册表打不开,电脑出错注册表编辑器打不开怎么办?...
  10. Thinkbayes_Chapter5
  11. 〖Linux〗Ubuntu13.10搭建文件共享Samba服务器
  12. 科学使用Live2D的方法
  13. 【2019年04月23日】股市指数估值排名
  14. 用ZeroTier搭建属于自己的虚拟局域网(VLAN)
  15. CSDN论坛--提问的智慧
  16. # 开发 VR 多人游戏的技术挑战
  17. php多张图片制作成视频教程,如何将多张图片转换成视频?快速制作电子相册的方法...
  18. HDU 6461 hzy 和zsl 的生存挑战
  19. ISP pipeline之lens shading correction
  20. tf计算矩阵维度_tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)

热门文章

  1. c语言dp状态转移方程,[总结-动态规划]经典DP状态设定和转移方程
  2. 分布式信息采集服务器,Plumber分布式数据采集系统(一)架构与监控心跳
  3. _网站建站基础第十一课(域名解析服务器环境linux安装宝塔)
  4. java中关于DecimalFormat四舍五入的用法
  5. 升降压斩波电路matlab,升降压斩波电路matlab仿真.doc
  6. python存储numpy数据为文件_numpy.savetxt是否将数组保存到文件中的特定位置?
  7. python3 列表_Python3 列表生成
  8. java多线程 门闩_Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)...
  9. php中的header头,PHP中常用的header头部定义
  10. FZ25/FZ35 恒流电子负载