【问题标题】:Enabling http/2 in Apache 2.4 does not work在 Apache 2.4 中启用 http/2 不起作用
【发布时间】:2019-03-13 19:36:53
【问题描述】:

我们正在尝试在 Apache 2.4 上启用 http/2,但没有成功。 服务器操作系统为 FreeBSD 11.2,OpenSSL 版本为 1.0.2o。

我们拥有真实有效的 SSL 证书,在 Qualys SSL 服务器测试中获得 A+ 评级。

日志文件中没有错误,服务器重新启动没有问题或错误。使用 https:// 访问网站可以,但浏览器总是降级到 http/1.1。

我们的虚拟部分中有这个:

<Directory />
    Require         all granted
    AllowOverride   All
    SSLOptions      +StdEnvVars
</Directory>

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions      +StdEnvVars
</FilesMatch>

H2Direct on
Protocols h2 h2c http/1.1

Options                    None
SSLEngine                  On
SSLHonorCipherOrder        On
SSLSessionTickets          Off
SSLCompression             Off
SSLCipherSuite             "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
SSLProtocol                All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLCertificateFile          "/usr/local/www/apache24/certs/server.crt"
SSLCertificateKeyFile       "/usr/local/www/apache24/certs/server.key"
SSLCertificateChainFile     "/usr/local/www/apache24/certs/intermediate.crt"

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

---更新---

root@srv04:/usr/home/user # httpd -V
Server version: Apache/2.4.35 (FreeBSD)
Server built:   unknown
Server's Module Magic Number: 20120211:82
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork
threaded:     no
forked:     yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses disabled)
-D APR_USE_FLOCK_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/usr/local"
-D SUEXEC_BIN="/usr/local/bin/suexec"
-D DEFAULT_PIDLOG="/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="/var/run/apache_runtime_status"
-D DEFAULT_ERRORLOG="/var/log/httpd-error.log"
-D AP_TYPES_CONFIG_FILE="etc/apache24/mime.types"
-D SERVER_CONFIG_FILE="etc/apache24/httpd.conf"

---来自 QUALSYS 的 ALPN---

ALPN    Yes   http/1.1

---铬---

Chrome 49 / XP SP3 RSA 2048 (SHA256) TLS 1.2 > http/1.1     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ECDH secp256r1  FS
Chrome 69 / Win 7 R RSA 2048 (SHA256) TLS 1.2 > http/1.1    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDH secp256r1  FS
Chrome 70 / Win 10 RSA 2048 (SHA256) TLS 1.2 > http/1.1     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDH secp256r1  FS

【问题讨论】:

  • SSLServerTest 是否显示您可以将 h2 用于 Chrome?你在使用 prefork MPM 吗?您使用的是什么版本的 Apache?您是否有任何带有 SSL 扫描软件或代理的防病毒软件可能会降级连接?
  • 感谢您的回答。服务器版本:Apache/2.4.35 (FreeBSD),编译模块:core.c、mod_so.c、http_core.c。没有代理或防火墙,我们访问的其他网站显示活跃的 http2(Chrome 和 Firefox HTTP/2 插件)。
  • SSLLabs 是否说它是 h2 或不是 Chrome 的?它还显示 ALPN 支持吗?您正在运行哪个 MPM(运行 httpd -V 以查看此内容)?
  • 再次感谢,更新我的问题。
  • 根据您测试它的方式,可能是 antivirus is intercepting HTTPS requests 并阻止了 HTTP/2。

标签: apache ssl http2


【解决方案1】:

Apache 不支持带有 prefork MPM 的 HTTP/2。 This was added in 2.4.27:

*) 兼容性:mod_http2:使用 Prefork 时禁用并发出警告。 服务器将继续运行,但不再协商 HTTP/2。 [斯蒂芬·艾辛]

Prefork MPM 是basically incompatible with the way HTTP/2 is implemented。重新启动后,您的错误日志中应该会有一条警告告诉您这一点。

Prefork 也是一个非常古老的 MPM,速度很慢,所以那些想要 HTTP/2 的网站可能无论如何都不应该使用它。只有在运行非线程安全的 PHP 应用程序时才应该真正使用它(线程安全的应该移至 Event MPM 和 php-fm(这基本上是 Nginx 的运行方式,因为它不提供等效的 prefork)。不幸的是,它也是默认的在许多 Apache 安装中(只是我的情况是人们使用线程不安全的 PHP 应用程序?),而且通常你不能在不下载和重新编译的情况下更改它。

在此处了解有关 MPM 的更多信息:https://serverfault.com/questions/383526/how-do-i-select-which-apache-mpm-to-use

【讨论】:

  • 谢谢!为 Event MPM 重新配置 Apache,然后重新安装它。似乎在 httpd.conf 中作为模块加载。 PHP-FM 已经安装了 PHP5.6,我已经激活并启动了它。现在就祈祷吧!
  • 在升级过程中,您可能还想重新考虑 PHP 版本:zdnet.com/article/…
猜你喜欢
  • 2020-02-28
  • 2018-03-22
  • 2018-09-02
  • 2016-12-15
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多