模块 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
嵌入变量

ngx_stream_core_module模块 自版本 1.9.0 起可用。 这个模块不是默认构建的,它应该使用--with-streamconfiguration 参数。

示例配置

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

设置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;

default_server参数(如果存在)、 将导致服务器成为指定address:port对 (1.25.5)。 如果所有Directives都没有default_server参数,则第一个具有address:portpair 将为 此对的默认服务器。

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

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

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

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

listen命令 可以具有几个特定于 socket 相关系统调用的附加参数。 这些参数可以在任何listenDirectives,但对于给定的address:port双。

setfib=number
此参数 (1.25.5) 设置关联的路由表 FIB (SO_SETFIB选项)用于侦听套接字。 这目前只适用于 FreeBSD。
fastopen=number
使 TCP 快速打开 对于侦听套接字 (1.21.0),并限制尚未完成的连接队列的最大长度 三次握手。
除非服务器可以处理,否则不要启用此功能 多次接收包含数据的相同 SYN 数据包
backlog=number
backlog参数中的listen()称之为 limit 待处理连接队列的最大长度 (1.9.2)。 默认情况下,backlog在 FreeBSD、DragonFly BSD 和 macOS 上设置为 -1,则 以及其他平台上的 511。
rcvbuf=size
设置接收缓冲区大小 (SO_RCVBUF选项)用于侦听套接字 (1.11.13)。
sndbuf=size
设置发送缓冲区大小 (SO_SNDBUF选项)用于侦听套接字 (1.11.13)。
accept_filter=filter
设置 Accept 过滤器的名称 (SO_ACCEPTFILTER选项) 在将传入连接传递给accept()(1.25.5). 这仅适用于 FreeBSD 和 NetBSD 5.0+。 可能的值为 datareadyhttpready
deferred
指示使用 deferredaccept()TCP_DEFER_ACCEPTsocket 选项)。
bind
此参数指示将bind()调用给定的 address:port 对。 事实是,如果有几个listenDirectives替换为 相同的端口但不同的地址,以及listendirectives 监听所有地址 对于给定端口 (*:port),nginx 将bind()仅对*:port. 应该注意的是,getsockname()system 调用将为 用于确定接受连接的地址。 如果setfib,fastopen,backlog,rcvbuf,sndbuf,accept_filter,deferred,ipv6only,reuseport, 或so_keepalive参数 则用于给定的address:port双 一个单独的bind()将始终进行调用。
ipv6only=on|off
此参数确定 (通过IPV6_V6ONLYsocket 选项) IPv6 套接字是否侦听通配符地址[::]将仅接受 IPv6 连接或同时接受 IPv6 和 IPv4 连接。 默认情况下,此参数处于打开状态。 它只能在启动时设置一次。
reuseport
此参数 (1.9.1) 指示创建单独的侦听套接字 对于每个工作进程 (使用SO_REUSEPORTLinux 3.9+ 和 DragonFly BSD 上的 socket 选项, 或SO_REUSEPORT_LB在 FreeBSD 12+ 上),允许内核 在 worker 进程之间分配传入连接。 这目前仅适用于 Linux 3.9+、DragonFly BSD、 和 FreeBSD 12+ (1.15.1)。
不恰当地使用此选项可能会产生其安全隐患
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
此参数配置 “TCP keepalive” 行为 用于侦听套接字。 如果省略此参数,则作系统的设置将为 对 socket 有效。 如果将其设置为值”on“、SO_KEEPALIVE选项。 如果将其设置为值”off“、SO_KEEPALIVE选项已关闭。 某些作系统支持在 每个插槽的基础,使用TCP_KEEPIDLE,TCP_KEEPINTVLTCP_KEEPCNTsocket 选项。 在此类系统上(目前为 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE),它们可以被配置 使用keepidle,keepintvlkeepcnt参数。 可以省略一个或两个参数,在这种情况下,系统默认设置 的相应 socket 选项将生效。 例如
so_keepalive=30m::10
将设置空闲超时 (TCP_KEEPIDLE) 设置为 30 分钟, 将探测间隔 (TCP_KEEPINTVL) 在其系统默认值下, 并设置 Probes 计数 (TCP_KEEPCNT) 设置为 10 个探针。

在 1.25.5 版本之前,不同的服务器必须监听不同的address:port对。

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

该Directives出现在版本 1.11.5 中。

指定size预读缓冲区。

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

该Directives出现在版本 1.11.5 中。

指定timeout预读阶段。

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

该Directives出现在版本 1.11.4 中。

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

语法: 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 地址, 这ipv4=off(1.23.1) 或 这ipv6=offparameter 的

默认情况下,nginx 使用响应的 TTL 值缓存答案。 可选的validparameter 允许覆盖它:

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

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

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

在版本 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 中。

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

语法: 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的变量哈希表。 设置哈希表的详细信息在单独的文档中提供。

嵌入变量

ngx_stream_core_modulemodule 支持变量 从 1.11.2 开始。

$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
用于与 Client 端通信的协议:TCPUDP(1.11.4)
$proxy_protocol_addr
来自 PROXY 协议标头的客户端地址 (1.11.4)

必须事先通过将proxy_protocol参数 在 listen Directives中。

$proxy_protocol_port
来自 PROXY 协议标头的 client 端口 (1.11.4)

必须事先通过将proxy_protocol参数 在 listen Directives中。

$proxy_protocol_server_addr
来自 PROXY 协议标头的服务器地址 (1.17.6)

必须事先通过将proxy_protocol参数 在 listen Directives中。

$proxy_protocol_server_port
来自 PROXY 协议标头的服务器端口 (1.17.6)

必须事先通过将proxy_protocol参数 在 listen Directives中。

$proxy_protocol_tlv_name
来自 PROXY 协议标头 (1.23.2) 的 TLV。 这name可以是 TLV 类型名称或其数值。 在后一种情况下,该值为十六进制 ,并且应以0x:
$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 并且它已成功验证,否则为非零

必须事先通过将proxy_protocol参数 在 listen Directives中。

$remote_addr
客户端地址
$remote_port
客户端端口
$server_addr
接受连接的服务器的地址

计算此变量的值通常需要一次系统调用。 为避免系统调用,listen Directives 必须指定地址并使用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
通用日志格式的当地时间