语 法:
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 参数 (0.7.14) 允许指定此端口上接受的所有连接都应在 SSL 模式下工作。这允许对处理 HTTP 和 HTTPS 请求的服务器进行更紧凑的配置。
http2 参数 (1.9.5) 将端口配置为接受 HTTP/2 连接。通常,为此还应指定 ssl 参数,但 nginx 也可以配置为接受没有 SSL 的 HTTP/2 连接。
spdy 参数 (1.3.15-1.9.4) 允许在此端口上接受 SPDY 连接。通常,为此还应指定 ssl 参数,但也可以将 nginx 配置为接受没有 SSL 的 SPDY 连接。
proxy_protocol 参数 (1.5.12) 允许指定此端口上接受的所有连接都应使用代理协议。注意:从版本 1.13.11 开始支持代理协议版本 2。
listen 指令可以有几个特定于套接字相关系统调用的附加参数。这些参数可以在任何 listen 指令中指定,但对于给定的 address:port 对只能指定一次。注意:在 0.8.21 之前的版本中,它们只能在 listen 指令中与默认参数一起指定。
此参数 (0.8.44) 为侦听套接字设置关联的路由表 FIB(SO_SETFIB 选项),目前仅适用于 FreeBSD。
为侦听套接字启用 “TCP Fast Open”(1.5.8)并限制尚未完成三次握手的连接队列的最大长度。注意:不要启用此功能,除非服务器可以处理多次接收带有数据的同一个 SYN 数据包。
在 listen() 调用中设置 backlog 参数,该参数限制待处理连接队列的最大长度。默认情况下,backlog 在 FreeBSD、DragonFly BSD 和 macOS 上设置为 -1,在其他平台上设置为 511。
为侦听套接字设置接收缓冲区大小(SO_RCVBUF 选项)。
设置侦听套接字的发送缓冲区大小(SO_SNDBUF 选项)。
为侦听套接字设置接受过滤器的名称(SO_ACCEPTFILTER 选项),用于在将传入连接传递给 accept() 之前过滤传入连接。这仅适用于 FreeBSD 和 NetBSD 5.0+。可能的值为 dataready 和 httpready。
指示在 Linux 上使用延迟的 accept()(TCP_DEFER_ACCEPT 套接字选项)。
指示对给定的 address:port 对进行单独的 bind() 调用。这很有用,因为如果有多个侦听指令具有相同的端口但地址不同,并且其中一个侦听指令侦听给定端口 (*:port) 的所有地址,则 nginx 将仅将 bind() 绑定到 *:port。应该注意的是,在这种情况下将进行getsockname() 系统调用以确定接受连接的地址。如果使用 setfib、fastopen、backlog、rcvbuf、sndbuf、accept_filter、deferred、ipv6only、reuseport 或 so_keepalive 参数,那么对于给定的 address:port 对,将始终进行单独的 bind() 调用。
此参数 (0.7.42) 确定(通过 IPV6_V6ONLY 套接字选项)侦听通配符地址 [::] 的 IPv6 套接字将仅接受 IPv6 连接还是同时接受 IPv6 和 IPv4 连接。该参数默认开启,它只能在启动时设置一次。注意:在 1.3.4 版本之前,如果省略此参数,则操作系统的设置对套接字有效。
此参数 (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)。注意:不恰当地使用此选项可能会带来安全隐患。
此参数 (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 参数进行配置。 可以省略一两个参数,在这种情况下,相应套接字选项的系统默认设置将生效。例如,
将空闲超时 (TCP_KEEPIDLE) 设置为 30 分钟,将探测间隔 (TCP_KEEPINTVL) 保留为其系统默认值,并将探测计数 (TCP_KEEPCNT) 设置为 10 个探测。
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;