Назад | Перейти на главную страницу

Apache случайно перестает обслуживать HTTPS, но HTTP работает нормально

У нас есть этот Apache на Windows Server 2012:

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

В большинстве случаев он работает безупречно, но время от времени (случайным образом, примерно 3-4 раза в неделю) он перестает обслуживать HTTPS на порту 443, но продолжает обслуживать HTTP на порту 80. Когда он прекращает обслуживание 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

Раньше у нас был только AcceptFilter для http, а вторая строка отсутствовала.

В соответствии с Документация Apache значения по умолчанию в Windows:

AcceptFilter http data
AcceptFilter https data

С помощью никто value использует accept (), а не AcceptEx (), и не будет повторно использовать сокеты между соединениями.

Что ж, я думаю, что это проблема брандмауэра, вам нужно установить iptable для передачи некоторого IP. Включение фильтра должно решить проблему