我们将不得不暂时关闭我们的服务器,因为它们需要物理移动并放到更好的 UPS 上。
我不想只为我们的用户出现“无法连接”的错误,而且我还有另一个较小的服务器箱,我认为它可以显示“维护模式”消息。
向他们保证这是定期维护,这样他们就不会惊慌失措,以为我们消失了,或者发生其他事情,告诉他们一切恢复正常的时间,对造成的不便表示歉意。诸如此类。
对于 HTTP,这很容易设置。我创建了“维护模式”HTML 页面,然后让默认虚拟主机(catch all)在向服务器发出任何请求时显示此页面。
这样,指向我们服务器上任何虚拟主机的任何 HTTP 链接都会与此匹配并显示临时的“服务不可用”消息。
但是 HTTPS 让我有点困惑,因为主机名必须与 SSL 证书匹配,才能避免浏览器发出安全警告。
我想要的是一个默认的 SSL“捕获全部”,它可以匹配任何主机名 - 因为没有任何虚拟主机实际上在此临时服务器上启动 - 然后重定向到 HTTP 维护消息。
我尝试了一下:
<VirtualHost *:443>
ServerName catch-all
ServerAlias *
RedirectMatch ^(.*)$ http://%{SERVER_NAME}/
</VirtualHost>
但是我在 Chrome 中收到“该网站无法提供安全连接”(ERR_SSL_PROTOCOL_ERROR)并且 curl 抱怨“ssl 版本错误”。
我需要它,以便如果有人通过 HTTPS 链接访问我们服务器上的某些内容,所有内容都会被重定向到 HTTP“维护”页面。
服务器可以像这样“取消” SSL 握手并重定向到 HTTP 吗?
答案1
使用服务的现有证书来设置基于名称的虚拟主机,其文档根目录包含中断消息。TLS 服务器名称指示支持允许您每个 vhost 拥有不同的 SSL 配置指令,包括不同的证书。
如果此类中断对您的组织来说是个问题,请考虑从您的设计中移除单点故障。Web 服务器位于不同的机架中,位于集群负载平衡器后面,所有服务器都使用不同电路上的双电源,远程托管中断消息。这可能会花费不菲,因此请选择适合您的服务可用性目标的冗余。
答案2
从技术上讲,可以使用通配符证书 (*.domain.com) 来解决您的问题。可以使用 Let's Encrypt DNS 证书请求方法手动生成证书 (https://letsencrypt.org/how-it-works/) 即使您的 DNS 提供商不提供可用于根据长期使用需要自动创建 TXT 记录的 API。
至于您建议的解决方法:
如果您使用 HTTP 严格传输安全标头(HSTS) - 您确实应该这样做 - 那么客户端浏览器将拒绝承认代替以前已知的 HTTPS 站点出现的仅 HTTP 站点;所以这不应该是一个有效的选择。
答案3
根据 HBruijn 和 John Mahowald 的建议,我将在中断服务器上设置虚拟主机及其各自的 SSL 证书,但都使用“DocumentRoot /var/www/html”来提供维护页面。
这需要做更多的工作 - 我希望通过“全部捕获”来避免这种情况,因为每一个虚拟主机都将提供完全相同的内容 - 但 SSL 并不容易允许这样做。
而且我还在想,将来如果再次需要这个并且我们有更多的虚拟主机,那么“全部捕获”的想法将继续发挥作用,而我不需要每次都手动向中断服务器添加任何新的虚拟主机。
如果可以的话,那就更有意义了。但由于 SSL 的工作方式,这是不可能的,所以我只能手动完成所有操作。
好吧,希望中断的服务器很少(如果有的话)再次被调用。