V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
lansquenet
V2EX  ›  NGINX

各位老哥, http2 是不是依赖 ssl

  •  
  •   lansquenet · 2019-08-16 18:58:41 +08:00 · 7131 次点击
    这是一个创建于 1686 天前的主题,其中的信息可能已经有所发展或是发生改变。
    server {
    	listen 80 http2;
    	server_name www.aaa.com;
    }
    server {
    	listen 443 ssl http2;
    	server_name www.bbb.com;
    }
    

    www.aaa.com 不能工作,www.bbb.com 正常工作,各位老哥请问是什么原因呢?

    21 条回复    2019-08-18 09:42:32 +08:00
    input2output
        1
    input2output  
       2019-08-16 19:00:52 +08:00   ❤️ 2
    可以没有 SSL,但主流浏览器只支持基于 SSL 的
    weiruanniubi
        2
    weiruanniubi  
       2019-08-16 19:07:47 +08:00   ❤️ 1
    是的,http 版的 h2 没有浏览器和 server 支持。
    lansquenet
        3
    lansquenet  
    OP
       2019-08-16 19:08:46 +08:00
    @input2output 我这样子配置后,用 chrome 浏览器访问 http://www.aaa.com ,直接下载了。
    lansquenet
        4
    lansquenet  
    OP
       2019-08-16 19:09:44 +08:00
    @weiruanniubi 那么不通过浏览器的话可以正常使用是吗?比方说接口的调用。
    input2output
        5
    input2output  
       2019-08-16 19:25:42 +08:00   ❤️ 1
    @lansquenet #3 应该是因为没有输出,且没有 content-type: 的 header , 被浏览器识别为二进制字符了吧
    你没设置 root 之类的配置内容
    SingeeKing
        6
    SingeeKing  
       2019-08-16 19:29:13 +08:00   ❤️ 1
    @lansquenet #4 不可以,因为 server 根本不支持
    lansquenet
        7
    lansquenet  
    OP
       2019-08-16 19:37:30 +08:00
    @input2output 设置了。还是一样。而且奇怪的的是,我在其中的一个虚拟主机(监听的是 80 端口),开启 http2,其他的所有虚拟主机(监听 80 端口)全部不工作,不正常,但是开启 ssl http2 的虚拟机主机(监听 443 )端口的能正常工作。
    input2output
        8
    input2output  
       2019-08-16 19:46:28 +08:00   ❤️ 1
    @lansquenet #7 我自己也配了一个环境,的确是这样,加上 HTTP2 的话 curl 就显示是二进制输出
    每次二进制输出也都是一样的,估计是 nginx 或者客户端不支持 无 TLS 的 HTTP2 吧
    lansquenet
        9
    lansquenet  
    OP
       2019-08-16 19:54:49 +08:00
    ```bash
    server {
    listen 80;
    server_name aaa;
    }

    server {
    listen 80;
    server_name bbb;
    }

    server {
    listen 80;
    server_name ccc;
    }
    ```

    aaa 和 bbb 以及 ccc 都没有启用 http2,此时这三个虚拟主机都正常工作。
    ```bash
    server {
    listen 80;
    server_name aaa;
    }

    server {
    listen 80;
    server_name bbb;
    }

    server {
    listen 80 http2;
    server_name ccc;
    }
    ```

    当 ccc 启用 http2 后,aaa bbb ccc 都变得不正常了,都变成访问即下载了,nginx -s reload 又没有报错。
    weiruanniubi
        10
    weiruanniubi  
       2019-08-16 19:58:45 +08:00   ❤️ 1
    还是服从主流吧,上 https 又不难,这种理论可行却被实际抛弃的东西,硬上的话后面只会有无数的坑。
    anubu
        11
    anubu  
       2019-08-16 20:01:46 +08:00   ❤️ 1
    不是,只是主流实现是这样的。也有很多支持 h2c 的客户端和服务端,看这里 https://github.com/http2/http2-spec/wiki/Implementations
    input2output
        12
    input2output  
       2019-08-16 20:12:48 +08:00   ❤️ 2
    nginx 是支持无 TLS 的 HTTP2 的,但主流客户端不支持,用 go 写的一个客户端,可以获取内容
    input2output
        13
    input2output  
       2019-08-16 20:16:58 +08:00   ❤️ 1
    至于 #9 的问题,技术有限,暂时不清楚
    lansquenet
        14
    lansquenet  
    OP
       2019-08-16 20:43:02 +08:00
    @input2output 虽然你这里可以获取内容,但是协议是 http/1.1。想不通,脑壳痛。
    janxin
        15
    janxin  
       2019-08-16 20:44:50 +08:00   ❤️ 1
    HTTP/2 是有非加密的 h2c,不过需要服务端和客户端双方支持。
    lansquenet
        16
    lansquenet  
    OP
       2019-08-16 20:46:48 +08:00
    @janxin 妥协了,直接重定向到 https 上去了。
    input2output
        17
    input2output  
       2019-08-16 20:51:25 +08:00   ❤️ 1
    @lansquenet #14 上面那个是通过 HTTP/2.0 的,是用 go 自己写的客户端,下面是 curl 的
    现象 说明 nginx 支持无 TLS 的 H2, 是 curl 及主流客户端不支持

    至于转到 HTTP/1.1 ,好象是 curl 由于不支持无 TLS 的 H2,自动转到 HTTP/1.1 的
    最后输出却二进制文件,这个我也不知道了
    3CH0
        18
    3CH0  
       2019-08-17 14:22:26 +08:00   ❤️ 2
    @input2output 用 curl --http2 试试
    input2output
        19
    input2output  
       2019-08-17 16:31:04 +08:00   ❤️ 1
    @3CH0 #18 我找了相关资料后,发现 curl 是支持 H2C (无 TLS 的 HTTP/2 )的,但要加 --http2-prior-knowledge 参数,而 --http2 这个参数 倒似乎没太大关系(只加 --http2 我这边也是输出二进制内容)
    input2output
        20
    input2output  
       2019-08-17 16:32:09 +08:00   ❤️ 1
    (补两张图)
    willm
        21
    willm  
       2019-08-18 09:42:32 +08:00   ❤️ 1
    HTTP/2 的 RFC 是支持无 SLL 的,但是目前 HTTP/2 的主要实现( Chrome/FF 等)都无视了这一点,只支持有 SSL 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5256 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:23 · PVG 15:23 · LAX 00:23 · JFK 03:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.