Nginx性能优化(二):HTTP/2升级指南,让你的网站开启极速模式

还是HTTP/1.1?那你真的太out了。3分钟带你升级HTTP/2,告别队头阻塞!

原文:https://mp.weixin.qq.com/s/zioDo0hNo9Td2tVFAGtDzA


一、为什么必须升级HTTP/2?

HTTP/1.1存在严重的队头阻塞 问题:浏览器限制同一域名下最多只有6个并发连接。当页面需要加载大量静态资源时,多余的请求只能排队等待,页面加载速度受限。

HTTP/2引入了多路复用技术,彻底解决了这个问题:

特性 HTTP/1.1 HTTP/2
并发模型 一个连接一个请求(受6连接限制) 一个TCP连接多路复用多个请求
队头阻塞 存在 不存在
头部压缩 HPACK压缩,减少头部大小
服务器推送 不支持 支持Server Push主动推送资源

升级收益:减少6个连接的限制?HTTP/2下,所有资源理论上可以同时并行传输。


二、编译Nginx模块检查

开启HTTP/2需要两个关键模块:

模块 作用 是否必须
http_v2_module HTTP/2协议支持 ✅ 必须
http_ssl_module SSL/TLS加密支持 ✅ 必须

检查是否已编译

复制代码
# 查看Nginx版本
nginx -V

# 检查是否有http_v2模块
nginx -V 2>&1 | grep -o with-http_v2_module

# 检查OpenSSL版本(需≥1.0.2)
openssl version

如需重新编译

复制代码
# 添加HTTP/2和SSL模块
./configure --prefix=/usr/local/nginx \
    --with-http_v2_module \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_stub_status_module

make && make install

三、HTTP/2核心配置

基础配置

复制代码
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.site.com;
    
    root /var/www/html;
    index index.html index.htm;
    
    # SSL证书(必须是完整证书链)
    ssl_certificate /etc/nginx/cert/www.site.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/cert/www.site.com.privkey.key;
    
    # 其他站点配置...
}

HTTPS跳转配置(可选)

复制代码
# HTTP 301跳转到HTTPS
server {
    listen 80;
    server_name www.site.com;
    return 301 https://$server_name$request_uri;
}

四、SSL/TLS性能优化

HTTP/2依赖SSL/TLS,合理的SSL配置既能提升性能又能保证安全性:

复制代码
server {
    listen 443 ssl http2;
    server_name www.site.com;
    
    # SSL证书
    ssl_certificate /etc/nginx/cert/www.site.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/cert/www.site.com.privkey.key;
    
    # ===== SSL性能优化 =====
    
    # 协议版本(禁用不安全的TLSv1.0/1.1)
    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 off;
    
    # 会话缓存(复用TLS连接)
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    
    # 缓冲区(4k更利于HTTP/2)
    ssl_buffer_size 4k;
    
    # OCSP Stapling(减少证书验证延迟)
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/cert/trust-chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    
    # HSTS(强制HTTPS)
    add_header Strict-Transport-Security max-age=31536000;
    
    # 其他配置...
}

SSL参数说明

参数 推荐值 作用
ssl_protocols TLSv1.2 TLSv1.3 禁用不安全的老协议
ssl_session_cache shared:SSL:10m 10MB共享内存缓存TLS会话,复用连接
ssl_buffer_size 4k 降低握手overhead,提升HTTP/2传输效率
ssl_stapling on 服务端验证证书,减少客户端验证延迟

五、验证HTTP/2是否生效

方法一:浏览器验证

复制代码
1. 打开Chrome → F12 → Network标签
2. 刷新页面
3. 查看Protocol列,显示 h2 即为生效

方法二:curl验证

复制代码
# 使用--http2参数测试
curl -I --http2 https://www.site.com

# 返回以下内容表示成功
HTTP/2 200
content-type: text/html
...(其他响应头)

方法三:在线检测

复制代码
# 使用SSL Labs检测
https://www.ssllabs.com/ssltest/

# 查看HTTP/2支持状态
✅ HTTP/2 supported

六、常见问题排查

问题 原因 解决方案
协议显示HTTP/1.1 Nginx未编译http_v2_module 重新编译Nginx添加模块
SSL握手失败 OpenSSL版本过低 升级OpenSSL到1.0.2以上
证书报错 不是完整证书链 使用fullchain.pem证书文件
旧浏览器不支持 IE11及以前不支持 Nginx自动降级到HTTP/1.1

七、优化建议清单

  • Nginx版本≥1.9.5,OpenSSL版本≥1.0.2
  • 编译时添加 --with-http_v2_module --with-http_ssl_module
  • SSL配置添加会话缓存和OCSP Stapling
  • 禁用不安全的TLSv1.0/1.1协议
  • 使用完整证书链(fullchain.pem)
  • 升级后务必用 nginx -t 测试配置

关注「运维之美」

获取更多Nginx性能优化实战技巧

相关推荐
李游Leo6 分钟前
HarmonyOS 7 实战开发 05:把页面做到可上线状态
ios·harmonyos
终端安全笔记6 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机
传奇开心果编程6 小时前
【SwiftUI入门练中学】第1课 从零开始
学习·ui·ios·swiftui·swift
丿Wayne12 小时前
iOS Token 刷新实战(Actor 避免并发重复刷新)
ios·swift·token·actor·swift并发
终端安全笔记1 天前
iOS 27 给了租赁一个新工具,但它只认受监督的设备
android·网络·安全·ios
大熊猫侯佩1 天前
独立 App 首发完成 iPhone Duo 展开态适配
ios·swiftui·swift
光影少年1 天前
setImmediate 和 setTimeout(0) 的区别
android·前端·react.js·ios·前端框架
2501_916008891 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp
HouWan2 天前
Flutter: MediaQuery.of(context) 为什么可能拖慢页面?
android·flutter·ios