`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;` 的新写法,这不仅能避免警告,也是官方推荐的配置方式。