好吧,这听起来像是一个奇怪的问题......我甚至犹豫是否在这里发布它,因为我无法很好地掌握如何描述它,更不用说从哪里开始寻找解决方案。
我有一个网站(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
并查看列cache
,free
在有问题的请求期间,也许 PHP 脚本会导致内存短缺。
答案2
可能的原因:在最新版本的 systemd 中,服务可以生成的“任务”数量是有限制的。对于 Fedora 24 上的 apache,该数量设置为 512,即使在轻负载下也会使服务器超负荷。(对我来说,一个线索是来自多个来源的“无法分叉”错误。)
修复方法是编辑“/usr/lib/systemd/system/httpd.service”并将“TasksMax=infinity”添加到服务部分:
[Service]
TasksMax=infinity
到目前为止,一切都很好。
答案3
好的,我终于找到了真实的答案:缓存
我已经在 Simple Machines 上启用了基本(级别 1)缓存,但偶尔缓存会损坏并导致网站失败,而我找不到任何错误或输出。
缓存是针对每个主机进行的,因此一个主机可能会出现故障,而其他主机则一切正常。当缓存中的损坏文件过期时,问题就会自行解决。
我的解决方案:禁用 SMF 缓存,问题就不再发生。
一线希望:为了实现这个目标,我发现并修复了很多服务器效率低下的问题!:)