仅为部分客户端启用 nginx 中的 http2
Enable http2 in nginx only for some clients
我有两组用户使用 okhttp/2.7.0
和 okhttp/3.12.0
。我只想为那些使用 okhttp/3.12.0
的用户在 nginx 中启用 http2。客户端确保发送他们的标识符。有没有办法使用此信息并仅为这些用户启用 http2。
注意:多个端口不适合我。
我的 nginx 和 OS 版本
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 配置文件是这样的
server {
listen 443 ssl http2;
...
这真的不可能。客户端仅作为 HTTP 消息的一部分发送,显然,只有 确定要使用的 HTTP 版本后才发送。创建连接并设置 SSL/TLS 参数的初始消息不会有客户端(这通常是使用 TLS 的 ALPN 扩展决定 HTTP 版本的地方)。
然而,还有其他方法可以做到这一点,包括:
取决于客户端的能力。我对 okhttp 不熟悉,但从快速 Google 看来,ALPN 支持似乎仅在 v3 中添加,因此您可以在服务器上禁用旧的 NPN,然后,如果这是正确的,那么理论上旧的客户端将无法协商 HTTP/2,因此将退回到 HTTP/1.1。不幸的是,似乎没有 Nginx 配置选项,所以你需要构建一个特殊版本的 OpenSSL without NPN support,然后根据它编译 Nginx。可能麻烦多了。
使用 Apache 而不是 Nginx,因为它从不支持 NPN
使用多个 IP 并以某种方式将每个版本定向到一个单独的 IP。虽然我怀疑你不能使用单独的端口,但你可能也不能这样做。
总而言之,老实说,这有点骇人听闻,因此我不建议您追求。但是,您没有解释的是为什么要对一组客户端而不是另一组客户端使用 HTTP/2 。如果你解释一下,也许有更好的方法来实现你想要的。
我有两组用户使用 okhttp/2.7.0
和 okhttp/3.12.0
。我只想为那些使用 okhttp/3.12.0
的用户在 nginx 中启用 http2。客户端确保发送他们的标识符。有没有办法使用此信息并仅为这些用户启用 http2。
注意:多个端口不适合我。
我的 nginx 和 OS 版本
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 配置文件是这样的
server {
listen 443 ssl http2;
...
这真的不可能。客户端仅作为 HTTP 消息的一部分发送,显然,只有 确定要使用的 HTTP 版本后才发送。创建连接并设置 SSL/TLS 参数的初始消息不会有客户端(这通常是使用 TLS 的 ALPN 扩展决定 HTTP 版本的地方)。
然而,还有其他方法可以做到这一点,包括:
取决于客户端的能力。我对 okhttp 不熟悉,但从快速 Google 看来,ALPN 支持似乎仅在 v3 中添加,因此您可以在服务器上禁用旧的 NPN,然后,如果这是正确的,那么理论上旧的客户端将无法协商 HTTP/2,因此将退回到 HTTP/1.1。不幸的是,似乎没有 Nginx 配置选项,所以你需要构建一个特殊版本的 OpenSSL without NPN support,然后根据它编译 Nginx。可能麻烦多了。
使用 Apache 而不是 Nginx,因为它从不支持 NPN
使用多个 IP 并以某种方式将每个版本定向到一个单独的 IP。虽然我怀疑你不能使用单独的端口,但你可能也不能这样做。
总而言之,老实说,这有点骇人听闻,因此我不建议您追求。但是,您没有解释的是为什么要对一组客户端而不是另一组客户端使用 HTTP/2 。如果你解释一下,也许有更好的方法来实现你想要的。