了解 nginx‘listen’指令的不同值

了解 nginx‘listen’指令的不同值

我正在编写 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,那么它将被全部关闭。

这个文件了解详情。

相关内容