6
回答
nginx 不能按照虚拟主机来启用HTTP2
终于搞明白,存储TCO原来是这样算的>>>   

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 一样。

想了解下实现者对这块的想法,是否有特殊考虑还是疏忽?

<无标签>
举报
liucf3995
发帖于2个月前 6回/132阅

h2的前提是ssl,不给那个域名开ssl不就行了么

--- 共有 1 条评论 ---
liucf3995这种做法只是规避问题,没有实际解决问题。 线上一台nginx 处理几百个域名,分虚拟主机管理,复用443端口使用https,有的域名需要https-http2 ,有的需要https-http1.1,需要做到虚拟主机级别来启用http2 2个月前 回复

现在chrome和firefox都只支持在https协议时启用http2,所以这里只考虑https的情况。

http2的协商是在SSL握手阶段实现的,在这个时候Nginx还没有收到HTTP请求,根本无法确定客户端请求的是哪个域名,更无法根据域名去判断是否启用http2。

后来SSL协议增加了SNI拓展,在SSL握手时可以判断对方请求的域名,理论上讲可以根据域名选择是否启用http2。

Nginx最初进行处理时,没有根据SNI中的域名进行判断,所以SSL握手阶段无法根据域名进行不同的处理,进而无法实现根据域名启用http2

 

--- 共有 3 条评论 ---
liucf3995补充一点: 我这里负责用nginx管理上百个域名,业务场景繁多,技术要求不尽相同,对http2的启用也各不相同。 现在想用h2的业务大部分是从1.1 过渡到h2,希望这个过渡过程可控,有问题及时回退,也即对不同虚拟主机做到按需启用h2 有要求。 2个月前 回复
liucf3995 回复 @liucf3995 : sorry 少输入一个2 xxip:xxport ssl http --> xxip:xxport ssl http2 2个月前 回复
liucf3995感谢,认可您说的原理。 nginx 是否启用http2 有两个条件:nginx 配置中listen xxip:xxport ssl http (任何一个虚拟主机配置均可),这时对xxport端口上来的请求启用协议优先级是:h2 > h1.1;同时客户端握手带上了alpn头并且里面有h2 。 疑问:对条件1,nginx 不考虑server_name有意这样实现还是缺陷?毕竟按需启用比较合理。 2个月前 回复

也算是Nginx的缺陷吧,其实hack一下Nginx还是可以实现的。不过开启HTTP2后只影响Nginx和客户端之间的连接,几乎不会影响业务吧

--- 共有 2 条评论 ---
liucf3995其实之前有想过来修改nginx,在选h2的时候参考server_name来做到按虚拟主机来启用h2,但担心这个改进如果没得到官方认可,后面官方有新版本时,不太好合入。 近期nginx有报了安全漏洞,需要升级到修复版本,如果自身改了,那还要做较多验证测试,费劲。 2个月前 回复
liucf3995如果客户端不支持h2,又不小心将h2放在握手阶段的alpn中,那就有问题了,服务器启用了h2,h2协议协商帧可能导致客户端进入异常逻辑。 我目前就遇到过这种情况,业务为了缩短握手时间,改成0rrt 或者 1 rtt,修改了openssl库来提前将ssl握手进入数据传输阶段,但是为h2支持,引入了一些不规范的内容进来。 2个月前 回复
顶部