我正在编写 nginx 配置,有一个基本问题。
以下有哪些区别:
listen 443 ssl;
对比listen [::]:443 ssl;
对比listen [::]:443 ssl http2;
我的目标是确保这个网络应用程序的安全,同时也保持与老客户端的兼容性。
注意:我知道这[::]:443
和 ipv6 有关,但在这种情况下它是否也包含 ipv4?想澄清一下我的概念。
答案1
listen 443 ssl
:使 nginx 在服务器上监听所有 ipv4 地址,端口为 443(0.0.0.0:443
)
尽管
listen [::]:443 ssl
:使 nginx 在服务器上监听所有 ipv6 地址,端口为 443(:::443
)
[::]:443
不会让 nginx 默认响应 ipv4,除非你指定参数ipv6only=off
:
listen [::]:443 ipv6only=off;
根据文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
SSL:
ssl 参数(0.7.14)允许指定在此端口上接受的所有连接都应在 SSL 模式下工作。
http2:
http2 参数(1.9.5)配置端口接受HTTP/2连 接。
这并不意味着它只接受 HTTP/2 连接。
按照RFC7540
如果客户端在事先不知道下一跳是否支持 HTTP/2 的情况下发出“http”URI 请求,则可以使用 HTTP 升级机制。客户端通过发出 HTTP/1.1 请求(其中包含带有“h2c”令牌的升级标头字段)来实现此目的。
不支持 HTTP/2 的服务器可以像不存在 Upgrade 标头字段一样响应请求。
HTTP/1.1 200 OK Content-Length: 243 Content-Type: text/html
支持 HTTP/2 的服务器会通过 101(切换协议)响应接受升级。在终止 101 响应的空行之后,服务器可以开始发送 HTTP/2 帧。
总结一下:
不支持 HTTP/2 的客户端永远不会要求服务器进行 HTTP/2 通信升级:它们之间的通信将完全是 HTTP1/1。
支持 HTTP/2 的客户端将向服务器(使用 HTTP1/1)请求 HTTP/2 升级:
- 如果服务器已准备好支持 HTTP/2,那么服务器将会通知客户端:它们之间的通信将切换到 HTTP/2。
- 如果服务器尚未准备好 HTTP/2,则服务器将忽略使用 HTTP1/1 应答的升级请求:它们之间的通信应该保持大量 HTTP1/1。
也许这里可以做更多的总结:http://qnimate.com/http2-compatibility-with-old-browsers-and-servers/
但是 nginx 文档对 TLS 上的 HTTP/2 进行了如下说明:
请注意,通过 TLS 接受 HTTP/2 连接需要“应用层协议协商”(ALPN)TLS 扩展支持,该支持自 OpenSSL 版本 1.0.2 起可用。
确保老客户遵守此要求。
答案2
有一个选项ipv6only
,用于确定 IPv6 地址是否也适用于 IPv4。默认情况下,它是打开的(这意味着它不适用)。
手册上说它只能设置一次,我认为这意味着如果你在一个指令中将其关闭listen
,那么它将被全部关闭。
看这个文件了解详情。