概述
本章,您将学习到 Apache httpd 当中如何启用并优化 HTTP/2。
前面提到:
| 版本 | 产生时间 | 主要特性 | 发展现状 |
|---|---|---|---|
| HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端与服务器之间的通信格式,只能使用 GET 请求 | 没有作为正式标准 |
| HTTP/1.0 | 1996年 | 扩展了多种请求方法(新增 POST、HEAD);引入请求/响应头部,支持传输任意格式数据(图片、视频、二进制等);建立了标准状态码机制;支持缓存控制 | 正式标准 |
| HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、管道机制以及分块传输编码,新增 PUT、DELETE、OPTIONS 等方法 | 至今仍广泛使用,兼容性最好 |
| HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议、强制要求加密等 | 当前主流使用的版本之一 |
| HTTP/3 | 2022年 | 基于 QUIC 协议(UDP传输层),彻底解决 TCP 层队头阻塞;支持 0-RTT 快速握手建立连接;支持连接迁移(IP 变化无缝切换);使用 QPACK 改进头部压缩;默认强制加密 | 逐步推广中 |
前提条件
在生产环境下正式启用 HTTP/2 之前,Apache httpd 需要满足相关的前提条件:
-
在主配置文件 httpd.conf 中加载这些模块:
- SSL 模块 -
LoadModule ssl_module modules/mod_ssl.so - HTTP2 模块 -
LoadModule modules/mod_http2.so - 重写模块 -
LoadModule rewrite_module modules/mod_rewrite.so - socache_shmcb 模块 -
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so - 静态缓存模块 -
LoadModule expires_module modules/mod_expires.so
- SSL 模块 -
-
在主配置文件 httpd.conf 中加载扩展配置文件 -
Include conf/extra/httpd-ssl.conf -
httpd-ssl.conf 文件中有关 https 的配置已经完成
由于作者的 Apache httpd 没有 --enable-http2 编译选项,因此需要使用 apxs 命令将相关模块的源文件进行动态编译,使之成为 DSO 模块。
Shell > cat /usr/local/apache2/build/config.nice
#! /bin/sh
#
# Created by configure
"./configure" \
"--prefix=/usr/local/apache2/" \
"--enable-so" \
"--enable-ssl" \
"--enable-rewrite" \
"--with-apr=/usr/local/apr/bin/apr-1-config" \
"--with-apr-util=/usr/local/apr-util/bin/apu-1-config" \
"--with-pcre=/usr/local/pcre2/" \
"--with-zlib" \
"--with-openssl" \
"--enable-expires" \
"--enable-charset-lite" \
"--enable-mpms-shared=all" \
"$@"
动态编译:
# 安装必要的依赖库
Shell > dnf -y install libnghttp2-devel
Shell > /usr/local/apache2/bin/apxs -a -i -c /usr/local/src/httpd-2.4.68/modules/http2/mod_http2.c
...
Libraries have been installed in:
/usr/local/apache2/modules
...
启用必要的模块
Shell > vim /usr/local/apache2/conf/httpd.conf
...
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
LoadModule expires_module modules/mod_expires.so
...
LoadModule ssl_module modules/mod_ssl.so
...
LoadModule rewrite_module modules/mod_rewrite.so
...
LoadModule http2_module modules/mod_http2.so
...
加载扩展配置文件 httpd-ssl.conf
Shell > vim /usr/local/apache2/conf/httpd.conf
...
Include conf/extra/httpd-ssl.conf
...
httpd-ssl.conf 的推荐配置
前面文章中已经说明了:
<VirtualHost 192.168.168.20:80>
ServerName myhost.rockylinux.org
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
</VirtualHost>
<VirtualHost 192.168.168.20:443>
DocumentRoot "/usr/local/apache2/htdocs"
ServerName myhost.rockylinux.org
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
SSLCertificateFile /usr/local/apache2/web-ssl/httpd.crt
SSLCertificateKeyFile /usr/local/apache2/web-ssl/httpd.key
SSLCertificateChainFile /usr/local/apache2/web-ssl/root_bundle.crt
SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_gcache_data(512000)
SSLSessionCacheTimeout 300
ErrorLog "/usr/local/apache2/logs/ssl_error_log"
CustomLog "/usr/local/apache2/logs/ssl_access_log" combined
</VirtualHost>
HTTP/2 相关配置说明
在 httpd-ssl.conf 的基础之上进一步配置:
Shell > vim /usr/local/apache2/conf/extra/httpd-ssl.conf
<VirtualHost 192.168.168.20:80>
ServerName myhost.rockylinux.org
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [L,R=301]
</VirtualHost>
<VirtualHost 192.168.168.20:443>
Protocols h2 http/1.1
H2Direct off
H2Push off
H2StreamMaxMemSize 65536
DocumentRoot "/usr/local/apache2/htdocs"
ServerName myhost.rockylinux.org
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
SSLCertificateFile /usr/local/apache2/web-ssl/httpd.crt
SSLCertificateKeyFile /usr/local/apache2/web-ssl/httpd.key
SSLCertificateChainFile /usr/local/apache2/web-ssl/root_bundle.crt
SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_gcache_data(512000)
SSLSessionCacheTimeout 300
ErrorLog "/usr/local/apache2/logs/ssl_error_log"
CustomLog "/usr/local/apache2/logs/ssl_access_log" combined
KeepAlive on
MaxKeepAliveRequests 200
KeepAliveTimeout 5
<IfModule expires_module>
ExpiresActive on
ExpiresByType text/css "access plus 3 hours"
ExpiresByType application/javascript "access plus 3 hours"
ExpiresByType image/png "access plus 1 hours"
ExpiresByType image/gif "access plus 1 hours"
ExpiresByType image/jpg "access plus 2 hours"
ExpiresDefault "access plus 4 hours"
</IfModule>
</VirtualHost>
Protocols h2 http/1.1- Web 服务器优先使用 HTTP/2 协议处理请求,若客户端不支持,则自动回退到 HTTP/1.1H2Direct off- 是否使用 HTTP/2 的直接模式(Direct Mode)。在标准的 HTTPS 场景下,建议设为 off。H2Push off- 启用 HTTP/2 的服务器推送功能,提前发送 CSS、JS 等资源。Chrome/Firefox 已移除对该特性的支持,生产环境建议设为 offH2StreamMaxMemSize 65536- 控制每个 HTTP/2 流在内存中缓存的最大数据量(64KB),超过此值的数据将写入到磁盘临时文件KeepAlive on- 是否开启 HTTP 长连接(或称 HTTP 持久连接)。不显式配置,则 KeepAlive 指令的指令参数就是 onMaxKeepAliveRequests 200- 启用长连接后,限制每个连接允许的请求上限,默认指令参数为 100KeepAliveTimeout 5- 启用长连接后,等待下一次请求的时间,默认指令参数为 5IfModule配置段 - 上一篇提到的静态缓存在这里依然可以配置,只不过写入到 httpd.conf 文件中是全局配置,而写入到 VirtualHost 配置段中则是局部生效
若您的 HTTP/2 需要进行全局配置,可在 httpd.conf 的这个位置配置如下内容:
Shell > vim /usr/local/apache2/conf/httpd.conf
...
LoadModule http2_module modules/mod_http2.so
Protocols h2 http/1.1
H2Direct off
H2Push off
...
为满足生产环境的需要,实际配置的内容可能会有变化。
测试 HTTP/2
命令行测试效果:
Shell > curl -I --http2 https://myhost.rockylinux.org
同样的,可在 Google Chrome 中使用快捷键 F12 打开开发者工具,接着输入相关的网址,在 Network 标签页下方的资源列表中即可看到相关所使用的协议(需要打开 "协议" 列,HTTP/2 即 h2,HTTP/3 即 h3)
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










