服务器版本:Apache / 2.4.9(Win32)
Apache Lounge VC10 Server内置:2014年3月17日10:48:43
大多数情况下,它运行良好,但有时(随机,每周cca 3-4次),它停止在端口443上提供HTTPS,但继续在端口80上提供HTTP服务.当它停止提供HTTPS时,解决问题的唯一方法是重启Apache.
这似乎与此处的问题完全相同:Apache stops responding to http requests — https continues to work除了在我们的情况下,它是HTTPS停止工作,HTTP是一直有效的.
我们已经启用了trace6级别的详细程度,以获得有关正在发生的事情的一些很好的信息.但是,日志是空的:
... [Sat Mar 21 07:51:50.577373 2015] [ssl:debug] [pid 3356:tid 2540] ssl_engine_io.c(999): [client ...:16529] AH02001: Connection closed to child 137 with standard shutdown (server ...:443) [Sat Mar 21 07:54:21.936742 2015] [ssl:info] [pid 4760:tid 432] AH01914: Configuring server ...:443 for SSL protocol ...
在这个日志中,我们可以看到最后一个请求在07:51:50提供的最后一行然后没有任何内容(我们的内部监控系统尝试连接每一分钟,所以应该有07:52:50记录,但它缺少). 07:54:21的下一行是在我们的内部监控系统超时并重新启动Apache服务之后.
我们的内部监控是在C#中,其输出是:
System.Net.WebException: The operation has timed out at System.Net.HttpWebRequest.GetResponse() at ExecuteServicePageCheck(Object stateInfo)
我们的httpd-ssl.conf看起来像这样:
<VirtualHost _default_:443> ServerName ...:443 ServerAlias www.....com DocumentRoot ${US_ROOTF_WWW}/.../www/www SSLEngine On SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder on # Prefer PFS,allow TLS,avoid SSL,for IE8 on XP still allow 3DES SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+AESGCM EECDH EDH+AESGCM EDH+aRSA HIGH !MEDIUM !LOW !aNULL !eNULL !LOW !RC4 !MD5 !EXP !PSK !SRP !DSS" # Prevent CRIME/BREACH compression attacks SSLCompression Off # Commit to HTTPS only traffic for at least 180 days Header add Strict-Transport-Security "max-age=15552000" SSLCertificateFile ${US_ROOTF}/core/apache2/server_certs/....crt SSLCertificateKeyFile ${US_ROOTF}/core/apache2/server_certs/....key SSLCertificateChainFile ${US_ROOTF}/core/apache2/server_certs/....ca-bundle CustomLog "logs/.../www/access.ssl.%Y.%m.%d.log" combined ErrorLog "logs/.../www/error.ssl.log" LogLevel trace6 </VirtualHost>
我们还有什么办法可以获得有关正在发生的事情的任何信息吗?我们没有任何来自Apache的错误消息,甚至在这个trace6级别也没有.
请注意,我们确实在HTTP和HTTPS上提供了更多域,并且HTTPS上的所有域都会出现问题.就好像Apache只是默默地关闭了那个端口.
httpd.conf文件中的这个设置修复了这个问题:
AcceptFilter http none AcceptFilter https none
以前,我们只有HTTP的AcceptFilter,第二行丢失了.
根据Apache documentation,Windows上的默认值为:
AcceptFilter http data AcceptFilter https data
使用none值使用accept()而不是AcceptEx(),并且不会在连接之间回收套接字.