在 Apache 2.4 中启用 http/2 不起作用
Enabling http/2 in Apache 2.4 does not work
我们正在尝试在 Apache 2.4 上启用 http/2,但没有成功。
服务器OS是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---
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
Apache 不支持 HTTP/2 prefork MPM。 This was added in 2.4.27:
*) COMPATIBILITY: mod_http2: Disable and give warning when using Prefork.
The server will continue to run, but HTTP/2 will no longer be negotiated.
[Stefan Eissing]
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
我们正在尝试在 Apache 2.4 上启用 http/2,但没有成功。 服务器OS是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---
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
Apache 不支持 HTTP/2 prefork MPM。 This was added in 2.4.27:
*) COMPATIBILITY: mod_http2: Disable and give warning when using Prefork. The server will continue to run, but HTTP/2 will no longer be negotiated. [Stefan Eissing]
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