现场演示是各地专业演讲者的噩梦。即使是最充分准备的现场演示也可能因无法预见的原因而出错。当您在 300 人面前的舞台上时,发生这种情况是很糟糕的。远程 Web 应用的现场演示充满了风险,以至于大多数人会找到其他方式来展示它们。屏幕截图永远不会失败,本地沙箱也不会在超负荷的会议互联网连接上失败。但是,如果我们无法及时为演讲设置本地沙箱怎么办?如果我们的数据库庞大而复杂怎么办?如果我们的应用具有动画和交互,而我们无法用屏幕截图展示怎么办?
如果您可以录制 Web 应用程序的使用情况,然后在正确的时间重放存储的响应,那会怎么样?幸运的是,代理 HTTP(Web 浏览器和 Web 服务器用来相互通信的协议)很容易。这意味着您可以在浏览器和服务器之间放置一个中介来做任何您想做的事情。通常,代理会执行内容过滤(例如,公司过滤器、家长过滤器)。代理可以将数据缓存在更靠近用户的服务器上,以加快网站速度。
在本教程中,我将以类似的方式使用 Web 代理:我将缓存我的内容,并将缓存的数据提供给我的 Web 浏览器。但是,我将在与 Web 浏览器相同的机器上运行我的代理。而且,我将把它设置为仅缓存我想要的东西。这样,我就可以在不稳定的连接上运行现场演示。
安装和配置 Squid HTTP 代理
首先,我需要安装和配置代理。我在 Mac 上,所以我通过 Homebrew(MacOS 的免费软件包管理器)安装了 Squid HTTP 代理。安装代理后,我需要对其进行配置。
对于我的现场演示,我想缓存我尝试演示的应用程序以及应用程序需要的任何其他内容。缓存任何其他内容都是不必要的。为此,Squid 使用 访问控制列表 (ACL)。我将配置一个 ACL,其中包含我要缓存的域列表,并拒绝其他所有内容。为了最大程度地覆盖,我将主机名和 IP 地址都添加到 ACL 中。由于 HTTP 代理也用于 DNS,因此大多数时候代理都在查找 DNS 记录。但有时浏览器已经知道 IP,并且只会告诉代理从 IP 获取。
这是我的域名和 IP 列表
acl cacheDomain dstdomain beta.cpantesters.org
acl cacheDomain dstdomain api.cpantesters.org
acl cacheDomain dstdomain www.cpantesters.org
acl cacheDomain dstdomain 212.110.173.51
acl cacheDomain dstdomain cdnjs.cloudflare.com
前三个域是我正在运行的应用程序。第四个是我的应用程序服务器的 IP 地址;所有域都在同一台机器上。最后一个是 CDNJS,JavaScript 内容分发网络 (CDN),我从中获取我的 JavaScript。为了使我的应用程序工作,我需要缓存我依赖的来自 CDNJS 的所有 JavaScript 和 CSS。
一旦我列出了我想缓存的内容,我就可以禁止缓存任何其他域
cache deny !cacheDomain
接下来,我需要告诉 Squid 将我的缓存放在哪里以及使用多少磁盘空间。Homebrew 的 Squid 配置文件中注释掉了一行 cache_dir。我需要启用它并增加可用的磁盘空间,以确保我的数据保持缓存状态。当磁盘空间用完时,Squid 开始删除旧的缓存数据,这在我演示期间是不能发生的。
# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /usr/local/var/cache/squid 1024 16 256
行尾的第一个数字是缓存大小,以 MB 为单位,我将其调整为 1024 (1GB)。
最后,我必须确保我可以使用 Squid 的管理 API,并且它仅对本地机器开放。这应该是默认设置,所以我查找这些 http_access 行,如果它们不存在,则添加它们。
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
在允许从 localhost 访问缓存管理器后,我需要禁用缓存管理器密码
cachemgr_passwd none all
我完成了 配置文件。现在我已经配置了我的代理,我可以启动它了。在 Homebrew 中,命令是 brew services start squid,但您的平台可能有不同的要求。此命令启动代理并等待请求。接下来,我需要配置我的浏览器以使用代理。
配置 Web 浏览器
为 HTTP 代理配置 Web 浏览器取决于您使用的浏览器和操作系统。如果您在 MacOS 上使用 Chrome 或 Safari,您可以转到“系统偏好设置”来配置代理。但是,如果您使用 Firefox,您可以配置浏览器以使用代理,而让系统的其余部分保持不变。其他操作系统有其他配置代理的方法,因此您应该查看操作系统的文档。
有一些用于管理 HTTP 代理的优秀浏览器插件。如果您使用的是 Chrome,请尝试 Proxy SwitchyOmega,对于 Firefox,请使用 FoxyProxy Standard。不幸的是,Safari 或 Internet Explorer 没有好的代理插件选项。
运行演示以缓存内容
配置好代理后,我可以运行演示来测试它。我需要在良好的互联网连接上执行此操作。当我运行演示时,我的浏览器将要求代理获取演示的所有数据。当代理执行此操作时,它会将数据缓存在磁盘上。由于我的计算机在线,Squid 将遵循 Web 服务器要求的缓存规则。这意味着缓存特定的时间长度,并可能重新验证数据以查看它是否已更改。
当我运行演示时,我应该确保我的缓存正在被使用。最简单的方法是读取 Squid 的日志。在我的配置中,它位于 /usr/local/var/logs/access.log。里面是这样的行
1498020228.970 203 ::1 TCP_MISS/200 3653 GET http://beta.cpantesters.org/chart.html? - HIER_DIRECT/212.110.173.51 text/html
1498020229.523 314 ::1 TCP_REFRESH_MODIFIED/200 8130 GET http://api.cpantesters.org/v3/release/dist/Statocles - HIER_DIRECT/212.110.173.51 application/json
此行的重要部分是 URL 和状态。TCP_MISS/200 表示“此请求不在我们的缓存中,并且远程服务器返回了 200 OK HTTP 响应。” TCP_REFRESH_MODIFIED/200 表示“此请求在我们的缓存中,但我们从远程服务器刷新了它,远程服务器返回了 200 OK HTTP 响应。” 这是我的缓存正在构建和刷新自身,因为我在稳定的连接上。一旦我的缓存中有一些数据,我就会开始看到这样的内容
1498063273.261 0 ::1 TCP_INM_HIT/304 299 GET http://beta.cpantesters.org/chart.html - HIER_NONE/- text/html
1498063281.831 0 ::1 TCP_MEM_HIT/200 8187 GET http://api.cpantesters.org/v3/release/dist/Statocles - HIER_NONE/- application/json
TCP_INM_HIT/304 表示“缓存使用 304 Not Modified 响应来响应此请求。” TCP_MEM_HIT/200 表示“缓存使用 200 OK HTTP 响应来响应此请求。” 这些是我想要的响应:缓存正在提供响应,而不是远程服务器。
运行演示
现在我的缓存在稳定的连接上运行良好,我可以在不稳定的连接上运行我的演示了。首先,我想确保我的缓存不尝试访问远程服务器(即,它在 Squid 的“离线”模式下运行)。为此,Squid 有一个名为 squidclient 的管理客户端,我可以使用它来切换离线模式。
$ squidclient mgr:offline_toggle
HTTP/1.1 200 OK
Server: squid/3.5.26
Mime-Version: 1.0
Date: Tue, 04 Jul 2017 21:16:36 GMT
Content-Type: text/plain;charset=utf-8
Expires: Tue, 04 Jul 2017 21:16:36 GMT
Last-Modified: Tue, 04 Jul 2017 21:16:36 GMT
X-Cache: MISS from gwen.local
Via: 1.1 gwen.local (squid/3.5.26)
Connection: close
offline_mode is now ON
Squid 的离线模式最大限度地减少了获取远程内容的尝试。由于我已经通过运行演示缓存了所有内容,这意味着 Squid 将提供我的演示。
所以现在我可以在任何地方运行我的演示而不用担心!所有远程内容都由本地机器提供,因此会议 WiFi 的好坏都无关紧要。只要我坚持使用我已经缓存的内容,我的 Web 应用程序就可以完美运行。
评论已关闭。