隧道#
Added in version 1.12.0.
隧道模块(ngx_http_tunnel_module)处理 HTTP/1.1
CONNECT
请求,并在客户端与后端服务器之间建立端到端的虚拟连接,使 Angie 能够充当转发代理。
对隧道的访问由标准的访问控制指令进行控制:
auth_basic、satisfy 和 auth_delay。 使到后端服务器的出站连接从指定的本地 IP 地址(可选端口)发起。参数值可以包含变量。特殊值
为了使此参数生效,通常需要以 超级用户 权限运行 Angie 工作进程。在 Linux 上则不需要
这样做,因为如果指定了 设置用于从后端服务器读取数据的缓冲区的 size。它同时也设置用于从客户端读取数据的缓冲区的 size。 定义与后端服务器建立连接的超时时间。需要注意的是,此超时通常不能超过 75 秒。 默认值 http, server, location 指定在哪些情况下应将请求传递到下一个服务器: 与服务器建立连接或从其读取数据时发生错误; 与服务器建立连接、向其传递请求或从其读取数据时发生超时; 禁用将请求传递到下一个服务器。 只有在尚未向客户端发送任何内容时,才能将请求传递到下一个服务器。如果在传输响应的过程中发生错误或超时,则无法对其进行修复。 该指令还定义了何种情况被视为与服务器通信的
失败尝试。其中, 限制可以将请求传递到 下一个服务器 的时间。值 限制将请求传递到 下一个服务器 的可能尝试次数。值 启用对 CONNECT 请求的处理,并设置后端服务器的地址。默认情况下,address 为
地址可以指定为域名或 IP 地址,以及端口: 或指定为 UNIX 域套接字路径: 如果一个域名解析到多个地址,则将以 轮询 方式使用所有这些地址。此外,地址还可以
指定为 服务器组。 参数值可以包含变量。在这种情况下,如果地址被指定为域名,则会在所描述的
服务器组 中搜索该名称,如果未找到,则使用 resolver 进行确定。 设置客户端或后端服务器连接上两次连续读或写操作之间的超时时间。如果在此时间内没有传输任何数据,则连接将被关闭。 如果该指令设置为非零值,Angie 将尝试尽量减少到后端服务器的出站连接上的发送操作次数,方法是使用
此指令在 Linux、Solaris 和 Windows 上会被忽略。 设置向后端服务器传输数据的超时时间。该超时仅设置在两次连续写操作之间,而非整个传输过程。如果后端服务器在此时间内未收到任何数据,则连接将被关闭。 为到后端服务器的出站连接配置 "TCP keepalive" 行为。默认情况下,套接字采用操作系统的设置。如果该指令
设置为 配置示例#
http {
map $host $allow_host {
hostnames;
example.org 1;
*.example.org 1;
}
server {
listen 8000;
resolver 127.0.0.53;
if ($allow_host != 1) {
return 502;
}
tunnel_pass;
}
}
指令#
tunnel_bind#
off 会取消从上一级配置继承的 tunnel_bind 指令的效果,从而允许系统自动分配本地
IP 地址和端口。transparent 参数允许到后端服务器的出站连接从非本地 IP 地址发起,例如从客户端的真实 IP
地址:tunnel_bind $remote_addr transparent;
transparent 参数,工作进程会从主进程继承 CAP_NET_RAW
能力。tunnel_buffer_size#
tunnel_connect_timeout#
tunnel_next_upstream#
tunnel_next_upstream error | timeout | off ...;tunnel_next_upstream error timeout;errortimeoutofferror 和 timeout 的情况始终被视为失败尝试,即使它们未在指令中指定。tunnel_next_upstream_timeout#
0 将关闭此
限制。tunnel_next_upstream_tries#
0 将关闭
此限制。tunnel_pass#
$host:$request_port,取自客户端请求。在大多数情况下,tunnel_pass 不需要配置任何
参数。tunnel_pass localhost:9000;
tunnel_pass unix:/tmp/backend.socket;
tunnel_read_timeout#
tunnel_send_lowat#
kqueue 方法的 NOTE_LOWAT 标志,或使用带有指定 size 的 SO_SNDLOWAT
套接字选项。tunnel_send_timeout#
tunnel_socket_keepalive#
on 值,则会为套接字启用 SO_KEEPALIVE 套接字选项。