理解nginx'listen'指令的不同值

我写nginxconfiguration,我有一个基本的问题。

有什么区别:

listen 443 ssl; vs listen [::]:443 ssl; vs listen [::]:443 ssl http2;

我的目标是确保这个Web应用程序,但也保持兼容旧客户端。

注意:我知道[::]:443必须与ipv6,但它包含ipv4以及在这种情况下? 想清除我的概念。

listen 443 ssl :使nginx侦听服务器上的所有ipv4地址,端口443( 0.0.0.0:443

listen [::]:443 ssl :使nginx监听服务器上的所有ipv6地址,端口443( :::443


[::]:443除非你指定参数ipv6only=off ,否则默认情况下[::]:443不会使nginx在ipv4上响应:

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)将端口configuration为接受HTTP / 2连接。

这并不意味着它只接受HTTP / 2连接。

根据RFC7540

在没有关于下一跳HTTP / 2支持的事先知识的情况下请求“http”URI的客户端使用HTTP升级机制。 客户端通过使用包含具有“h2c”标记的升级标题字段的HTTP / 1.1请求来这样做。

不支持HTTP / 2的服务器可以像升级标题字段不存在一样响应请求。

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文档声明了关于HTTP / 2 over TLS的以下内容:

请注意,通过TLS接受HTTP / 2连接需要“应用程序层协议协商”(ALPN)TLS扩展支持,该支持仅在OpenSSL版本1.0.2以后才可用。

确保老客户符合这个要求。

有一个名为ipv6only的选项,它决定IPv6地址是否也适用于IPv4。 默认情况下,它被打开(这意味着它不)。

该手册指出,它只能被设置一次,我认为这意味着如果你关掉一个listen指令,它将被closures。

详情请参阅此文件 。