HTTP/2 不是对 HTTP/1.1 的语义重写,而是对传输层能力的一次升级。它保留了请求方法、状态码、URI 等核心语义,因此大多数业务在升级时不需要修改应用代码,通常只需要调整服务器、证书和 TLS 配置即可。
从实践角度看,HTTP/2 的价值不在于“协议名更先进”,而在于它更适合今天这种资源多、请求密集、移动网络波动明显的 Web 场景。
HTTP/1.1 在今天的高并发 Web 场景里,主要有以下几个问题:
HTTP/2 在不改变 HTTP 语义的前提下,重点优化了传输效率和连接复用能力:
需要注意的是,服务器推送在实际项目中已经不再是主流推荐方案,浏览器生态也不再积极推荐使用它,所以本文不把它作为重点。
HTTP/2 通常更适合下面这些场景:
如果是非常轻量的站点,HTTP/2 当然仍然有意义,但收益通常不会特别夸张。
在现代浏览器里,HTTP/2 基本都是通过 HTTPS 启用的,因此要先具备以下条件:
http_v2_module 和 http_ssl_module。说明:以下内容以 Ubuntu 系统为例。生产环境建议优先使用 TLSv1.2 和 TLSv1.3,不要再启用过旧协议。
另外,Nginx 的 HTTP/2 配置写法有版本差异:
listen 443 ssl http2;listen 443 ssl; 配合 http2 on;如果你使用的是较新的 Nginx,建议采用官方当前文档里的新写法。
apt-get 安装sudo su root
apt-get install nginx
检查是否安装成功:
nginx -V
启动 Nginx:
service nginx start
常见安装路径:
/usr/sbin/nginx # 主程序
/etc/nginx # 配置文件目录
/usr/share/nginx # 静态文件目录
/var/log/nginx # 日志目录
先安装依赖:
apt-get install gcc
apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g zlib1g-dev
sudo apt-get install openssl
sudo apt-get install libssl-dev
下载并解压 Nginx:
cd /usr/local
mkdir -p nginx
cd nginx
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
编译安装:
cd /usr/local/nginx/nginx-1.13.7
./configure
make
make install
启动 Nginx:
cd /usr/local/nginx/sbin
./nginx
如果是通过包管理器安装,可以执行:
apt-get --purge autoremove nginx
推荐在 HTTPS 的 443 端口上同时启用 SSL 和 HTTP/2。下面分别给出旧写法和新写法。
server {
listen 443 ssl http2 default_server;
server_name jsbyron.cn;
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/private.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
}
server {
listen 443 ssl default_server;
http2 on;
server_name jsbyron.cn;
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/private.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 60m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_session_tickets on;
ssl_stapling on;
ssl_stapling_verify on;
}
配置说明:
listen 443 ssl:在 443 端口启用 HTTPS。http2 on:开启 HTTP/2。旧版本也可以通过 listen 参数启用,但新版本建议使用独立指令。ssl_certificate:证书文件路径。ssl_certificate_key:私钥文件路径。ssl_session_cache:共享会话缓存,减少重复握手开销。ssl_session_timeout:设置 SSL 会话缓存时间,减少重复握手成本。ssl_protocols:指定允许的 TLS 协议版本,生产环境建议只保留 TLSv1.2 和 TLSv1.3。ssl_prefer_server_ciphers:由服务端优先选择加密套件。ssl_ciphers:指定可用的加密套件。ssl_session_tickets:减少重复 TLS 握手开销。ssl_stapling / ssl_stapling_verify:启用 OCSP stapling,提高证书状态校验效率。建议再补一个从 80 跳转到 443 的配置:
server {
listen 80;
server_name jsbyron.cn;
return 301 https://$host$request_uri;
}
修改完成后重载配置:
nginx -s reload
配置完成后,建议先检查 Nginx 配置语法:
nginx -t
确认模块是否已编译进来:
nginx -V 2>&1 | grep http_v2_module
也可以直接用 curl 查看协商结果:
curl -I --http2 https://jsbyron.cn
如果浏览器中打开站点,可以在开发者工具的 Network 面板里查看协议列,通常会显示 h2。
如果想直接查看证书和协议协商情况,也可以用:
openssl s_client -connect jsbyron.cn:443 -alpn h2
看到 h2 说明 HTTP/2 协商成功。
the "http2" parameter requires ngx_http_v2_module这个报错说明当前 Nginx 编译时没有包含 HTTP/2 模块。
解决思路很直接:重新编译 Nginx,并显式加入 --with-http_v2_module。
示例:
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--with-http_addition_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_v2_module
重新执行:
make
make install
如果你使用的是发行版自带的 Nginx,也可以直接安装带有 HTTP/2 支持的版本,通常更省事。
h2常见原因有几个:
排查时可以先从 nginx -t、证书有效性和 curl --http2 三步开始。
如果你的站点流量很小、资源很少、部署环境又比较老旧,那么升级 HTTP/2 的收益可能有限。它更适合资源较多、请求较密集、并发较高的服务,而不是“所有场景都必须切换”的万能解法。
HTTP/2 主要改善的是应用层传输效率,但底层仍然建立在 TCP 之上,所以如果网络丢包严重,仍可能受到传输层队头阻塞影响。换句话说,HTTP/2 能明显缓解很多问题,但它并不会让所有请求都“瞬间变快”。
HTTP/2 的价值主要体现在连接复用、头部压缩和传输效率上。对于资源较多、接口较密集的网站,它通常能明显改善页面加载体验。实际落地时,关键不只是“开启 HTTP/2”,还要同时把 HTTPS、证书、Nginx 编译参数、TLS 配置和验证方式一起理顺。
如果把这件事说得更直白一点,HTTP/2 的意义不在于炫技,而在于让 Web 传输更像今天应该有的样子。
还没有公开评论
欢迎留下第一条想法,评论会在博主审核后显示。