仅在某些客户端中在Nginx中启用http2

时间:2018-12-26 09:55:21

标签: http web nginx server http2

我有两组用户使用okhttp/2.7.0okhttp/3.12.0。我只想为正在使用okhttp/3.12.0的那些用户启用nginx中的http2。客户端确保发送其标识符。有没有办法使用此信息并仅为那些用户启用http2。

注意:我不可以选择多个端口。

我的nginx和操作系统版本

nginx version: nginx/1.14.2                                                                                                                                                                                                                  
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)                                                                                                                                                                                           
built with OpenSSL 1.0.2h  3 May 2016                                                                                                                                                                                                        
TLS SNI support enabled  

我的nginx conf像这样

server {
    listen 443 ssl http2;
    ...

1 个答案:

答案 0 :(得分:1)

这实际上是不可能的。客户端仅作为HTTP消息的一部分发送,很明显,仅在 之后才确定要使用的HTTP版本。创建连接并设置SSL / TLS参数的最初消息将没有客户端(通常是使用ALPN TLS扩展名决定HTTP版本的客户端)。

但是,还有其他可能的方法,包括:

  • 取决于客户端的功能。我对okhttp不太熟悉,但是从一个快速的Google看来,ALPN支持仅在v3中添加了,因此您可以在服务器上禁用较早的NPN,然后,如果是正确的话,那么从理论上讲,较旧的客户端将无法协商HTTP / 2,因此将回退到HTTP / 1.1。不幸的是,似乎没有Nginx配置选项,因此您需要构建一个特殊版本的OpenSSL without NPN support,然后针对该版本编译Nginx。麻烦可能超出其价值。

  • 使用Apache代替Nginx,因为它从不支持NPN

  • 使用多个IP,并以某种方式将每个版本定向到单独的IP。尽管我怀疑您无法使用单独的端口,但您也可能无法执行此操作。

说实话,总而言之,这有点骇人听闻,所以我建议您不要这样做。但是,您尚未解释的是为什么要对一组客户端使用HTTP / 2,而不对另一组客户端使用HTTP / 2。解释一下,也许有更好的方法来实现您想要的。