Windows-Server-2012

Apache 隨機停止服務 HTTPS,但 HTTP 工作正常

  • December 21, 2015

我們在 Windows Server 2012 上有這個 Apache:

Server version: Apache/2.4.9 (Win32) Apache Lounge VC10 Server built: Mar 17 2014 10:48:43

大多數情況下,它執行良好,但有時(隨機,每週 cca 3-4 次),它會停止在埠 443 上提供 HTTPS,但會繼續在埠 80 上提供 HTTP。當它停止提供 HTTPS 時,解決問題的唯一方法是重新啟動 Apache。

這似乎與這裡的問題完全相同:Apache 停止響應 http 請求——https 繼續工作,除了在我們的例子中,它是停止工作的 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 只是默默地關閉了那個埠。

經過各種配置的測試,我們發現了問題所在,伺服器已經穩定執行了7天,沒有任何問題。

httpd.conf 文件中的這個設置解決了這個問題:

AcceptFilter http none
AcceptFilter https none

以前,我們只有用於 http 的 AcceptFilter,並且缺少第二行。

根據Apache 文件,Windows 上的預設值是:

AcceptFilter http data
AcceptFilter https data

使用none值使用 accept() 而不是 AcceptEx() 並且不會在連接之間回收套接字。

引用自:https://serverfault.com/questions/677183