Apache httpd功能篇09—HTTP2

概述

本章,您将学习到 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
  • 在主配置文件 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.1
  • H2Direct off - 是否使用 HTTP/2 的直接模式(Direct Mode)。在标准的 HTTPS 场景下,建议设为 off。
  • H2Push off - 启用 HTTP/2 的服务器推送功能,提前发送 CSS、JS 等资源。Chrome/Firefox 已移除对该特性的支持,生产环境建议设为 off
  • H2StreamMaxMemSize 65536 - 控制每个 HTTP/2 流在内存中缓存的最大数据量(64KB),超过此值的数据将写入到磁盘临时文件
  • KeepAlive on - 是否开启 HTTP 长连接(或称 HTTP 持久连接)。不显式配置,则 KeepAlive 指令的指令参数就是 on
  • MaxKeepAliveRequests 200 - 启用长连接后,限制每个连接允许的请求上限,默认指令参数为 100
  • KeepAliveTimeout 5 - 启用长连接后,等待下一次请求的时间,默认指令参数为 5
  • IfModule 配置段 - 上一篇提到的静态缓存在这里依然可以配置,只不过写入到 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)

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇