我有两组用户使用okhttp/2.7.0
和okhttp/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;
...
答案 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。解释一下,也许有更好的方法来实现您想要的。