从零开始配置HTTP2并解决实际项目中的性能瓶颈
我的HTTP/2配置写法,亲测靠谱
先说说我的配置习惯吧。在实际项目中,我一般这样处理HTTP/2的配置:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256;
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
location /api/ {
proxy_pass https://jztheme.com/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
这套配置有几个关键点:首先是listen指令明确指定了http2,确保启用HTTP/2协议。我踩过坑的是,有些老版本Nginx即使写了http2也不生效,后来发现是OpenSSL版本太低导致的。
关于SSL配置,建议直接使用TLS1.2和1.3,更安全也更高效。那些还在用TLS1.0、1.1的项目真的该升级了,不然分分钟被浏览器警告。
这几种错误写法,别再踩坑了
说几个常见的坑,真的是看到就想吐槽的那种。第一个反面教材:
server {
listen 443 ssl;
# 漏掉了http2声明
...
}
这个错我见过好多次,开发者以为服务器默认就会开启HTTP/2,结果还是跑在HTTP/1.1上。记得一定要显式声明http2!
还有这种:
location /api/ {
proxy_pass https://jztheme.com/api/;
proxy_http_version 1.0; # 错误地设置为1.0
}
这里的问题是proxy_http_version还停留在1.0,这会导致很多HTTP/2特性无法正常使用。改成1.1就对了。
第三个常见错误:
add_header Strict-Transport-Security "max-age=3600";
HSTS的过期时间设置得太短了,容易造成安全风险。建议至少设置为一年(31536000秒)。
实际项目中的坑
讲几个我在真实项目中遇到的问题。第一个就是混合内容问题,在HTTPS页面里引用了HTTP资源,浏览器直接给你拦住。比如:
<img src="http://jztheme.com/image.jpg">
解决办法很简单,全部改成相对协议或者强制HTTPS:
<img src="//jztheme.com/image.jpg">
<!-- 或者 -->
<img src="https://jztheme.com/image.jpg">
第二个坑是负载均衡场景下的连接复用问题。有时候会发现HTTP/2的性能提升不明显,后来发现是因为每个后端服务都重新建立了连接。解决方案是在Nginx加上:
proxy_http_version 1.1;
proxy_set_header Connection "";
第三个比较隐蔽的问题是header大小限制。默认情况下,Nginx对header大小有限制,超过就会返回400错误。特别是当你用了大量cookies或者自定义header时更容易触发。解决方法:
large_client_header_buffers 4 32k;
一些额外的优化建议
除了基本配置,我还喜欢做这几个优化:
- 启用OCSP Stapling:
ssl_stapling on;这能显著提升SSL握手速度 - 开启Session Resumption:
ssl_session_cache shared:SSL:10m;减少重复握手开销 - 调整Buffer Size:
ssl_buffer_size 1400;避免TCP分片
这些小优化加起来,性能提升还是很明显的。不过要注意,不同场景下效果可能不一样,需要自己测试调整。
结尾总结
以上是我个人对HTTP/2配置的一些实战经验分享。其实还有很多细节可以挖掘,比如ALPN协议选择、QUIC支持等,但这些都是更进阶的话题了。
特别提醒一下,配置完记得用工具检测下效果,推荐用Chrome DevTools的Network面板,或者在线工具如https://tools.keycdn.com/http2-test。
有更好的实践方案欢迎评论区交流,毕竟技术这东西,永远有更优解等着我们去发现。
