HTTP/2是HTTP协议的重大更新,主要特点包括: - 二进制分帧层(替代HTTP/1.x的文本格式) - 多路复用(解决队头阻塞问题) - 头部压缩(HPACK算法) - 服务器推送(Server Push) - 流优先级控制
在Nginx中启用HTTP/2非常简单,只需在listen
指令后添加http2
参数:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 其他配置...
}
ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧的不安全协议
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
http2_max_concurrent_streams 128; # 默认128,根据服务器性能调整
http2_recv_timeout 30s; # 客户端不活动超时
由于HTTP/2的多路复用特性,传统的资源合并(如CSS/JS合并)可能不再必要,反而可能: - 增加构建复杂度 - 降低缓存命中率 - 增加首次渲染延迟
建议: - 保持中等大小的资源文件 - 使用更细粒度的缓存策略
location = /index.html {
http2_push /style.css;
http2_push /script.js;
}
注意:服务器推送需要谨慎使用,过度推送可能浪费带宽。
http2_chunk_size 8k; # 数据分块大小
http2_body_preread_size 64k; # 请求体预读大小
worker_processes auto; # 根据CPU核心数自动设置
events {
worker_connections 1024; # 每个worker的最大连接数
}
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
# 如果支持Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml;
location / {
add_header Link "</style.css>; rel=preload; as=style";
add_header Link "</script.js>; rel=preload; as=script";
}
curl -I --http2 https://example.com
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
通过合理配置和优化,HTTP/2可以显著提升网站性能,特别是在高延迟网络环境下效果更为明显。