开发者社区> 问答> 正文

nginx 不能按照虚拟主机来启用HTTP2:报错

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

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

展开
收起
kun坤 2020-06-14 10:44:20 663 0
1 条回答
写回答
取消 提交回答
  • 附上源码部分逻辑

    ######

    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

    2020-06-14 10:44:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里巴巴HTTP 2.0实践及无线通信协议的演进之路 立即下载
CentOS Nginx PHP JAVA 多语言镜像使用手 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载