模块 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 address:port [default_server] [ssl] [udp] [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]];
默认值:
上下文: server

设置 socket 的 和 服务器将接受连接。 可以只指定端口。 地址也可以是主机名,例如:addressport

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_serveraddressportdefault_serveraddressport

该参数允许指定所有 此端口接受的连接应在 SSL 模式下工作。ssl

该参数配置一个监听套接字 用于处理数据报 (1.9.13)。 为了处理来自同一会话中相同地址和端口的数据包, reuseport 参数 还应指定。udp

参数 (1.11.4) 允许指定此端口上接受的所有连接都应使用 PROXY 协议proxy_protocol

从版本 1.13.11 开始支持 PROXY 协议版本 2。

Directives 可以具有几个特定于 socket 相关系统调用的附加参数。 这些参数可以在任何Directives中指定,但只能为给定的 : 对指定一次。listenlistenaddressport

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。backloglisten()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+。 可能的值为 datareadyhttpreadySO_ACCEPTFILTERaccept()
deferred
指示在 Linux (1.25.5) 上使用 deferred(套接字选项)。accept()TCP_DEFER_ACCEPT
bind
此参数指示对给定的 address:port 对进行单独调用。 事实是,如果有多个带有 相同的端口但不同的地址,并且其中一个Directives侦听所有地址 对于给定的端口 (),nginx 将仅对 . 应该注意的是,系统调用将是 用于确定接受连接的地址。 如果 、 、 、 或 parameters 则用于给定的 : 对 将始终进行单独的调用。bind()listenlisten*:portbind()*:portgetsockname()setfibfastopenbacklogrcvbufsndbufaccept_filterdeferredipv6onlyreuseportso_keepaliveaddressportbind()
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_REUSEPORTSO_REUSEPORT_LB
不恰当地使用此选项可能会产生其安全隐患
so_keepalive=on||[]:[]:[offkeepidlekeepintvlkeepcnt]
此参数配置 “TCP keepalive” 行为 用于侦听套接字。 如果省略此参数,则作系统的设置将为 对 socket 有效。 如果它设置为值 “”,则为套接字打开该选项。 如果它设置为值 “”,则关闭套接字的选项。 某些作系统支持在 使用 、 和 socket 选项的 per-socket 基础。 在此类系统上(目前为 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE),它们可以被配置 使用 、 和 参数。 可以省略一个或两个参数,在这种情况下,系统默认设置 的相应 socket 选项将生效。 例如onSO_KEEPALIVEoffSO_KEEPALIVETCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNTkeepidlekeepintvlkeepcnt
so_keepalive=30m::10
将空闲超时 () 设置为 30 分钟, 将探测间隔 () 保留为其系统默认值, 并将 Probes count () 设置为 10 个探针。TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT

在 1.25.5 版本之前,不同的服务器必须侦听不同的 : 对。addressport

语法: preread_buffer_size size;
默认值:
preread_buffer_size 16k;
上下文: stream,server

该Directives出现在版本 1.11.5 中。

指定预读缓冲区的 a。size

语法: preread_timeout timeout;
默认值:
preread_timeout 30s;
上下文: stream,server

该Directives出现在版本 1.11.5 中。

指定预读阶段的 a。timeout

语法: proxy_protocol_timeout timeout;
默认值:
proxy_protocol_timeout 30s;
上下文: stream,server

该Directives出现在版本 1.11.4 中。

指定 for 读取 PROXY 协议标头以完成。 如果在此时间内没有传输整个标头, 连接已关闭。timeout

语法: resolver address ... [valid=time] [ipv4=on|off] [ipv6=on|off] [status_zone=zone];
默认值:
上下文: 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=offipv6=off

默认情况下,nginx 使用响应的 TTL 值缓存答案。 optional 参数允许覆盖它:valid

resolver 127.0.0.1 [::1]:5353 valid=30s;

为了防止 DNS 欺骗,建议 在适当保护的可信本地网络中配置 DNS 服务器。

可选参数 (1.17.1) 启用请求和响应的 DNS 服务器统计信息的收集 在指定的 . 该参数作为我们商业订阅的一部分提供。status_zonezone

在版本 1.11.3 之前,该Directives作为我们商业订阅的一部分提供。

语法: resolver_timeout time;
默认值:
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 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 将按以下优先级顺序选择:

  1. 确切名称
  2. 以星号开头的最长通配符名称, 例如 “”*.example.com
  3. 以星号结尾的最长通配符名称, 例如 “”mail.*
  4. 第一个匹配的正则表达式 (按在配置文件中出现的顺序)

语法: server_names_hash_bucket_size size;
默认值:
server_names_hash_bucket_size 32|64|128;
上下文: stream

该Directives出现在版本 1.25.5 中。

设置服务器名称哈希表的存储桶大小。 默认值取决于处理器的 cache 行的大小。 设置哈希表的详细信息在单独的文档中提供。

语法: server_names_hash_max_size size;
默认值:
server_names_hash_max_size 512;
上下文: stream

该Directives出现在版本 1.25.5 中。

设置服务器名称哈希表的最大值。 设置哈希表的详细信息在单独的文档中提供。size

语法: stream { ... }
默认值:
上下文: main

提供配置文件上下文,其中流服务器Directives 被指定。

语法: tcp_nodelay on | off;
默认值:
tcp_nodelay on;
上下文: stream,server

该Directives出现在版本 1.9.4 中。

启用或禁用该选项。 该选项对 Client 端和 Proxied 服务器连接都启用。TCP_NODELAY

语法: variables_hash_bucket_size size;
默认值:
variables_hash_bucket_size 64;
上下文: stream

该Directives出现在版本 1.11.2 中。

设置变量哈希表的存储桶大小。 设置哈希表的详细信息在单独的文档中提供。

语法: variables_hash_max_size 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)TCPUDP
$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 类型名称或其数值。 在后一种情况下,该值为十六进制 ,并且应该以 :name0x
$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01
SSL TLV 也可以通过 TLV 类型名称或其数值进行访问。 两者都以 : 为前缀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) 可以是以下值之一:
200
会话已成功完成
400
无法解析客户端数据,例如 PROXY 协议标头
403
禁止访问,例如,当某些客户端地址的访问受到限制时
500
internal服务器错误
502
Bad Gateway 的 Bad Gateway,例如 如果无法选择或访问上游服务器。
503
服务不可用,例如,当访问受到连接数的限制时
$time_iso8601
ISO 8601 标准格式的当地时间
$time_local
通用日志格式的当地时间