1.9.6 nginx 启用HTTP 2 的条件是:只要编译了http 2 模块 ,就会启用HTTP 2,(不需要任何HTTP 2配置)。
1.9.7 nginx启用HTTP 2:编译了http 2模块,默认不会启用HTTP 2 ,但是只要有域名配置HTTP 2,那么该端口启用了HTTP2 ,所有监听在同样端口的虚拟主机都会启用,即使部分域名没有配置 listen xxip:port ssl http2 。
但我们希望:针对虚拟主机,来启用HTTP 2,也即对某个域名可以启用HTTP 2,相互不影响。
最新主干代码关于启用HTTP2 的逻辑和1.9.7 一样。
想了解下实现者对这块的想法,是否有特殊考虑还是疏忽?
附上源码部分逻辑
######h2的前提是ssl,不给那个域名开ssl不就行了么
######这种做法只是规避问题,没有实际解决问题。 线上一台nginx 处理几百个域名,分虚拟主机管理,复用443端口使用https,有的域名需要https-http2 ,有的需要https-http1.1,需要做到虚拟主机级别来启用http2######我已经在使用 http2 一年多了。使用我的意见安装脚本包你成功。
https://github.com/oscm/shell/tree/master/web/nginx/source
######现在chrome和firefox都只支持在https协议时启用http2,所以这里只考虑https的情况。
http2的协商是在SSL握手阶段实现的,在这个时候Nginx还没有收到HTTP请求,根本无法确定客户端请求的是哪个域名,更无法根据域名去判断是否启用http2。
后来SSL协议增加了SNI拓展,在SSL握手时可以判断对方请求的域名,理论上讲可以根据域名选择是否启用http2。
Nginx最初进行处理时,没有根据SNI中的域名进行判断,所以SSL握手阶段无法根据域名进行不同的处理,进而无法实现根据域名启用http2
######补充一点: 我这里负责用nginx管理上百个域名,业务场景繁多,技术要求不尽相同,对http2的启用也各不相同。 现在想用h2的业务大部分是从1.1 过渡到h2,希望这个过渡过程可控,有问题及时回退,也即对不同虚拟主机做到按需启用h2 有要求。######回复 @liucf3995 : sorry 少输入一个2 xxip:xxport ssl http --> xxip:xxport ssl http2######感谢,认可您说的原理。 nginx 是否启用http2 有两个条件:nginx 配置中listen xxip:xxport ssl http (任何一个虚拟主机配置均可),这时对xxport端口上来的请求启用协议优先级是:h2 > h1.1;同时客户端握手带上了alpn头并且里面有h2 。 疑问:对条件1,nginx 不考虑server_name有意这样实现还是缺陷?毕竟按需启用比较合理。######
也算是Nginx的缺陷吧,其实hack一下Nginx还是可以实现的。不过开启HTTP2后只影响Nginx和客户端之间的连接,几乎不会影响业务吧
######其实之前有想过来修改nginx,在选h2的时候参考server_name来做到按虚拟主机来启用h2,但担心这个改进如果没得到官方认可,后面官方有新版本时,不太好合入。 近期nginx有报了安全漏洞,需要升级到修复版本,如果自身改了,那还要做较多验证测试,费劲。######如果客户端不支持h2,又不小心将h2放在握手阶段的alpn中,那就有问题了,服务器启用了h2,h2协议协商帧可能导致客户端进入异常逻辑。 我目前就遇到过这种情况,业务为了缩短握手时间,改成0rrt 或者 1 rtt,修改了openssl库来提前将ssl握手进入数据传输阶段,但是为h2支持,引入了一些不规范的内容进来。######想知道有没有办法可以让nginx支持按servername来启用h2
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。