模块 ngx_stream_core_module
示例配置 Directives 侦 听preread_buffer_size preread_timeout proxy_protocol_timeout 解析器 resolver_timeout服务器 server_name server_names_hash_bucket_size server_names_ hash_max_size流 tcp_nodelay variables_hash_bucket_size variables_hash_max_size 嵌入变量 |
模块
自版本 1.9.0 起可用。
默认情况下,此模块不是构建的,应使用 configuration 参数启用它。ngx_stream_core_module
--with-stream
示例配置
worker_processes auto; error_log /var/log/nginx/error.log info; events { worker_connections 1024; } stream { upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend3; } upstream dns { server 192.168.0.1:53535; server dns.example.com:53; } server { listen 12345; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass backend; } server { listen 127.0.0.1:53 udp reuseport; proxy_timeout 20s; proxy_pass dns; } server { listen [::1]:12345; proxy_pass unix:/tmp/stream.socket; } }
Directives
语法: |
listen
|
---|---|
默认值: | — |
上下文: |
server |
设置 socket 的 和
服务器将接受连接。
可以只指定端口。
地址也可以是主机名,例如:address
port
listen 127.0.0.1:12345; listen *:12345; listen 12345; # same as *:12345 listen localhost:12345;
IPv6 地址在方括号中指定:
listen [::1]:12345; listen [::]:12345;
UNIX 域套接字使用 “” 指定
前缀:unix:
listen unix:/var/run/nginx.sock;
端口范围 (1.15.10) 使用 第一个和最后一个端口之间用连字符分隔:
listen 127.0.0.1:12345-12399; listen 12345-12399;
参数(如果存在)
将导致服务器成为指定 : 对 (1.25.5) 的默认服务器。
如果没有任何Directives具有参数,则第一个具有 : 对的服务器将为
此对的默认服务器。default_server
address
port
default_server
address
port
该参数允许指定所有
此端口接受的连接应在 SSL 模式下工作。ssl
该参数配置一个监听套接字
用于处理数据报 (1.9.13)。
为了处理来自同一会话中相同地址和端口的数据包,
reuseport
参数
还应指定。udp
参数 (1.11.4)
允许指定此端口上接受的所有连接都应使用 PROXY
协议。proxy_protocol
从版本 1.13.11 开始支持 PROXY 协议版本 2。
Directives
可以具有几个特定于 socket 相关系统调用的附加参数。
这些参数可以在任何Directives中指定,但只能为给定的 : 对指定一次。listen
listen
address
port
-
setfib
=number
- 此参数 (1.25.5) 设置关联的路由表 FIB
(该选项)用于侦听套接字。
这目前只适用于 FreeBSD。
SO_SETFIB
-
fastopen
=number
- 使
TCP 快速打开
对于侦听套接字 (1.21.0),并限制尚未完成的连接队列的最大长度
三次握手。
除非服务器可以处理,否则不要启用此功能 多次接收包含数据的相同 SYN 数据包。
-
backlog
=number
- 在调用中设置限制
待处理连接队列的最大长度 (1.9.2)。
默认情况下,在 FreeBSD、DragonFly BSD 和 macOS 上设置为 -1,
以及其他平台上的 511。
backlog
listen()
backlog
-
rcvbuf
=size
- 设置接收缓冲区大小
(选项)用于侦听套接字 (1.11.13)。
SO_RCVBUF
-
sndbuf
=size
- 设置发送缓冲区大小
(选项)用于侦听套接字 (1.11.13)。
SO_SNDBUF
-
accept_filter
=filter
- 设置 Accept 过滤器的名称
(选项)用于侦听套接字
在将传入连接传递给 (1.25.5) 之前对其进行过滤。
这仅适用于 FreeBSD 和 NetBSD 5.0+。
可能的值为 dataready 和 httpready。
SO_ACCEPTFILTER
accept()
-
deferred
- 指示在 Linux (1.25.5) 上使用 deferred(套接字选项)。
accept()
TCP_DEFER_ACCEPT
-
bind
- 此参数指示对给定的 address:port 对进行单独调用。
事实是,如果有多个带有
相同的端口但不同的地址,并且其中一个Directives侦听所有地址
对于给定的端口 (),nginx 将仅对 .
应该注意的是,系统调用将是
用于确定接受连接的地址。
如果 、 、 、
或 parameters
则用于给定的 : 对
将始终进行单独的调用。
bind()
listen
listen
*:
port
bind()
*:
port
getsockname()
setfib
fastopen
backlog
rcvbuf
sndbuf
accept_filter
deferred
ipv6only
reuseport
so_keepalive
address
port
bind()
-
ipv6only
=on
|off
- 此参数确定
(通过 socket 选项)
侦听通配符地址的 IPv6 套接字是只接受 IPv6 连接,还是同时接受 IPv6 和 IPv4 连接。
默认情况下,此参数处于打开状态。
它只能在启动时设置一次。
IPV6_V6ONLY
[::]
-
reuseport
- 此参数 (1.9.1) 指示创建单独的侦听套接字
对于每个工作进程
(在 Linux 3.9+ 和 DragonFly BSD 上使用 socket 选项,
或在 FreeBSD 12+ 上),允许内核
在 worker 进程之间分配传入连接。
这目前仅适用于 Linux 3.9+、DragonFly BSD、
和 FreeBSD 12+ (1.15.1)。
SO_REUSEPORT
SO_REUSEPORT_LB
不恰当地使用此选项可能会产生其安全隐患。
-
so_keepalive
=on
||[]:[]:[off
keepidle
keepintvl
keepcnt
] - 此参数配置 “TCP keepalive” 行为
用于侦听套接字。
如果省略此参数,则作系统的设置将为
对 socket 有效。
如果它设置为值 “”,则为套接字打开该选项。
如果它设置为值 “”,则关闭套接字的选项。
某些作系统支持在
使用 、 和 socket 选项的 per-socket 基础。
在此类系统上(目前为 Linux 2.4+、NetBSD 5+ 和
FreeBSD 9.0-STABLE),它们可以被配置
使用 、 和 参数。
可以省略一个或两个参数,在这种情况下,系统默认设置
的相应 socket 选项将生效。
例如
on
SO_KEEPALIVE
off
SO_KEEPALIVE
TCP_KEEPIDLE
TCP_KEEPINTVL
TCP_KEEPCNT
keepidle
keepintvl
keepcnt
将空闲超时 () 设置为 30 分钟, 将探测间隔 () 保留为其系统默认值, 并将 Probes count () 设置为 10 个探针。so_keepalive=30m::10
TCP_KEEPIDLE
TCP_KEEPINTVL
TCP_KEEPCNT
在 1.25.5 版本之前,不同的服务器必须侦听不同的 : 对。address
port
语法: |
preread_buffer_size |
---|---|
默认值: |
preread_buffer_size 16k; |
上下文: |
stream ,server |
该Directives出现在版本 1.11.5 中。
指定预读缓冲区的 a。size
语法: |
preread_timeout |
---|---|
默认值: |
preread_timeout 30s; |
上下文: |
stream ,server |
该Directives出现在版本 1.11.5 中。
指定预读阶段的 a。timeout
语法: |
proxy_protocol_timeout |
---|---|
默认值: |
proxy_protocol_timeout 30s; |
上下文: |
stream ,server |
该Directives出现在版本 1.11.4 中。
指定 for
读取 PROXY 协议标头以完成。
如果在此时间内没有传输整个标头,
连接已关闭。timeout
语法: |
resolver
|
---|---|
默认值: | — |
上下文: |
stream ,server |
该Directives出现在版本 1.11.3 中。
配置用于解析上游服务器名称的名称服务器 转换为地址,例如:
resolver 127.0.0.1 [::1]:5353;
地址可以指定为域名或 IP 地址, 带有可选端口。 如果未指定 port,则使用端口 53。 名称服务器以循环方式查询。
默认情况下,nginx 将在解析时查找 IPv4 和 IPv6 地址。
如果不需要查找 IPv4 或 IPv6 地址,
(1.23.1) 或
可以指定该参数。ipv4=off
ipv6=off
默认情况下,nginx 使用响应的 TTL 值缓存答案。
optional 参数允许覆盖它:valid
resolver 127.0.0.1 [::1]:5353 valid=30s;
为了防止 DNS 欺骗,建议 在适当保护的可信本地网络中配置 DNS 服务器。
可选参数 (1.17.1)
启用请求和响应的 DNS 服务器统计信息的收集
在指定的 .
该参数作为我们商业订阅的一部分提供。status_zone
zone
在版本 1.11.3 之前,该Directives作为我们商业订阅的一部分提供。
语法: |
resolver_timeout |
---|---|
默认值: |
resolver_timeout 30s; |
上下文: |
stream ,server |
该Directives出现在版本 1.11.3 中。
设置名称解析的超时,例如:
resolver_timeout 5s;
在版本 1.11.3 之前,该Directives作为我们商业订阅的一部分提供。
语法: |
server { ... } |
---|---|
默认值: | — |
上下文: |
stream |
设置虚拟服务器的配置。 基于 IP(基于 IP 地址)之间没有明确的区分 和基于名称(基于 TLS 服务器名称指示扩展 (SNI, RFC 6066)) (1.25.5) 虚拟服务器。 相反,listen Directives描述所有 地址和端口,并且 server_name Directives列出了所有服务器名称。
语法: |
server_name |
---|---|
默认值: |
server_name ""; |
上下文: |
server |
该Directives出现在版本 1.25.5 中。
设置虚拟服务器的名称,例如:
server { server_name example.com www.example.com; }
名字将成为主服务器名称。
服务器名称可以包含星号 (“”)
替换名称的第一部分或最后一部分:*
server { server_name example.com *.example.com www.example.*; }
此类名称称为通配符名称。
上面提到的前两个名称可以合并为一个:
server { server_name .example.com; }
也可以在服务器名称中使用正则表达式,
在名称前加上波形符 (“”):~
server { server_name www.example.com ~^www\d+\.example\.com$; }
正则表达式可以包含稍后可以的捕获 用于其他Directives:
server { server_name ~^(www\.)?(.+)$; proxy_pass www.$2:12345; }
正则表达式中的命名捕获会创建变量 稍后可以在其他Directives中使用:
server { server_name ~^(www\.)?(?<domain>.+)$; proxy_pass www.$domain:12345; }
如果Directives的参数设置为 “”,则
计算机的主机名已插入。$hostname
在按名称搜索虚拟服务器时, 如果名称与多个指定的 variant 匹配,则 (例如,通配符名称和正则表达式都匹配),则第一个匹配 variant 将按以下优先级顺序选择:
- 确切名称
- 以星号开头的最长通配符名称,
例如 “”
*.example.com
- 以星号结尾的最长通配符名称,
例如 “”
mail.*
- 第一个匹配的正则表达式 (按在配置文件中出现的顺序)
语法: |
server_names_hash_bucket_size |
---|---|
默认值: |
server_names_hash_bucket_size 32|64|128; |
上下文: |
stream |
该Directives出现在版本 1.25.5 中。
设置服务器名称哈希表的存储桶大小。 默认值取决于处理器的 cache 行的大小。 设置哈希表的详细信息在单独的文档中提供。
语法: |
server_names_hash_max_size |
---|---|
默认值: |
server_names_hash_max_size 512; |
上下文: |
stream |
该Directives出现在版本 1.25.5 中。
设置服务器名称哈希表的最大值。
设置哈希表的详细信息在单独的文档中提供。size
语法: |
stream { ... } |
---|---|
默认值: | — |
上下文: |
main |
提供配置文件上下文,其中流服务器Directives 被指定。
语法: |
tcp_nodelay |
---|---|
默认值: |
tcp_nodelay on; |
上下文: |
stream ,server |
该Directives出现在版本 1.9.4 中。
启用或禁用该选项。
该选项对 Client 端和 Proxied 服务器连接都启用。TCP_NODELAY
语法: |
variables_hash_bucket_size |
---|---|
默认值: |
variables_hash_bucket_size 64; |
上下文: |
stream |
该Directives出现在版本 1.11.2 中。
设置变量哈希表的存储桶大小。 设置哈希表的详细信息在单独的文档中提供。
语法: |
variables_hash_max_size |
---|---|
默认值: |
variables_hash_max_size 1024; |
上下文: |
stream |
该Directives出现在版本 1.11.2 中。
设置变量哈希表的最大值。
设置哈希表的详细信息在单独的文档中提供。size
嵌入变量
该模块支持变量
从 1.11.2 开始。ngx_stream_core_module
$binary_remote_addr
- client address 的二进制形式,值的长度始终为 4 字节 对于 IPv4 地址或 16 字节(对于 IPv6 地址)
$bytes_received
- 从客户端接收的字节数 (1.11.4)
$bytes_sent
- 发送到客户端的字节数
$connection
- 连接序列号
$hostname
- 主机名
$msec
- 当前时间(以秒为单位),分辨率为毫秒
$nginx_version
- nginx 版本
$pid
- 工作进程的 PID
$protocol
- 用于与客户端通信的协议:OR (1.11.4)
TCP
UDP
$proxy_protocol_addr
- 来自 PROXY 协议标头的客户端地址 (1.11.4)
必须事先通过设置参数 在 listen Directives中。
proxy_protocol
$proxy_protocol_port
- 来自 PROXY 协议标头的 client 端口 (1.11.4)
必须事先通过设置参数 在 listen Directives中。
proxy_protocol
$proxy_protocol_server_addr
- 来自 PROXY 协议标头的服务器地址 (1.17.6)
必须事先通过设置参数 在 listen Directives中。
proxy_protocol
$proxy_protocol_server_port
- 来自 PROXY 协议标头的服务器端口 (1.17.6)
必须事先通过设置参数 在 listen Directives中。
proxy_protocol
$proxy_protocol_tlv_
name
- 来自 PROXY 协议标头 (1.23.2) 的 TLV。
可以是 TLV 类型名称或其数值。
在后一种情况下,该值为十六进制
,并且应该以 :
name
0x
SSL TLV 也可以通过 TLV 类型名称或其数值进行访问。 两者都以 : 为前缀$proxy_protocol_tlv_alpn $proxy_protocol_tlv_0x01
ssl_
$proxy_protocol_tlv_ssl_version $proxy_protocol_tlv_ssl_0x21
支持以下 TLV 类型名称:
-
alpn
(0x01
) - 通过连接使用的上层协议 -
authority
(0x02
) - 客户端传递的 host name 值 -
unique_id
(0x05
) - 唯一连接 ID -
netns
(0x30
) - 命名空间的名称 -
ssl
(0x20
) - 二进制 SSL TLV 结构
支持以下 SSL TLV 类型名称:
-
ssl_version
(0x21
) - 客户端连接中使用的 SSL 版本 -
ssl_cn
(0x22
) - SSL 证书公用名 -
ssl_cipher
(0x23
) - 所用密码的名称 -
ssl_sig_alg
(0x24
) - 用于签署证书的算法 -
ssl_key_alg
(0x25
) - 公钥算法
此外,还支持以下特殊 SSL TLV 类型名称:
-
ssl_verify
- 客户端 SSL 证书验证结果, 如果客户端提供证书,则为 0 并且它已成功验证,否则为非零
必须事先通过设置参数 在 listen Directives中。
proxy_protocol
-
$remote_addr
- 客户端地址
$remote_port
- 客户端端口
$server_addr
- 接受连接的服务器的地址
计算此变量的值通常需要一次系统调用。 为避免系统调用,listen Directives 必须指定地址并使用 parameter。
bind
$server_port
- 接受连接的服务器的端口
$session_time
- 会话持续时间(以秒为单位),分辨率为毫秒 (1.11.4);
$status
- 会话状态 (1.11.4) 可以是以下值之一:
$time_iso8601
- ISO 8601 标准格式的当地时间
$time_local
- 通用日志格式的当地时间