隧道#

Added in version 1.12.0.

隧道模块(ngx_http_tunnel_module)处理 HTTP/1.1 CONNECT 请求,并在客户端与后端服务器之间建立端到端的虚拟连接,使 Angie 能够充当转发代理。

对隧道的访问由标准的访问控制指令进行控制: auth_basicsatisfyauth_delay

配置示例#

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#

语法

tunnel_bind address [transparent] | off;

默认值

上下文

http, server, location

使到后端服务器的出站连接从指定的本地 IP 地址(可选端口)发起。参数值可以包含变量。特殊值 off 会取消从上一级配置继承的 tunnel_bind 指令的效果,从而允许系统自动分配本地 IP 地址和端口。

transparent 参数允许到后端服务器的出站连接从非本地 IP 地址发起,例如从客户端的真实 IP 地址:

tunnel_bind $remote_addr transparent;

为了使此参数生效,通常需要以 超级用户 权限运行 Angie 工作进程。在 Linux 上则不需要 这样做,因为如果指定了 transparent 参数,工作进程会从主进程继承 CAP_NET_RAW 能力。

tunnel_buffer_size#

语法

tunnel_buffer_size size;

默认值

tunnel_buffer_size 4k|8k;

上下文

http, server, location

设置用于从后端服务器读取数据的缓冲区的 size。它同时也设置用于从客户端读取数据的缓冲区的 size

tunnel_connect_timeout#

语法

tunnel_connect_timeout time;

默认值

tunnel_connect_timeout 60s;

上下文

http, server, location

定义与后端服务器建立连接的超时时间。需要注意的是,此超时通常不能超过 75 秒。

tunnel_next_upstream#

语法

tunnel_next_upstream error | timeout | off ...;

默认值

tunnel_next_upstream error timeout;

上下文

http, server, location

指定在哪些情况下应将请求传递到下一个服务器:

error

与服务器建立连接或从其读取数据时发生错误;

timeout

与服务器建立连接、向其传递请求或从其读取数据时发生超时;

off

禁用将请求传递到下一个服务器。

只有在尚未向客户端发送任何内容时,才能将请求传递到下一个服务器。如果在传输响应的过程中发生错误或超时,则无法对其进行修复。

该指令还定义了何种情况被视为与服务器通信的 失败尝试。其中,errortimeout 的情况始终被视为失败尝试,即使它们未在指令中指定。

将请求传递到下一个服务器的操作可以通过 尝试次数时间 加以限制。

tunnel_next_upstream_timeout#

语法

tunnel_next_upstream_timeout time;

默认值

tunnel_next_upstream_timeout 0;

上下文

http, server, location

限制可以将请求传递到 下一个服务器 的时间。值 0 将关闭此 限制。

tunnel_next_upstream_tries#

语法

tunnel_next_upstream_tries number;

默认值

tunnel_next_upstream_tries 0;

上下文

http, server, location

限制将请求传递到 下一个服务器 的可能尝试次数。值 0 将关闭 此限制。

tunnel_pass#

语法

tunnel_pass [address];

默认值

上下文

server, location, if in location

启用对 CONNECT 请求的处理,并设置后端服务器的地址。默认情况下,address$host:$request_port,取自客户端请求。在大多数情况下,tunnel_pass 不需要配置任何 参数。

地址可以指定为域名或 IP 地址,以及端口:

tunnel_pass localhost:9000;

或指定为 UNIX 域套接字路径:

tunnel_pass unix:/tmp/backend.socket;

如果一个域名解析到多个地址,则将以 轮询 方式使用所有这些地址。此外,地址还可以 指定为 服务器组

参数值可以包含变量。在这种情况下,如果地址被指定为域名,则会在所描述的 服务器组 中搜索该名称,如果未找到,则使用 resolver 进行确定。

tunnel_read_timeout#

语法

tunnel_read_timeout time;

默认值

tunnel_read_timeout 60s;

上下文

http, server, location

设置客户端或后端服务器连接上两次连续读或写操作之间的超时时间。如果在此时间内没有传输任何数据,则连接将被关闭。

tunnel_send_lowat#

语法

tunnel_send_lowat size;

默认值

tunnel_send_lowat 0;

上下文

http, server, location

如果该指令设置为非零值,Angie 将尝试尽量减少到后端服务器的出站连接上的发送操作次数,方法是使用 kqueue 方法的 NOTE_LOWAT 标志,或使用带有指定 sizeSO_SNDLOWAT 套接字选项。

此指令在 Linux、Solaris 和 Windows 上会被忽略。

tunnel_send_timeout#

语法

tunnel_send_timeout time;

默认值

tunnel_send_timeout 60s;

上下文

http, server, location

设置向后端服务器传输数据的超时时间。该超时仅设置在两次连续写操作之间,而非整个传输过程。如果后端服务器在此时间内未收到任何数据,则连接将被关闭。

tunnel_socket_keepalive#

语法

tunnel_socket_keepalive on | off;

默认值

tunnel_socket_keepalive off;

上下文

http, server, location

为到后端服务器的出站连接配置 "TCP keepalive" 行为。默认情况下,套接字采用操作系统的设置。如果该指令 设置为 on 值,则会为套接字启用 SO_KEEPALIVE 套接字选项。