有人要求我确定在火车上的移动服务器上镜像或缓存网站的可行性。不幸的是,这个问题在最后一刻被抛给了我,我必须在一两天内给出答案,而我在这方面没有太多经验。
该列火车为:
- 长途客运公司
- 并非始终连接到互联网(它进出 3G 手机信号塔的范围)
- 在覆盖范围内时将使用 3G 调制解调器连接互联网
当超出服务范围时,客人应该能够继续访问以前访问过的网站。这些将是客人在火车外生活中可能会访问的一般网站,我们无法控制。还会有一些网站被缓存或自动“拉入”,例如新闻和时事,这些网站不一定是由客人发起的。
我知道我们可以镜像或缓存访问过的页面,但我担心我们操作的“环境”。
- 我看到的大多数镜像站点都与互联网保持永久连接,更新通过 wget 或类似工具从主站点传播。间歇性连接会如何影响此过程?
- 这应该与访问者输入站点的正常 URL 无缝衔接。如果 3G 不可用或未过期,则应显示缓存页面;否则应从原始网站加载(并缓存以供以后使用)。镜像 URL 是否可行,还是我们需要自己的域名?
- 我需要让访客知道他们何时超出范围。我认为,当浏览器无法访问页面时,显示自定义版本的错误页面,但由服务器提供,这将是可行的方法。合理吗?
- 我认为我们还需要做一些特殊的事情来管理通过 CDN 提供的内容。(我怀疑我们需要在这个服务器上提供大量存储空间。)我说得对吗?
- 我不确定这个术语(这会妨碍搜索)有人能指出我想要做的正确的术语吗?
如果您能向我提供任何其他资源,我将不胜感激。
谢谢。
答案1
我认为可行性相当低,你必须考虑以下问题,结合这些问题,我认为排除“可用”或透明的离线镜像的可能性。
如今,HTTP 流量越来越普遍,如果不在设备上安装 CA 证书,您将无法缓存该流量,而用户应该非常犹豫是否要这样做。
许多网站的运行严重依赖客户端 HTTP 请求(即 AJAX),并且大多数情况下,网站会通过在 URL 后附加时间戳来避免 AJAX 请求被缓存,以便每个请求都被视为唯一的 URL。
您基本上可以排除任何有状态的网站(即需要登录的网站)——显然,您无法缓存某人 X 的 Facebook 个人资料,除非他们已经查看过,即使他们已经查看过,如果没有实时更新,这些网站的价值也会大大降低。此外,这意味着您的缓存查找必须依赖于 cookie 的值,因此降低了您访问其他人先前请求的页面的机会。
大多数人如何访问网站?人们很少输入 URL,通常他们搜索一些东西 - 即使是他们知道 URL 的东西,例如 Facebook。尝试缓存复杂的搜索引擎结果将是一个挑战,因为它们可能是有状态的(例如,如果您在登录 Google 帐户时搜索 Google,您的结果将有所不同)
浏览网页时,新内容与之前看过的内容相比所占的百分比是多少?即使在浏览经常访问的网站(如 Facebook)时,您也会频繁点击新页面等。
有些网站现在使用 WebSockets,不确定具体细节,但我认为模拟/重放 WebSockets 交互会很困难。
如果您有理由相信您的用户将在大部分时间内访问同一组页面(例如一组文档)并且这些内容没有状态,那么这可能是可行的。
答案2
我实际上设置了与此非常相似每年一次的为期一周的活动都在偏僻的地方举行,所以我有一点经验可以分享。
首先,TL;DR:您可以这样做,但效果远不如您(或您的上级)所希望的那样好。可能不值得费心,尤其是当中断时间很短时。但您可能还是想这样做,以节省带宽并在连接到 3G 时提供更快的体验。
您正在寻找的组件是透明代理,拦截客户端不打算代理的传出 HTTP 请求,并将其转移到代理服务器。squid 是最常见的软件用于透明代理。这是我用的。
其工作原理是:交换机或路由器将拦截发往远程地址 80 端口的数据包,并对其进行处理,使它们最终连接到代理。然后,它会检查其缓存,如果缓存未命中,则会进入网络。典型的代理操作。我使用一些简单的 Linux iptables 规则进行这种转移,尽管许多路由器和交换机也可以配置为执行此操作。
为了达到您的目的,您还需要对 squid 的配置进行一些重大调整,以覆盖其缓存处理。特别是,当它无法在网络上重新验证过时的缓存项时,您将希望使其提供过时的缓存项。我没有现成的配置,因为在我的设计中这不是必需的,因为我处于固定点并拥有连续的无线服务。但仔细阅读一些文档应该会建议一种方法来做到这一点。
您还需要创建一些自定义的 Squid 错误页面,这些页面与您的公司相关,并解释预期的各种服务中断情况。
现在说说缺点。
您根本无法通过 HTTPS 请求做到这一点。虽然 Squid 支持一种方法拦截 HTTPS 请求与 HTTP 请求类似,您将无法使用它,因为它需要创建 CA 并在每个客户端的浏览器中安装证书。对于企业来说这很容易,但对于公共服务来说却不是。即使您可以这样做,它也根本不方便用户使用,会在任何注重隐私的人心中敲响警钟,而且在某些国家这样做是违法的。
此外,如今许多网站都在使用 WebSockets,几乎总是会失败当涉及透明代理时,因为代理——做它应该做的事情——会把升级请求弄得面目全非。除了建议用户明确使用代理服务器外,您几乎无能为力。在这种情况下,浏览器知道使用 HTTP CONNECT 以不同的方式格式化请求,以便它能够不受干扰地通过代理。
最后,在与一些熟悉澳大利亚火车旅行的人交谈后,我了解到这些中断有时会持续 10 到 15 分钟。你对此几乎无能为力;在这段时间内浏览网页的人很可能会尝试点击您尚未缓存的网站链接,而你的情况也并不比现在好多少,尽管如果你有缓存,你至少可以告知乘客这种情况(至少在 HTTP 上)。当互联网断线时,乘客最好向窗外看,试图发现纳拉伯仙女。
还有一些基本统计数据。去年,该服务使用了 42 GB 的数据,并从缓存中提供了额外的 17GB。今年,该服务使用了 87 GB 的数据,而从缓存中仅提供了 744 MB。这不是计算错误,据我所知,也不是配置错误。去年和今年缓存之间的主要差异似乎在于,现在更多主要网站强制使用 HTTPS。例如,去年我可以缓存一些 YouTube 视频。今年我不能,因为它们现在通过 HTTPS 提供。
随着越来越多的网站转向 HTTPS,这种缓存策略每年都变得越来越不可行,并且运行缓存似乎越来越没有意义。
我的建议是不要费心。但你可以设置一个并在一列火车上进行试验,然后测量结果。
您还可以尝试指导用户明确配置代理,以便您可以处理 HTTPS 和 WebSockets,尽管根据我的经验,这对用户来说很难做到。您可以实现WPAD自动配置一些用户,但请注意,Android 和 iOS 设备对此的支持很差或根本不支持。