【问题标题】:Enable http2 in nginx only for some clients仅对某些客户端在 nginx 中启用 http2
【发布时间】:2019-05-24 14:46:53
【问题描述】:

我有两组用户使用okhttp/2.7.0okhttp/3.12.0。我只想在 nginx 中为使用okhttp/3.12.0 的用户启用 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 配置是这样的

server {
    listen 443 ssl http2;
    ...

【问题讨论】:

    标签: http web nginx server http2


    【解决方案1】:

    这是不可能的。客户端仅作为 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 的客户端在他们的 http2 实现中有一个错误。在支持 ALPN 的 nginx 上启用 http2 会禁止旧客户端访问服务器。
    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 2017-11-03
    • 2021-02-10
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多