代理#

允许将请求传递到另一台(代理)服务器。

配置示例#

location / {
    proxy_pass       http://localhost:8000;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
}

指令#

proxy_bind#

语法

proxy_bind address [transparent] | off;

默认值

上下文

http, server, location

使发往代理服务器的出站连接从指定的本地 IP 地址和可选端口发起。参数值可以包含变量。特殊值 off 取消从先前配置级别继承的 proxy_bind 指令的效果,这允许系统自动分配本地 IP 地址和端口。

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

proxy_bind $remote_addr transparent;

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

重要

必须配置内核路由表以拦截来自代理服务器的网络流量。

proxy_buffer_size#

语法

proxy_buffer_size size;

默认值

proxy_buffer_size 4k|8k;

上下文

http, server, location

设置用于读取从代理服务器接收到的响应的第一部分的缓冲区大小。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页。这是 4K 或 8K,取决于平台。不过,它可以被设置得更小。

proxy_buffering#

语法

proxy_buffering on | off;

默认值

proxy_buffering on;

上下文

http, server, location

启用或禁用对代理服务器响应的缓冲。

on

Angie 尽快从代理服务器接收响应,并将其保存到由 proxy_buffer_sizeproxy_buffers 指令设置的缓冲区中。如果整个响应不适合内存的一部分,可以将其保存到磁盘上的 临时文件。写入临时文件由 proxy_max_temp_file_sizeproxy_temp_file_write_size 指令控制。

off

响应以同步方式传递给客户端,立即在收到时传递。Angie 不会尝试从代理服务器读取整个响应。Angie 从服务器一次可以接收的数据的最大大小由 proxy_buffer_size 指令设置。

可以通过在 "X-Accel-Buffering" 响应头字段中传递 "yes" 或 "no" 来启用或禁用缓冲。此功能可以使用 proxy_ignore_headers 指令禁用。

proxy_buffers#

语法

proxy_buffers number size;

默认值

proxy_buffers 8 4k | 8k;

上下文

http, server, location

设置用于读取代理服务器响应的缓冲区的数量和大小,针对单个连接。

默认情况下,缓冲区大小等于一个内存页。这是 4K 或 8K,取决于平台。

proxy_busy_buffers_size#

语法

proxy_busy_buffers_size size;

默认值

proxy_busy_buffers_size 8k | 16k;

上下文

http, server, location

当从代理服务器的响应的 缓冲 被启用时,限制可以用于发送给客户端的响应但尚未完全读取的缓冲区总大小。同时,剩余的缓冲区可用于读取响应,并在需要时将部分响应缓冲到临时文件。

默认情况下,大小由 proxy_buffer_sizeproxy_buffers 指令设置的两个缓冲区的大小限制。

proxy_cache#

语法

proxy_cache zone | off [path=path];

默认值

proxy_cache off;

上下文

http, server, location

定义用于缓存的共享内存区域。 一个区域可以在配置中多次使用。 参数的值允许变量。

off

禁用从先前配置级别继承的缓存。

Added in version 1.2.0: PRO

在 Angie PRO 中,您可以指定多个共享相同 keys_zone 值的 proxy_cache_path 指令以实现缓存分片。如果这样做,请设置引用此 keys_zoneproxy_cache 指令的 path 参数:

path=path

该值在后台的响应被缓存时确定,这意味着涉及变量,包括那些存储来自响应的信息的变量。

如果响应从缓存中获得,path 不会重新评估;因此,从缓存中获取的响应将保留其原始 path,直到从缓存中删除。

这允许通过应用 map 指令或脚本来选择缓存路径,以响应来自后台的响应。一个 Content-Type 示例:

proxy_cache_path /cache/one keys_zone=zone:10m;
proxy_cache_path /cache/two keys_zone=zone;

map $upstream_http_content_type $cache {
   ~^text/  one;
   default  two;
}

server {
   ...
   location / {
       proxy_pass http://backend;
       proxy_cache zone path=/cache/$cache;
   }
}

这添加了两个缓存路径和一个变量映射以选择它们之间。如果 Content-Typetext/ 开头,则使用第一个路径;否则,使用第二个。

proxy_cache_background_update#

语法

proxy_cache_background_update on | off;

默认值

proxy_cache_background_update off;

上下文

http, server, location

允许启动一个后台子请求以更新已过期的缓存项,同时将陈旧的缓存响应返回给客户端。

注意

请注意,当缓存响应正在更新时,必须 允许 使用陈旧的缓存响应。

proxy_cache_bypass#

语法

proxy_cache_bypass ...;

默认值

上下文

http, server, location

定义在何种条件下不会从缓存中获取响应。如果字符串参数的至少一个值不为空且不等于 "0",则不会从缓存中获取响应:

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
proxy_cache_bypass $http_pragma    $http_authorization;

可以与 proxy_no_cache 指令一起使用。

proxy_cache_convert_head#

语法

proxy_cache_convert_head on | off;

默认值

proxy_cache_convert_head on;

上下文

http, server, location

启用或禁用将 "HEAD" 方法转换为 "GET" 以进行缓存。当转换被禁用时,应该配置 缓存键 以包含 $request_method

proxy_cache_key#

语法

proxy_cache_key string;

默认值

proxy_cache_key $scheme$proxy_host$request_uri;

上下文

http, server, location

定义缓存的键,例如

proxy_cache_key "$host$request_uri $cookie_user";

默认情况下,指令的值接近于字符串

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

proxy_cache_lock#

语法

proxy_cache_lock on | off;

默认值

proxy_cache_lock off;

上下文

http, server, location

启用时,只允许一个请求通过请求代理服务器填充由 proxy_cache_key 指令识别的新缓存元素。其他相同缓存元素的请求将等待响应出现在缓存中或此元素的缓存锁被释放,直到由 proxy_cache_lock_timeout 指令设置的时间。

proxy_cache_lock_age#

语法

proxy_cache_lock_age time;

默认值

proxy_cache_lock_age 5s;

上下文

http, server, location

如果最后一个传递到代理服务器以填充新缓存元素的请求未在指定时间内完成,则可以再传递一个请求到代理服务器。

proxy_cache_lock_timeout#

语法

proxy_cache_lock_timeout time;

默认值

proxy_cache_lock_timeout 5s;

上下文

http, server, location

设置 proxy_cache_lock 的超时时间。当时间到期时,请求将被传递到代理服务器,但响应不会被缓存。

proxy_cache_max_range_offset#

语法

proxy_cache_max_range_offset number;

默认值

上下文

http, server, location

设置字节范围请求的偏移量。如果范围超出偏移量,范围请求将被传递到代理服务器,并且响应不会被缓存。

proxy_cache_methods#

语法

proxy_cache_methods GET | HEAD | POST ...;

默认值

proxy_cache_methods GET HEAD;

上下文

http, server, location

如果客户端请求方法在此指令中列出,则响应将被缓存。"GET" 和 "HEAD" 方法总是被添加到列表中,尽管建议显式指定它们。另请参见 proxy_no_cache 指令。

proxy_cache_min_uses#

语法

proxy_cache_min_uses number;

默认值

proxy_cache_min_uses 1;

上下文

http, server, location

设置请求次数,在达到该次数后响应将被缓存。

proxy_cache_path#

语法

proxy_cache_path path [levels=levels] [use_temp_path=on | off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time];

默认值

上下文

http

设置缓存的 path 和其他参数。缓存数据存储在文件中。缓存中的文件名是应用 MD5 函数到 cache key 的结果。

levels

定义缓存的层次结构级别:从 1 到 3,每个级别接受值 1 或 2。

例如,在以下配置中:

proxy_cache_path /data/angie/cache levels=1:2 keys_zone=one:10m;

缓存中的文件名将如下所示:

/data/angie/cache/c/29/b7f54b2df7773722d382f4809d65029c

缓存的响应首先写入临时文件,然后文件被重命名。临时文件和缓存可以放在不同的文件系统上。但是请注意,在这种情况下,文件跨两个文件系统复制,而不是廉价的重命名操作。因此建议对任何给定位置,缓存和保存临时文件的目录都放在同一文件系统上。

use_temp_path=on | off

设置临时文件的目录

on

如果此参数被省略或设置为值 on,则使用 proxy_temp_path 指令为给定 location 设置的目录。

off

临时文件将直接放在缓存目录中。

keys_zone

配置共享内存区的名称和大小,以存储所有活动键和数据信息。

一兆字节的区域可以存储大约 8,000 个键。

inactive

在此参数指定的时间内未被访问的缓存数据将从缓存中移除,无论其新鲜度如何。

默认情况下,设置为 10 分钟。

备注

Added in version 1.2.0: PRO

在 Angie PRO 中,允许多个 proxy_cache_path 指令共享相同的 keys_zone 值。只有第一个这样的指令可以设置共享内存区大小。 对这些指令的选择由相关 proxy_cache 指令的 path 参数决定。

一个特殊的 cache manager 进程监控文件系统上的最大缓存大小和最小可用空间,当大小超出或没有足够的可用空间时,它会删除最近最少使用的数据。这些数据以迭代的方式删除。

max_size

最大缓存大小

min_free

文件系统上缓存的最小可用空间

manager_files

限制一次迭代中要删除的项目数量

默认情况下,100

manager_threshold

限制一次迭代的持续时间

默认情况下,200 毫秒

manager_sleep

配置交互之间的暂停

默认情况下,50 毫秒

Angie 启动一分钟后,特殊的 cache loader 进程被激活。它加载文件系统中存储的先前缓存数据的信息到缓存区。加载同样以迭代的方式进行。

loader_files

限制一次迭代中要加载的项目数量

默认情况下,100

loader_threshold

限制一次迭代的持续时间

默认情况下,200 毫秒

loader_sleep

配置交互之间的暂停

默认情况下,50 毫秒

proxy_cache_revalidate#

语法

proxy_cache_revalidate on | off;

默认

proxy_cache_revalidate off;

上下文

http, server, location

启用使用带有 "If-Modified-Since" 和 "If-None-Match" 头字段的条件请求重新验证过期的缓存项。

proxy_cache_use_stale#

语法

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;

默认

proxy_cache_use_stale off;

上下文

http, server, location

决定在与代理服务器通信的哪些情况下可以使用陈旧的缓存响应。指令的参数与 proxy_next_upstream 指令的参数匹配。

error

如果无法选择处理请求的代理服务器,则允许使用陈旧的缓存响应。

updating

额外参数,允许使用正在更新的陈旧缓存响应。这允许在更新缓存数据时最小化对代理服务器的访问次数。

直接在响应头中也可以为响应过期后指定的秒数启用使用陈旧缓存响应:

  • "Cache-Control" 头字段的 stale-while-revalidate 扩展允许使用正在更新的陈旧缓存响应。

  • "Cache-Control" 头字段的 stale-if-error 扩展允许在出现错误时使用陈旧的缓存响应。

备注

这比使用指令参数的优先级更低。

为最小化在填充新缓存元素时对代理服务器的访问次数,可以使用 proxy_cache_lock 指令。

proxy_cache_valid#

语法

proxy_cache_valid [code ...] time;

默认

上下文

http, server, location

设置不同响应代码的缓存时间。例如,以下指令

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

为代码 200 和 302 的响应设置 10 分钟的缓存时间,为代码 404 的响应设置 1 分钟的缓存时间。

如果只指定缓存时间

proxy_cache_valid 5m;

则仅缓存 200、301 和 302 响应。

此外,可以指定 any 参数以缓存任何响应:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;
proxy_cache_valid any      1m;

备注

缓存的参数也可以直接在响应头中设置。这比使用指令设置缓存时间的优先级更高。

  • "X-Accel-Expires" 头字段以秒为单位设置响应的缓存时间。值为零禁用响应的缓存。如果值以 @ 前缀开头,则设置自 Epoch 以来的绝对时间,以秒为单位,直到响应可能被缓存。

  • 如果头字段不包含 "X-Accel-Expires" 字段,缓存参数可能会在 "Expires" 或 "Cache-Control" 头字段中设置。

  • 如果头字段包含 "Set-Cookie" 字段,则该响应将不会被缓存。

  • 如果头字段包含值为 "*" 的 "Vary" 字段,则该响应将不会被缓存。如果头字段包含其他值的 "Vary" 字段,则此类响应将被缓存,并考虑相应的请求头字段。

可以使用 proxy_ignore_headers 指令禁用对这些响应头字段中的一个或多个的处理。

proxy_connect_timeout#

语法

proxy_connect_timeout time;

默认

proxy_connect_timeout 60s;

上下文

http, server, location

定义与代理服务器建立连接的超时时间。应注意,此超时时间通常不能超过 75 秒。

proxy_connection_drop#

语法

proxy_connection_drop time | on | off;

默认

proxy_connection_drop off;

上下文

http, server, location

启用在代理服务器从组中移除或被 reresolve 进程或 API command DELETE 标记为永久不可用后,终止与其的所有连接。

当为客户端或代理服务器处理下一个读取或写入事件时,连接被终止。

设置 time 启用连接终止 timeout;设置 on 时,连接立即断开。

proxy_force_ranges#

语法

proxy_force_ranges off;

默认

proxy_force_ranges off;

上下文

http, server, location

启用代理服务器响应中缓存和未缓存响应的字节范围支持,而不管这些响应中的“Accept-Ranges”字段。

proxy_headers_hash_bucket_size#

语法

proxy_headers_hash_bucket_size size;

默认

proxy_headers_hash_bucket_size 64;

上下文

http, server, location

设置 proxy_hide_headerproxy_set_header 指令所使用的哈希表的桶大小。有关设置哈希表的详细信息,请参阅 单独说明

proxy_headers_hash_max_size#

语法

proxy_headers_hash_max_size size;

默认

proxy_headers_hash_max_size 512;

上下文

http, server, location

设置 proxy_hide_headerproxy_set_header 指令所使用的哈希表的最大大小。有关设置哈希表的详细信息,请参阅 单独说明

proxy_hide_header#

语法

proxy_hide_header field;

默认

上下文

http, server, location

默认情况下,Angie不会将代理服务器响应中的“Date”、“Server”、“X-Pad”和“X-Accel-...”头字段传递给客户端。proxy_hide_header 指令设置不传递的其他字段。如果需要允许传递字段,可以使用 proxy_pass_header 指令。

proxy_http_version#

语法

proxy_http_version 1.0 | 1.1 | 3;

默认

proxy_http_version 1.0;

上下文

http, server, location, if in location, limit_except

为代理设置HTTP协议版本。 默认情况下,使用版本1.0。 建议使用1.1或更高版本 与 保持活动连接 一起使用。

proxy_http3_hq#

语法

proxy_http3_hq on | off;

默认

proxy_http3_hq off;

上下文

http, server

切换特定的 hq-interop 协商模式, 该模式用于 QUIC 互操作性测试 Angie依赖的。

proxy_http3_max_concurrent_streams#

语法

proxy_http3_max_concurrent_streams number;

默认

proxy_http3_max_concurrent_streams 128;

上下文

http, server

设置 连接 中最大并发HTTP/3请求流的数量。 需要启用 保持活动连接

proxy_http3_stream_buffer_size#

语法

proxy_http3_stream_buffer_size size;

默认

proxy_http3_stream_buffer_size 64k;

上下文

http, server

设置用于 QUIC流 的读写缓冲区的 大小

proxy_ignore_client_abort#

语法

proxy_ignore_client_abort on | off;

默认

proxy_ignore_client_abort off;

上下文

http, server, location

确定当客户端在未等待响应的情况下关闭连接时,是否应关闭与代理服务器的连接。

proxy_ignore_headers#

语法

proxy_ignore_headers field ...;

默认

上下文

http, server, location

禁用来自代理服务器的某些响应头字段的处理。可以忽略以下字段:“X-Accel-Redirect”、“X-Accel-Expires”、“X-Accel-Limit-Rate”、“X-Accel-Buffering”、“X-Accel-Charset”、“Expires”、“Cache-Control”、“Set-Cookie”和“Vary”。

如果没有被禁用,这些头字段的处理将产生以下效果:

  • “X-Accel-Expires”、“Expires”、“Cache-Control”、“Set-Cookie”和“Vary”设置响应的 缓存 参数;

  • “X-Accel-Redirect”执行到指定URI的 内部 重定向;

  • “X-Accel-Limit-Rate”设置将响应传输给客户端的 速率限制

  • “X-Accel-Buffering”启用或禁用响应的 缓冲

  • “X-Accel-Charset”设置响应的所需 字符集

proxy_intercept_errors#

语法

proxy_intercept_errors on | off;

默认

proxy_intercept_errors off;

上下文

http, server, location

确定是否应将代码大于或等于300的代理响应传递给客户端,还是被拦截并重定向到Angie进行使用 error_page 指令的处理。

proxy_limit_rate#

语法

proxy_limit_rate rate;

默认值

proxy_limit_rate 0;

上下文

http, server, location

限制从代理服务器读取响应的速度。rate 以每秒字节数指定,并且可以包含变量。

0

禁用速率限制

备注

限制是针对每个请求设置的,因此如果Angie同时打开两个到代理服务器的连接,总速率将是指定限制的两倍。此限制仅在启用从代理服务器缓冲响应的情况下有效。

proxy_max_temp_file_size#

语法

proxy_max_temp_file_size size;

默认值

proxy_max_temp_file_size 1024m;

上下文

http, server, location

当启用从代理服务器缓冲响应,并且整个响应无法容纳在由 proxy_buffer_sizeproxy_buffers 指令设置的缓冲区中时,响应的一部分可以保存到临时文件中。此指令设置临时文件的最大大小。每次写入临时文件的数据大小由 proxy_temp_file_write_size 指令设置。

0

禁用对临时文件的响应缓冲

备注

此限制不适用于将被缓存或 存储在磁盘上 的响应。

proxy_method#

语法

proxy_method method;

默认值

上下文

http, server, location

指定转发到代理服务器的请求中使用的HTTP方法,而不是客户端请求中的方法。参数值可以包含变量。

proxy_next_upstream#

语法

proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;

默认值

proxy_next_upstream error timeout;

上下文

http, server, location

指定在何种情况下应将请求传递到 上游池 中的下一个服务器:

error

建立与服务器的连接、传递请求或读取响应头时发生错误;

timeout

建立与服务器的连接、传递请求或读取响应头时发生超时;

invalid_header

服务器返回了一个空或无效的响应;

http_500

服务器返回了代码为500的响应;

http_502

服务器返回了代码为502的响应;

http_503

服务器返回了代码为503的响应;

http_504

服务器返回了代码为504的响应;

http_403

服务器返回了代码为403的响应;

http_404

服务器返回了代码为404的响应;

http_429

服务器返回了代码为429的响应;

non_idempotent

通常,具有 非幂等 方法 (POST, LOCK, PATCH) 的请求不会传递到下一个 服务器,如果请求已发送到上游服务器;启用此选项显式允许重试此类请求;

off

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

备注

需要注意的是,只有在尚未向客户端发送任何内容的情况下,才能将请求传递到下一个服务器。也就是说,如果在传输响应的中途发生错误或超时,修复是无法实现的。

该指令还定义了与服务器通信的 不成功尝试 的标准。

error

timeout

invalid_header

始终被视为不成功的尝试,即使它们未在指令中指定

http_500

http_502

http_503

http_504

http_429

仅在指令中指定时被视为不成功的尝试

http_403

http_404

从不被视为不成功的尝试

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

proxy_next_upstream_timeout#

语法

proxy_next_upstream_timeout time;

默认值

proxy_next_upstream_timeout 0;

上下文

http, server, location

限制请求可以传递到 下一个 服务器的时间。

0

关闭此限制

proxy_next_upstream_tries#

语法

proxy_next_upstream_tries number;

默认值

proxy_next_upstream_tries 0;

上下文

http, server, location

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

0

关闭此限制

proxy_no_cache#

语法

proxy_no_cache string ...;

默认值

上下文

http, server, location

定义在何种条件下响应不会被保存到缓存中。如果字符串参数的至少一个值不为空且不等于 "0",则响应不会被保存:

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma    $http_authorization;

可以与 proxy_cache_bypass 指令一起使用。

proxy_pass#

语法

proxy_pass uri;

默认值

上下文

location, if in location

设置代理服务器的协议和地址以及一个可选的URI,以将位置映射到该URI。作为协议,可以指定 httphttps。地址可以指定为域名或IP地址,并且可以选择性地指定端口:

proxy_pass http://localhost:8000/uri/;

或者作为UNIX域套接字路径,在 unix 之后并用冒号括起来指定:

proxy_pass http://unix:/tmp/backend.socket:/uri/;

如果一个域名解析为多个地址,则所有这些地址将以轮询方式使用。此外,地址可以指定为 服务器组。如果使用组,则不能与其一起指定端口;相反,应为组内的每个服务器单独指定端口。

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

请求URI被传递到服务器的方式如下:

  • 如果 proxy_pass 指令是 带URI 指定的,则当请求传递到服务器时,与位置匹配的 标准化的 请求URI的部分将被指令中指定的URI替换:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}
  • 如果 proxy_pass不带URI 指定的,则请求URI以客户端发送的原始形式传递到服务器,或在处理更改后的URI时传递完整的标准化请求URI:

location /some/path/ {
    proxy_pass http://127.0.0.1;
}

在某些情况下,无法确定要替换的请求URI部分:

  • location 使用正则表达式指定时,以及在命名的 locations

在这些情况下,proxy_pass 应该指定为不带URI。

  • 当使用 rewrite 指令在代理的 location 内更改URI,并且将使用相同的配置处理请求时(break):

    location /name/ {
        rewrite    /name/([^/]+) /users?name=$1 break;
        proxy_pass http://127.0.0.1;
    }
    

    在这种情况下,指令中指定的URI将被忽略,完整的更改后的请求URI将传递到服务器。

  • 当在 proxy_pass 中使用变量时:

    location /name/ {
        proxy_pass http://127.0.0.1$request_uri;
    }
    

    在这种情况下,如果在指令中指定了URI,则它将按原样传递到服务器,替换原始请求URI。

    WebSocket 代理需要特殊配置。

proxy_pass_header#

语法

proxy_pass_header field ...;

默认值

上下文

http, server, location

允许从代理服务器传递 否则禁用的 头字段到客户端。

proxy_pass_request_body#

语法

proxy_pass_request_body on | off;

默认值

proxy_pass_request_body on;

上下文

http, server, location

指示是否将原始请求体传递到代理服务器。

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";

    proxy_pass ...;
}

另请参见 proxy_set_headerproxy_pass_request_headers 指令。

proxy_pass_request_headers#

语法

proxy_pass_request_headers on | off;

默认值

proxy_pass_request_headers on;

上下文

http, server, location

指示是否将原始请求的头字段传递给代理服务器。

location /x-accel-redirect-here/ {
    proxy_method GET;
    proxy_pass_request_headers off;
    proxy_pass_request_body off;

    proxy_pass ...;
}

另请参见 proxy_set_headerproxy_pass_request_body 指令。

proxy_quic_active_connection_id_limit#

语法

proxy_quic_active_connection_id_limit number;

默认值

proxy_quic_active_connection_id_limit 2;

上下文

http, server

设置 QUIC active_connection_id_limit 传输参数值。 这是每个服务器可以维护的最大活动 连接ID 数量。

proxy_quic_gso#

语法

proxy_quic_gso on | off;

默认值

proxy_quic_gso off;

上下文

http, server

切换使用 (通用分段卸载) 在 QUIC 优化的批处理模式下发送数据。

proxy_quic_host_key#

语法

proxy_quic_host_key file;

默认值

上下文

http, server

设置一个 file,其中包含用于 QUIC 的密钥,用于加密 无状态重置地址验证 令牌。 默认情况下,每次重启时会生成一个随机密钥。 使用旧密钥生成的令牌将不被接受。

proxy_read_timeout#

语法

proxy_read_timeout time;

默认值

proxy_read_timeout 60s;

上下文

http, server, location

定义从代理服务器读取响应的超时时间。超时仅在两个连续的读取操作之间设置,而不是用于整个响应的传输。如果代理服务器在此时间内未传输任何内容,则连接将关闭。

proxy_redirect#

语法

proxy_redirect default;

proxy_redirect off;

proxy_redirect redirect replacement;

默认值

proxy_redirect default;

上下文

http, server, location

设置应更改代理服务器响应的 "Location" 和 "Refresh" 头字段中的文本。

假设代理服务器返回了头字段:

Location: http://localhost:8000/two/some/uri/

该指令

proxy_redirect http://localhost:8000/two/ http://frontend/one/;

将把此字符串重写为:

Location: http://frontend/one/some/uri/

replacement 字符串中可以省略服务器名称:

proxy_redirect http://localhost:8000/two/ /;

然后主服务器的名称和端口(如果不同于80)将被插入。

default 参数指定的默认替换使用 locationproxy_pass 指令的参数。因此,以下两个配置是等效的:

location /one/ {
    proxy_pass     http://upstream:port/two/;
    proxy_redirect default;
location /one/ {
    proxy_pass     http://upstream:port/two/;
    proxy_redirect http://upstream:port/two/ /one/;

小心

如果 proxy_pass 是使用变量指定的,则不允许使用默认参数。

replacement 字符串可以包含变量:

proxy_redirect http://localhost:8000/ http://$host:$server_port/;

redirect 也可以包含变量:

proxy_redirect http://$proxy_host:8000/ /;

可以使用正则表达式指定该指令。在这种情况下,redirect 应以 "~" 符号开头用于区分大小写匹配,或以 "~*" 符号开头用于不区分大小写匹配。正则表达式可以包含命名和位置捕获,replacement 可以引用它们:

proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
proxy_redirect ~*/user/([^/]+)/(.+)$      http://$1.example.com/$2;

可以在同一层次上指定多个 proxy_redirect 指令:

proxy_redirect default;
proxy_redirect http://localhost:8000/  /;
proxy_redirect http://www.example.com/ /;

如果可以将多个指令应用于代理服务器响应的头字段,则会选择第一个匹配的指令。

off 参数取消继承自前一级配置的 proxy_redirect 指令的效果。

使用此指令,还可以将主机名称添加到代理服务器发出的相对重定向:

proxy_redirect / /;

proxy_request_buffering#

语法

proxy_request_buffering on | off;

默认值

proxy_request_buffering on;

上下文

http, server, location

启用或禁用客户端请求主体的缓冲。

on

整个请求主体在发送给代理服务器之前从客户端 读取

off

请求主体在接收到时立即发送到代理服务器。在这种情况下,如果代理服务器已经开始发送请求主体,则请求无法传递给 下一个服务器

当使用 HTTP/1.1 分块传输编码发送原始请求主体时,无论指令值如何,请求主体都将被缓冲,除非 HTTP/1.1 已为代理启用 QUIC

proxy_send_lowat#

语法

proxy_send_lowat size;

默认值

proxy_send_lowat 0;

上下文

http, server, location

如果该指令设置为非零值,代理将尝试通过使用 kqueue 方法的 NOTE_LOWAT 标志或 SO_SNDLOWAT 套接字选项,以指定的大小来最小化对代理服务器的传出连接的发送操作次数。

备注

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

proxy_send_timeout#

语法

proxy_send_timeout time;

默认值

proxy_send_timeout 60s;

上下文

http, server, location

设置将请求传输到代理服务器的超时时间。超时仅在两个连续的写操作之间设置,而不是用于整个请求的传输。如果代理服务器在此时间内未接收到任何内容,则连接将关闭。

proxy_set_body#

语法

proxy_set_body value;

默认值

上下文

http, server, location

允许重新定义传递给代理服务器的请求主体。值可以包含文本、变量及其组合。

proxy_set_header#

语法

proxy_set_header field value;

默认值

proxy_set_header Host $proxy_host;

上下文

http, server, location

允许重新定义或添加字段到请求头 传递 给代理服务器。value 可以包含文本、变量及其组合。这些指令仅在当前级别未定义 proxy_set_header 指令时从前一个配置级别继承。默认情况下,仅重新定义两个字段:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

如果启用了缓存,原始请求中的头字段 "If-Modified-Since"、"If-Unmodified-Since"、"If-None-Match"、"If-Match"、"Range" 和 "If-Range" 不会传递给代理服务器。

可以像这样传递未更改的 "Host" 请求头字段:

proxy_set_header Host       $http_host;

然而,如果在客户端请求头中不存在此字段,则不会传递任何内容。在这种情况下,最好使用 $host 变量 - 其值等于 "Host" 请求头字段中的服务器名称,或者如果该字段不存在,则为主服务器名称:

proxy_set_header Host       $host;

此外,还可以与代理服务器的端口一起传递服务器名称:

proxy_set_header Host       $host:$proxy_port;

如果头字段的值为空字符串,则不会将该字段传递给代理服务器:

proxy_set_header Accept-Encoding "";

proxy_socket_keepalive#

语法

proxy_socket_keepalive on | off;

默认值

proxy_socket_keepalive off;

上下文

http, server, location

配置用于代理服务器的传出连接的 "TCP keepalive" 行为。

""

默认情况下,操作系统的设置对套接字生效。

on

为套接字打开 SO_KEEPALIVE 套接字选项。

proxy_ssl_certificate#

语法

proxy_ssl_certificate file [file];

默认值

上下文

http, server, location

指定用于对代理的 HTTPS 服务器进行身份验证的 PEM 格式证书文件。文件名中可以使用变量。

Added in version 1.2.0.

proxy_ssl_ntls 启用时,指令接受两个参数而不是一个,分别是证书的签名和加密部分:

location /proxy {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass https://backend:443;
}

proxy_ssl_certificate_key#

语法

proxy_ssl_certificate_key file [file];

默认值

上下文

http, server, location

指定用于对代理的 HTTPS 服务器进行身份验证的 PEM 格式密钥文件。

可以指定 "engine:name:id" 代替文件,从 OpenSSL 引擎名中加载指定 id 的密钥。文件名中可以使用变量。

Added in version 1.2.0.

proxy_ssl_ntls 启用时,指令接受两个参数而不是一个:密钥的签名和加密部分:

location /proxy {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass https://backend:443;
}

proxy_ssl_ciphers#

语法

proxy_ssl_ciphers ciphers;

默认值

proxy_ssl_ciphers DEFAULT;

上下文

http, server, location

指定对代理的 HTTPS 服务器的请求启用的密码。密码以 OpenSSL 库理解的格式指定。

完整列表可以使用 "openssl ciphers" 命令查看。

proxy_ssl_conf_command#

语法

proxy_ssl_conf_command name value;

默认值

上下文

http, server, location

在与代理的 HTTPS 服务器建立连接时设置任意 OpenSSL 配置 命令

重要

使用 OpenSSL 1.0.2 或更高版本时支持该指令。

可以在同一级别指定多个 proxy_ssl_conf_command 指令。只有在当前级别没有定义 proxy_ssl_conf_command 指令时,这些指令才会从上一级配置继承。

小心

请注意,直接配置 OpenSSL 可能导致意外行为。

proxy_ssl_crl#

语法

proxy_ssl_crl file;

默认值

上下文

http, server, location

指定用于 验证 代理的 HTTPS 服务器证书的 PEM 格式撤销证书(CRL)文件。

proxy_ssl_name#

语法

proxy_ssl_name name;

默认值

proxy_ssl_name $proxy_host;

上下文

http, server, location

允许覆盖用于 验证 代理的 HTTPS 服务器证书的服务器名称,并在与代理的 HTTPS 服务器建立连接时通过 SNI 传递。

默认情况下,使用 proxy_pass URL 的主机部分。

proxy_ssl_ntls#

Added in version 1.2.0.

语法

proxy_ssl_ntls on | off;

默认值

proxy_ssl_ntls off;

上下文

http, server

启用使用 TongSuo 库的客户端 NTLS 支持。

location /proxy {
    proxy_ssl_ntls  on;

    proxy_ssl_certificate      sign.crt enc.crt;
    proxy_ssl_certificate_key  sign.key enc.key;

    proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

    proxy_pass https://backend:443;
}

重要

使用 --with-ntls 构建选项构建代理并链接到启用 NTLS 的 SSL 库

./configure --with-openssl=../Tongsuo-8.3.0 \
            --with-openssl-opt=enable-ntls  \
            --with-ntls

proxy_ssl_password_file#

语法

proxy_ssl_password_file file;

默认值

上下文

http, server, location

指定 密钥 的密码短语文件,每个密码短语在单独的行上指定。在加载密钥时依次尝试密码短语。

proxy_ssl_protocols#

语法

proxy_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

默认值

proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

上下文

http, server, location

在 1.2.0 版本发生变更: TLSv1.3 参数已添加到默认集合。

启用对代理的 HTTPS 服务器请求的指定协议。

proxy_ssl_server_name#

语法

proxy_ssl_server_name on | off;

默认值

proxy_ssl_server_name off;

上下文

http, server, location

启用或禁用通过 Server Name Indication TLS 扩展(SNI,RFC 6066) 传递由 proxy_ssl_name 指令设置的服务器名称 在与代理的 HTTPS 服务器建立连接时。

proxy_ssl_session_reuse#

    • 语法

    • proxy_ssl_session_reuse on | off;

    • 默认值

    • proxy_ssl_session_reuse on;

确定是否可以在与代理服务器交互时重用 SSL 会话。如果日志中出现 "SSL3_GET_FINISHED:digest check failed" 错误,请尝试禁用 会话重用

proxy_ssl_trusted_certificate#

语法

proxy_ssl_trusted_certificate file;

默认值

上下文

http, server, location

指定用于 验证 代理的 HTTPS 服务器证书的 PEM 格式受信任 CA 证书文件。

proxy_ssl_verify#

语法

proxy_ssl_verify on | off;

默认值

proxy_ssl_verify off;

上下文

http, server, location

启用或禁用对代理的 HTTPS 服务器证书的验证。

proxy_ssl_verify_depth#

语法

proxy_ssl_verify_depth number;

默认值

proxy_ssl_verify_depth 1;

上下文

http, server, location

设置代理的 HTTPS 服务器证书链的验证深度。

proxy_store#

语法

proxy_store on | off | string;

默认值

proxy_store off;

上下文

http, server, location

启用将文件保存到磁盘。

on

保存文件路径与指令 aliasroot 对应

off

禁用文件保存

可以使用带有变量的 string 明确设置文件名:

proxy_store /data/www$original_uri;

文件的修改时间根据收到的 "Last-Modified" 响应头字段设置。响应首先被写入临时文件,然后文件被重命名。临时文件和持久存储可以放在不同的文件系统上。但是,请注意,在这种情况下,文件是在两个文件系统之间复制,而不是廉价的重命名操作。因此,建议在任何给定 location 中,保存的文件和由 proxy_temp_path 指令设置的持有临时文件的目录放在同一个文件系统上。

此指令可用于创建静态不变文件的本地副本,例如:

location /images/ {
    root               /data/www;
    error_page         404 = /fetch$uri;
}

location /fetch/ {
    internal;

    proxy_pass         http://backend/;
    proxy_store        on;
    proxy_store_access user:rw group:rw all:r;
    proxy_temp_path    /data/temp;

    alias              /data/www/;
}

或者像这样:

location /images/ {
    root               /data/www;
    error_page         404 = @fetch;
}

location @fetch {
    internal;

    proxy_pass         http://backend;
    proxy_store        on;
    proxy_store_access user:rw group:rw all:r;
    proxy_temp_path    /data/temp;

    root               /data/www;
}

proxy_store_access#

语法

proxy_store_access users:permissions ...;

默认值

proxy_store_access user:rw;

上下文

http, server, location

设置新创建文件和目录的访问权限,例如:

proxy_store_access user:rw group:rw all:r;

如果指定了 groupall 访问权限,则可以省略用户权限:

proxy_store_access group:rw all:r;

proxy_temp_file_write_size#

语法

proxy_temp_file_write_size size;

默认值

proxy_temp_file_write_size 8k|16k;

上下文

http, server, location

限制一次写入临时文件的数据大小,当启用将代理服务器的响应缓冲到临时文件时。默认情况下,大小由 proxy_buffer_sizeproxy_buffers 指令设置的两个缓冲区限制。临时文件的最大大小由 proxy_max_temp_file_size 指令设置。

proxy_temp_path#

语法

proxy_temp_path path [level1 [level2 [level3]]]`;

默认值

proxy_temp_path proxy_temp; (路径依赖于 --http-proxy-temp-path 构建选项

上下文

http, server, location

定义存储从代理服务器接收的数据的临时文件的目录。可以在指定目录下使用最多三级子目录层次结构。例如,在以下配置中

proxy_temp_path /spool/angie/proxy_temp 1 2;

一个临时文件可能如下所示:

/spool/angie/proxy_temp/7/45/00000123457

另请参见 proxy_cache_path 指令的 use_temp_path 参数。

内置变量#

http_proxy 模块支持内置变量,可以使用 proxy_set_header 指令来组合头部:

$proxy_host#

proxy_pass 指令中指定的代理服务器名称和端口;

$proxy_port#

proxy_pass 指令中指定的代理服务器端口,或协议的默认端口;

$proxy_add_x_forwarded_for#

带有附加的 $remote_addr 变量的 "X-Forwarded-For" 客户端请求头字段,以逗号分隔。如果客户端请求头中不存在 "X-Forwarded-For" 字段,则 $proxy_add_x_forwarded_for 变量等于 $remote_addr 变量。