listen 指令

语 法:

listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

默认值:listen *:80 | *:8000;

上下文:server

设置 nginx 监听地址,nginx 从这里接受请求。对于 IP 协议,这个地址就是 address 和 port;对于 UNIX 域套接字协议,这个地址就是 path。一条 listen 指令只能指定一个 address 或者 port。address 可以是 IP 地址,也可以是主机名。例如:

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;

IPv6 地址(0.7.36版)用方括号来表示:

listen [::]:8000;
listen [fe80::1];

UNIX 域套接字(0.8.21版)则使用 “unix:” 前缀:

listen unix:/var/run/nginx.sock;

如果只定义了 address,nginx 将默认使用 80 端口。

在没有定义 listen 指令的情况下,如果以超级用户权限运行 nginx,它将监听 *:80,否则他将监听 *:8000。

如果 listen 指令携带 default_server 参数,当前虚拟主机将成为指定 address:port 的默认虚拟主机。如果任何 listen 指令都没有携带 default_server 参数,那么第一个监听 address:port 的虚拟主机将被作为这个地址的默认虚拟主机。

在 0.8.21 之前的版本中,此参数被简单地命名为 default。

可以为 listen 指令定义若干额外的参数,这些参数用于套接字相关的系统调用。这些参数可以在任何 listen 指令中指定,但是对于每个 address:port,只能定义一次。

listen 支持的额外参数:

ssl 参数

ssl 参数 (0.7.14) 允许指定此端口上接受的所有连接都应在 SSL 模式下工作。这允许对处理 HTTP 和 HTTPS 请求的服务器进行更紧凑的配置。

http2 参数

http2 参数 (1.9.5) 将端口配置为接受 HTTP/2 连接。通常,为此还应指定 ssl 参数,但 nginx 也可以配置为接受没有 SSL 的 HTTP/2 连接。

spdy 参数

spdy 参数 (1.3.15-1.9.4) 允许在此端口上接受 SPDY 连接。通常,为此还应指定 ssl 参数,但也可以将 nginx 配置为接受没有 SSL 的 SPDY 连接。

proxy_protocol 参数

proxy_protocol 参数 (1.5.12) 允许指定此端口上接受的所有连接都应使用代理协议。注意:从版本 1.13.11 开始支持代理协议版本 2。

listen 指令可以有几个特定于套接字相关系统调用的附加参数。这些参数可以在任何 listen 指令中指定,但对于给定的 address:port 对只能指定一次。注意:在 0.8.21 之前的版本中,它们只能在 listen 指令中与默认参数一起指定。

setfib=number

此参数 (0.8.44) 为侦听套接字设置关联的路由表 FIB(SO_SETFIB 选项),目前仅适用于 FreeBSD。

fastopen=number 

为侦听套接字启用 “TCP Fast Open”(1.5.8)并限制尚未完成三次握手的连接队列的最大长度。注意:不要启用此功能,除非服务器可以处理多次接收带有数据的同一个 SYN 数据包。

backlog=number 

在 listen() 调用中设置 backlog 参数,该参数限制待处理连接队列的最大长度。默认情况下,backlog 在 FreeBSD、DragonFly BSD 和 macOS 上设置为 -1,在其他平台上设置为 511。

rcvbuf=size 

为侦听套接字设置接收缓冲区大小(SO_RCVBUF 选项)。

sndbuf=size 

设置侦听套接字的发送缓冲区大小(SO_SNDBUF 选项)。

accept_filter=filter 

为侦听套接字设置接受过滤器的名称(SO_ACCEPTFILTER 选项),用于在将传入连接传递给 accept() 之前过滤传入连接。这仅适用于 FreeBSD 和 NetBSD 5.0+。可能的值为 dataready 和 httpready。

deferred 

指示在 Linux 上使用延迟的 accept()(TCP_DEFER_ACCEPT 套接字选项)。

bind 

指示对给定的 address:port 对进行单独的 bind() 调用。这很有用,因为如果有多个侦听指令具有相同的端口但地址不同,并且其中一个侦听指令侦听给定端口 (*:port) 的所有地址,则 nginx 将仅将 bind() 绑定到 *:port。应该注意的是,在这种情况下将进行getsockname() 系统调用以确定接受连接的地址。如果使用 setfib、fastopen、backlog、rcvbuf、sndbuf、accept_filter、deferred、ipv6only、reuseport 或 so_keepalive 参数,那么对于给定的 address:port 对,将始终进行单独的 bind() 调用。

ipv6only=on|off 

此参数 (0.7.42) 确定(通过 IPV6_V6ONLY 套接字选项)侦听通配符地址 [::] 的 IPv6 套接字将仅接受 IPv6 连接还是同时接受 IPv6 和 IPv4 连接。该参数默认开启,它只能在启动时设置一次。注意:在 1.3.4 版本之前,如果省略此参数,则操作系统的设置对套接字有效。

reuseport 

此参数 (1.9.1) 指示为每个工作进程创建一个单独的侦听套接字(在 Linux 3.9+ 和 DragonFly BSD 上使用 SO_REUSEPORT 套接字选项,或在 FreeBSD 12+ 上使用 SO_REUSEPORT_LB),允许内核在工作进程之间分配传入连接。这目前仅适用于 Linux 3.9+、DragonFly BSD 和 FreeBSD 12+ (1.15.1)。注意:不恰当地使用此选项可能会带来安全隐患。

so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] 

此参数 (1.1.11) 为侦听套接字配置 “TCP keepalive” 行为。如果省略此参数,则操作系统的设置将对套接字生效。如果它设置为值“on”,则为套接字打开 SO_KEEPALIVE 选项。如果将其设置为值“off”,则套接字的 SO_KEEPALIVE 选项将关闭。某些操作系统支持使用 TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT 套接字选项在每个套接字的基础上设置 TCP 保持连接参数。在此类系统上(目前,Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE),它们可以使用 keepidle、keepintvl 和 keepcnt 参数进行配置。 可以省略一两个参数,在这种情况下,相应套接字选项的系统默认设置将生效。例如,

so_keepalive=30m::10 

将空闲超时 (TCP_KEEPIDLE) 设置为 30 分钟,将探测间隔 (TCP_KEEPINTVL) 保留为其系统默认值,并将探测计数 (TCP_KEEPCNT) 设置为 10 个探测。

示例

listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号