一个虚拟主机的 HTTPS 失败

一个虚拟主机的 HTTPS 失败

好吧,这听起来像是一个奇怪的问题......我甚至犹豫是否在这里发布它,因为我无法很好地掌握如何描述它,更不用说从哪里开始寻找解决方案。

我有一个网站(Fedora 24,标准 LAMP 堆栈,在 Amazon EC2 上运行),最近当通过 HTTPS 发出请求时,该网站开始以空白页响应。

例如,如果你浏览到http://example.com/coolscript.php它工作得很好,但是 https://example.com/coolscript.php 返回空白页。Web 服务器日志显示两者的 HTTP 200,但 HTTPS 版本(后者,见下文)没有返回任何数据:

1.2.3.4 - - [22/Dec/2016:16:19:39 +0000] "GET /coolscript.php HTTP/1.1" 200 9069 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
1.2.3.4 - - [22/Dec/2016:16:19:25 +0000] "GET /coolscript.php HTTP/1.1" 200 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

我尝试了不同的浏览器、电脑、网络等,但都返回空白页。

您可能(和我一样)认为 Apache 中的虚拟主机定义出了问题,但访问简单文件(甚至 PHP 脚本)却一切正常。证书有效,一切正常。同一服务器上其他启用 HTTPS 的站点使用不同的证书也能正常工作,甚至使用相同证书的虚拟主机别名也能正常工作。只是通过 HTTPS 的一个主机名失败了。(关键是:有效的别名和无效的别名在同一个虚拟主机定义中定义。)

我查看了很多不同的领域,希望找到问题所在,但一无所获。欢迎提出建议、评论或大胆猜测。:)


更新

原始帖子发布几周后,我再次遇到了同样的问题,但这次 HTTP 失败了,而 HTTPS 正常。同样,只针对一个虚拟主机(默认)。tcpdump 没有显示任何内容:

HTTP/1.1 200 OK
Date: Thu, 05 Jan 2017 14:33:48 GMT
Server: Apache/2.4.25 (Fedora) OpenSSL/1.0.2j-fips PHP/5.6.29 mod_perl/2.0.10 Perl/v5.22.2
X-Powered-By: PHP/5.6.29
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

仍然感到困惑,甚至可能更加困惑。


2017 年 2 月 8 日更新

今天,仅一个虚拟主机上的 HTTP 又出现了“空虚拟主机问题”。在 apache 的服务器状态中,坏连接显示如下:

4-1 26987   0/2/32  R   1.55    3   223 0.0 0.02    0.13    1.2.3.4 http/1.1        
4-1 26987   0/2/22  R   1.47    4   0   0.0 0.01    0.10    1.2.3.4 http/1.1        
4-1 26987   0/1/10  R   0.07    4   2   0.0 0.00    0.19    1.2.3.4 http/1.1    

相反的是:

2-1 26210   0/22/73 W   15.51   0   0   0.0 0.06    0.38    1.2.3.4 http/1.1    vhost.com:443   GET /server-status HTTP/1.1

值得注意的是,在连接不良时,VHost 列为空,因此我有了一个新的关注方向。

欢呼迈克

答案1

Content-Length: 0如果您确实直接从 Apache httpd(而不是某个中间代理)接收到标头,则意味着 Apache 从一开始就确定不会再有来自 PHP 的数据。因此,脚本一运行,PHP 就会退出。您需要ini_set("log_errors", 1);按照 Gerald 的建议去做。

另外,建立内存监控,至少运行vmstat 1并查看列cachefree在有问题的请求期间,也许 PHP 脚本会导致内存短缺。

答案2

可能的原因:在最新版本的 systemd 中,服务可以生成的“任务”数量是有限制的。对于 Fedora 24 上的 apache,该数量设置为 512,即使在轻负载下也会使服务器超负荷。(对我来说,一个线索是来自多个来源的“无法分叉”错误。)

修复方法是编辑“/usr/lib/systemd/system/httpd.service”并将“TasksMax=infinity”添加到服务部分:

[Service]
TasksMax=infinity

到目前为止,一切都很好。

答案3

好的,我终于找到了真实的答案:缓存

我已经在 Simple Machines 上启用了基本(级别 1)缓存,但偶尔缓存会损坏并导致网站失败,而我找不到任何错误或输出。

缓存是针对每个主机进行的,因此一个主机可能会出现故障,而其他主机则一切正常。当缓存中的损坏文件过期时,问题就会自行解决。

我的解决方案:禁用 SMF 缓存,问题就不再发生。

一线希望:为了实现这个目标,我发现并修复了很多服务器效率低下的问题!:)

相关内容