`listen  443  ssl`  与  `listen  443  ssl  http2`  的核心区别在于:后者为  HTTPS  站点开启了  HTTP/2  协议支持,从而能带来显著的性能提升。但需要注意,这是一个历史性的写法,在较新的  Nginx  版本中已被弃用。

一、核心区别:协议支持

  `listen  443  ssl;`

          含义:让  Nginx  在  443  端口监听,并接受  HTTP/1.1  协议的  HTTPS  连接。

          结果:所有连接都将使用  HTTP/1.1  协议。

  `listen  443  ssl  http2;`

          含义:在  `listen  443  ssl`  的基础上,额外告知  Nginx  在  443  端口接受  HTTP/2  协议的连接。

          结果:支持  HTTP/2  的客户端将与服务器建立  HTTP/2  连接,不支持的客户端则会回退到  HTTP/1.1,保证了兼容性。

二、性能优势:为何要启用  HTTP/2

启用  HTTP/2  的主要目的是为了性能优化。与  HTTP/1.1  相比,HTTP/2  带来了两大核心优势:

1.    多路复用  (Multiplexing):允许在同一个连接上并发处理多个请求,解决了  HTTP/1.1  的队头阻塞问题,显著提升了页面加载速度。

2.    头部压缩  (Header  Compression):使用  HPACK  算法压缩  HTTP  头部,减少了传输的数据量。

有测试表明,开启  HTTP/2  后网站速度可能提升高达  66%。

三、重要变更:Nginx  1.25.1  及以后版本

从  Nginx  1.25.1  版本开始,`listen  443  ssl  http2;`  这种写法已被弃用  (deprecated)。如果你在  1.25.1+  版本中使用旧语法,Nginx  会发出警告。官方推荐将  HTTP/2  的配置从  `listen`  指令中分离出来。

  旧语法  (已弃用):

    ```nginx

    server  {

            listen  443  ssl  http2;

            #  ...  其他配置

    }

    ```

  新语法  (推荐):

    ```nginx

    server  {

            listen  443  ssl;

            http2  on;

            #  ...  其他配置

    }

    ```

    这个变更让配置语义更清晰,也为未来支持  HTTP/3  等新协议预留了架构空间。

四、启用  HTTP/2  的前提条件

无论使用哪种语法,要成功启用  HTTP/2,你的  Nginx  环境需要满足以下条件:

1.    Nginx  版本:1.9.5  或以上。

2.    编译模块:编译  Nginx  时需包含  `--with-http_v2_module`  参数。

3.    OpenSSL  版本:1.0.2  或以上,以支持  ALPN(应用层协议协商)TLS  扩展。

4.    HTTPS  证书:需要配置有效的  SSL/TLS  证书。

五、总结

简单来说,`listen  443  ssl  http2`  是为了启用性能更好的  HTTP/2  协议。如果你正在使用新版的  Nginx(1.25.1+),请务必采用  `listen  443  ssl;`  配合  `http2  on;`  的新写法,这不仅能避免警告,也是官方推荐的配置方式。