模块 ngx_stream_core_module
该ngx_stream_core_module模块自 1.9.0 版本起可用。该模块不是默认构建的,需要通过
--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;
}
}
指令
| 句法: |
listen
|
|---|---|
| 默认: | — |
| 语境: |
server |
设置服务器将在其上接受连接的套接字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;
该ssl参数允许指定此端口上接受的所有连接都应在 SSL 模式下工作。
该udp参数配置用于处理数据报的侦听套接字 (1.9.13)。为了在同一个会话中处理来自相同地址和端口的数据包,reuseport还应该指定该参数。
参数proxy_protocol(1.11.4) 允许指定此端口上接受的所有连接都应使用
PROXY 协议。
自 1.13.11 版本起支持 PROXY 协议版本 2。
该listen指令可以有几个特定于套接字相关系统调用的附加参数。
-
fastopen=number - 为侦听套接字(1.21.0)
启用“ TCP 快速打开”,并限制
尚未完成三向握手的连接队列的最大长度。
除非服务器可以处理 多次 接收 带有数据的相同 SYN 数据包,否则不要启用此功能。
-
backlog=number backlog在调用中 设置listen()限制挂起连接队列最大长度的参数 (1.9.2)。默认情况下,backlog在 FreeBSD、DragonFly BSD 和 macOS 上设置为 -1,在其他平台上设置为 511。-
rcvbuf=size SO_RCVBUF设置侦听套接字 (1.11.13) 的 接收缓冲区大小(选项)。-
sndbuf=size SO_SNDBUF设置侦听套接字 (1.11.13) 的 发送缓冲区大小(选项)。-
bind -
此参数指示对
bind()给定的地址:端口对进行单独的调用。事实是,如果有多个listen指令具有相同的端口但不同的地址,并且其中一个listen指令侦听给定端口 (*:port) 的所有地址,则 nginx 将bind()仅侦听*:port. 应该注意的是,getsockname()在这种情况下将进行系统调用来确定接受连接的地址。如果使用backlog、rcvbuf、sndbuf、ipv6only、reuseport或参数,则对于给定的:对,将始终进行 单独的调用。so_keepaliveaddressportbind() -
ipv6only=on|off -
此参数确定(通过
IPV6_V6ONLY套接字选项)侦听通配符地址的 IPv6 套接字是否[::]仅接受 IPv6 连接或同时接受 IPv6 和 IPv4 连接。该参数默认开启。它只能在启动时设置一次。 -
reuseport SO_REUSEPORT此参数 (1.9.1) 指示为每个工作进程创建一个单独的侦听套接字(在 Linux 3.9+ 和 DragonFly BSD 或FreeBSD 12+ 上 使用 套接字选项SO_REUSEPORT_LB),允许内核在工作进程之间分配传入连接。目前仅适用于 Linux 3.9+、DragonFly BSD 和 FreeBSD 12+ (1.15.1)。不恰当地使用此选项可能会产生安全 隐患。
-
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] -
此参数配置侦听套接字的“TCP keepalive”行为。如果省略此参数,则操作系统的设置将对套接字生效。如果设置为值“
on”,SO_KEEPALIVE则为套接字打开该选项。如果它设置为值“off”,则SO_KEEPALIVE套接字的该选项将关闭。TCP_KEEPIDLE某些操作系统支持使用、TCP_KEEPINTVL和套接字选项按每个套接字设置 TCP keepalive 参数TCP_KEEPCNT。在此类系统(当前为 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE)上,可以使用keepidle、keepintvl和keepcnt参数来配置它们。可以省略一两个参数,在这种情况下,相应套接字选项的系统默认设置将生效。例如,
会将空闲超时 (so_keepalive=30m::10
TCP_KEEPIDLE) 设置为 30 分钟,将探测间隔 (TCP_KEEPINTVL) 保留为系统默认值,并将探测计数 (TCP_KEEPCNT) 设置为 10 个探测。
不同的服务器必须侦听不同的
address:port对。
| 句法: |
preread_buffer_size |
|---|---|
| 默认: |
preread_buffer_size 16k; |
| 语境: |
stream,server |
该指令出现在版本 1.11.5 中。
指定预读size缓冲区的
a 。
| 句法: |
preread_timeout |
|---|---|
| 默认: |
preread_timeout 30s; |
| 语境: |
stream,server |
该指令出现在版本 1.11.5 中。
指定预读timeout阶段的
a 。
| 句法: |
proxy_protocol_timeout |
|---|---|
| 默认: |
proxy_protocol_timeout 30s; |
| 语境: |
stream,server |
该指令出现在版本 1.11.4 中。
指定一个timeout用于读取PROXY协议头来完成。如果在此时间内没有传输整个标头,则连接将关闭。
| 句法: |
resolver
|
|---|---|
| 默认: | — |
| 语境: |
stream,server |
该指令出现在版本 1.11.3 中。
配置用于将上游服务器的名称解析为地址的名称服务器,例如:
resolver 127.0.0.1 [::1]:5353;
地址可以指定为域名或 IP 地址,并带有可选端口。如果未指定端口,则使用端口 53。名称服务器以循环方式查询。
默认情况下,nginx 在解析时会查找 IPv4 和 IPv6 地址。如果不需要查找 IPv4 或 IPv6 地址,则可以指定
ipv4=off(1.23.1) 或参数。ipv6=off
默认情况下,nginx 使用响应的 TTL 值缓存答案。可选valid参数允许覆盖它:
resolver 127.0.0.1 [::1]:5353 valid=30s;
为了防止 DNS 欺骗,建议在适当保护的受信任本地网络中配置 DNS 服务器。
可选status_zone参数 (1.17.1) 允许
收集
指定 中请求和响应的 DNS 服务器统计信息zone。该参数作为我们商业订阅的一部分提供
。
在 1.11.3 版本之前,该指令作为我们商业订阅的 一部分提供 。
| 句法: |
resolver_timeout |
|---|---|
| 默认: |
resolver_timeout 30s; |
| 语境: |
stream,server |
该指令出现在版本 1.11.3 中。
设置名称解析的超时时间,例如:
resolver_timeout 5s;
在 1.11.3 版本之前,该指令作为我们商业订阅的 一部分提供 。
| 句法: |
server { ... } |
|---|---|
| 默认: | — |
| 语境: |
stream |
设置服务器的配置。
| 句法: |
stream { ... } |
|---|---|
| 默认: | — |
| 语境: |
main |
提供在其中指定流服务器指令的配置文件上下文。
| 句法: |
tcp_nodelay |
|---|---|
| 默认: |
tcp_nodelay on; |
| 语境: |
stream,server |
该指令出现在 1.9.4 版本中。
启用或禁用该选项的使用TCP_NODELAY。该选项对于客户端和代理服务器连接均启用。
| 句法: |
variables_hash_bucket_size |
|---|---|
| 默认: |
variables_hash_bucket_size 64; |
| 语境: |
stream |
该指令出现在版本 1.11.2 中。
设置变量哈希表的存储桶大小。设置哈希表的详细信息在单独的 文档中提供。
| 句法: |
variables_hash_max_size |
|---|---|
| 默认: |
variables_hash_max_size 1024; |
| 语境: |
stream |
该指令出现在版本 1.11.2 中。
size设置变量哈希表的
最大值。设置哈希表的详细信息在单独的
文档中提供。
嵌入变量
该ngx_stream_core_module模块从 1.11.2 开始支持变量。
$binary_remote_addr- 二进制形式的客户端地址,对于 IPv4 地址,值的长度始终为 4 字节;对于 IPv6 地址,值的长度始终为 16 字节
$bytes_received- 从客户端接收的字节数 (1.11.4)
$bytes_sent- 发送到客户端的字节数
$connection- 连接序列号
$hostname- 主机名
$msec- 当前时间(以秒为单位,精度为毫秒)
$nginx_version- nginx版本
$pid- 工作进程的PID
$protocol-
用于与客户端通信的协议:
TCP或UDP(1.11.4) $proxy_protocol_addr-
来自 PROXY 协议标头的客户端地址 (1.11.4)
PROXY 协议必须预先通过设置 listen
proxy_protocol指令中的参数来启用。 $proxy_protocol_port-
来自 PROXY 协议标头的客户端端口 (1.11.4)
PROXY 协议必须预先通过设置 listen
proxy_protocol指令中的参数来启用。 $proxy_protocol_server_addr-
PROXY 协议标头中的服务器地址 (1.17.6)
PROXY 协议必须预先通过设置 listen
proxy_protocol指令中的参数来启用。 $proxy_protocol_server_port-
PROXY 协议标头中的服务器端口 (1.17.6)
PROXY 协议必须预先通过设置 listen
proxy_protocol指令中的参数来启用。 $proxy_protocol_tlv_name-
来自 PROXY 协议标头 (1.23.2) 的 TLV。可以
name是 TLV 类型名称或其数值。在后一种情况下,该值是十六进制的,并且应带有前缀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) - 客户端传递的主机名值 -
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 证书验证结果,如果客户端提供了证书并且验证成功,则为零,否则为非零
PROXY 协议必须预先通过设置 listen
proxy_protocol指令中的参数来启用。 -
$remote_addr- 客户地址
$remote_port- 客户端端口
$server_addr-
接受连接的服务器的地址
计算该变量的值通常需要一个系统调用。为了避免系统调用,listen指令必须指定地址并使用
bind参数。 $server_port- 接受连接的服务器端口
$session_time- 会话持续时间(以秒为单位,精度为毫秒)(1.11.4);
$status-
会话状态(1.11.4)可以是以下之一:
200- 会话成功完成
400- 无法解析客户端数据,例如PROXY协议头
403- 禁止访问,例如,当 某些客户端地址的访问受到限制时
500- 内部服务器错误
502- 错误的网关,例如,如果无法选择或访问上游服务器。
503- 服务不可用,例如当访问受到 连接数限制时
$time_iso8601- ISO 8601 标准格式的当地时间
$time_local- 通用日志格式中的本地时间
