流模块#
核心流模块实现了处理 TCP 和 UDP 连接的基础功能,包括定义服务器块、流量路由、配置代理、SSL/TLS 支持及管理用于数据库、DNS 和其他基于 TCP 和 UDP 协议的流服务的连接。
本节的其他模块扩展了这些功能,使您可以灵活配置和优化流服务器以适应各种场景和要求。
当 从源代码构建 时,该模块默认不构建;应使用 ‑‑with‑stream
构建选项 启用。在 我们的仓库 提供的包和镜像中,该模块已包含在构建中。
配置示例#
worker_processes auto;
error_log /var/log/angie/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。可以仅指定 port。地址也可以是主机名,例如:
listen 127.0.0.1:12345;
listen *:12345;
listen 12345; # 与 *:12345 相同
listen localhost:12345;
IPv6 地址需要用方括号括起来:
listen [::1]:12345;
listen [::]:12345;
UNIX 域套接字需要用 unix:
前缀指定:
listen unix:/var/run/angie.sock;
端口范围由第一个和最后一个端口用连字符分隔指定:
listen 127.0.0.1:12345-12399;
listen 12345-12399;
重要
不同的服务器必须监听不同的 address:port 对。
|
指定该端口上接受的所有连接都应以 SSL 模式工作。 |
|
为处理数据报配置监听套接字。为了在同一会话中处理来自相同地址和端口的数据包,还应指定 reuseport 参数。 |
|
指定该端口上接受的所有连接应使用 PROXY 协议。 |
listen 指令可以具有特定于与套接字相关的系统调用的多个附加参数。
|
为监听套接字设置关联的路由表,FIB( |
|
为监听套接字启用 "TCP Fast Open" 并 限制 尚未完成三次握手的连接队列的最大长度。 |
小心
不要启用此功能,除非服务器可以处理多次接收 带有数据的相同 SYN 包 的情况。
|
在 |
|
为监听套接字设置接收缓冲区大小( |
|
为监听套接字设置发送缓冲区大小( |
|
为监听套接字设置接受过滤器的名称( |
|
指示在 Linux 上使用延迟的 |
|
该参数指示为给定的 address:port 对进行单独的 |
|
该参数确定(通过 |
|
该参数指示为每个工作进程创建一个单独的监听套接字(在 Linux 3.9+ 和 DragonFly BSD 上使用 |
小心
不当使用此选项可能会产生安全隐患。
so_keepalive=on
| off
| [keepidle]:[keepintvl]:[keepcnt]
配置监听套接字的 "TCP keepalive" 行为。
|
如果省略此参数,则套接字将使用操作系统的默认设置 |
|
为套接字开启 SO_KEEPALIVE 选项 |
|
为套接字关闭 SO_KEEPALIVE 选项 |
一些操作系统支持使用 TCP_KEEPIDLE
、TCP_KEEPINTVL
和 TCP_KEEPCNT
套接字选项在每个套接字基础上设置 TCP keepalive 参数。在这样的系统(目前是 Linux 2.4+、NetBSD 5+ 和 FreeBSD 9.0-STABLE)上,可以使用 keepidle、keepintvl 和 keepcnt 参数进行配置。可以省略一个或两个参数,在这种情况下,将使用相应套接字选项的系统默认设置。
例如,
so_keepalive=30m::10
将空闲超时(TCP_KEEPIDLE)设置为 30 分钟,保留探测间隔(TCP_KEEPINTVL)为系统默认,并将探测次数(TCP_KEEPCNT)设置为 10 次。
preread_buffer_size#
指定 preread 缓冲区的大小。
preread_timeout#
指定 preread 阶段的超时时间。
proxy_protocol_timeout#
指定读取 PROXY 协议头的 timeout 时间。如果在此时间内未传输完整的头,则连接将被关闭。
resolver#
|
|
默认值 |
— |
stream, server, upstream |
配置用于将上游服务器的名称解析为地址的名称服务器,例如:
resolver 127.0.0.53 [::1]:5353;
地址可以指定为域名或 IP 地址,并且可以选择指定端口。如果未指定端口,则使用端口 53。名称服务器按轮询方式查询。
默认情况下,Angie 使用响应的 TTL 值缓存答案。可选的 valid 参数允许重写它:
|
可选 的 valid 参数允许重写缓存条目的有效性 |
resolver 127.0.0.53 [::1]:5353 valid=30s;
默认情况下,Angie 在解析时将查找 IPv4 和 IPv6 地址。
|
禁用 IPv4 地址的查找 |
|
禁用 IPv6 地址的查找 |
|
可选 参数; 在指定区域内启用 DNS 服务器请求和响应指标 (/status/resolvers/<zone>) 的收集。 |
小技巧
为防止 DNS 欺骗,建议在适当安全的可信本地网络中配置 DNS 服务器。
resolver_timeout#
设置名称解析的超时时间,例如:
resolver_timeout 5s;
server#
为服务器设置配置。
server_name#
设置虚拟服务器的名称,例如:
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$;
}
正则表达式可以包括可用于其他指令的捕获:
server {
server_name ~^(www\.)?(.+)$;
proxy_pass www.$2:12345;
}
正则表达式中的命名捕获会创建可在其他指令中使用的变量:
server {
server_name ~^(www\.)?(?<domain>.+)$;
proxy_pass www.$domain:12345;
}
如果指令的参数设置为 $hostname
,则插入计算机的主机名。
在按名称搜索虚拟服务器时,如果名称与指定的多个变体(例如,通配符名称和正则表达式匹配)匹配,则将按以下优先级顺序选择第一个匹配的变体:
精确名称
以星号开头的最长通配符名称,例如,
*.example.com
以星号结尾的最长通配符名称,例如
mail.*
第一个匹配的正则表达式(按在配置文件中出现的顺序)
注意
对于 TLS 连接, 请使用 SSL Preread 模块。
server_names_hash_bucket_size#
设置服务器名称哈希表的桶大小。默认值取决于处理器缓存行的大小。
server_names_hash_max_size#
设置服务器名称哈希表的最大大小。
status_zone#
分配共享内存区域以收集 /status/stream/server_zones/<zone> 的指标。
多个 server
上下文可以共享同一区域进行数据收集。
stream#
提供配置文件上下文,在该上下文中指定流服务器指令。
tcp_nodelay#
启用或禁用 TCP_NODELAY 选项。该选项适用于客户端和代理服务器连接。
variables_hash_bucket_size#
设置变量哈希表的桶大小。设置哈希表的详细信息在单独的 文档 中提供。
variables_hash_max_size#
设置变量哈希表的最大大小。设置哈希表的详细信息在单独的 文档 中提供。
内置变量#
stream core 模块支持以下变量:
$angie_version
#
Angie 版本
$binary_remote_addr
#
客户端地址的二进制形式,值的长度对于 IPv4 地址始终为 4 字节,对于 IPv6 地址始终为 16 字节。
$bytes_received
#
从客户端接收的字节数。
$bytes_sent
#
发送给客户端的字节数。
$connection
#
连接序列号。
$hostname
#
主机名。
$msec
#
当前时间,以秒为单位,精确到毫秒。
$pid
#
工作进程的 PID。
$protocol
#
用于与客户端通信的协议:TCP
或 UDP
。
$proxy_protocol_addr
#
来自 PROXY 协议头的客户端地址
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用 PROXY 协议。
$proxy_protocol_port
#
来自 PROXY 协议头的客户端端口
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用 PROXY 协议。
$proxy_protocol_server_addr
#
来自 PROXY 协议头的服务器地址
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用 PROXY 协议。
$proxy_protocol_server_port
#
来自 PROXY 协议头的服务器端口
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用 PROXY 协议。
$proxy_protocol_tlv_<name>
#
来自 PROXY 协议头的 TLV。name 可以是 TLV 类型或其数值。在后者情况下,值为十六进制且应以 0x 为前缀:
$proxy_protocol_tlv_alpn
$proxy_protocol_tlv_0x01
SSL TLVs 也可以通过 TLV 类型名称或其数值访问,两者都以前缀 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 证书验证结果,如果客户端出示了证书并成功验证则为 0,否则为非零。
必须通过在 listen 指令中设置 proxy_protocol 参数来预先启用 PROXY 协议。
$remote_addr
#
客户端地址。
$remote_port
#
客户端端口。
$server_addr
#
接受连接的服务器的地址
计算此变量的值通常需要一个系统调用。为了避免系统调用,listen 指令必须指定地址并使用 bind
参数。
$server_port
#
接受连接的服务器的端口。
$session_time
#
会话持续时间,以秒为单位,精确到毫秒。
$status
#
会话状态,可以是以下之一:
$time_iso8601
#
ISO 8601 标准格式的本地时间。
$time_local
#
常用日志格式的本地时间。