Apache HTTP Server 2.4 版
描述 | 多协议代理/网关服务器 |
---|---|
状态 | 扩展 |
模块标识符 | proxy_module |
源文件 | mod_proxy.c |
在您保护您的服务器之前,请勿使用 ProxyRequests
启用代理。开放代理服务器对您的网络和整个互联网都构成危险。
mod_proxy
及其相关模块为 Apache HTTP Server 实现了一个代理/网关,支持多种流行协议以及几种不同的负载均衡算法。第三方模块可以添加对其他协议和负载均衡算法的支持。
必须将一组模块加载到服务器中才能提供必要的特性。这些模块可以在构建时静态包含,也可以通过 LoadModule
指令动态包含。该集合必须包括
mod_proxy
,它提供基本的代理功能mod_proxy_balancer
和一个或多个均衡器模块。(有关更多信息,请参见 mod_proxy_balancer
。)协议 | 模块 |
---|---|
AJP13(Apache JServe 协议 1.3 版) | mod_proxy_ajp |
CONNECT(用于 SSL) | mod_proxy_connect |
FastCGI | mod_proxy_fcgi |
ftp | mod_proxy_ftp |
HTTP/0.9、HTTP/1.0 和 HTTP/1.1 | mod_proxy_http |
HTTP/2.0 | mod_proxy_http2 |
SCGI | mod_proxy_scgi |
UWSGI | mod_proxy_uwsgi |
WS 和 WSS(Web 套接字) | mod_proxy_wstunnel |
此外,其他模块还提供了扩展功能。缓存由 mod_cache
及其相关模块提供。使用 SSL/TLS 协议联系远程服务器的功能由 mod_ssl
的 SSLProxy*
指令提供。这些附加模块需要加载和配置才能利用这些功能。
Apache HTTP Server 可以配置为 正向 代理和 反向 代理(也称为 网关)模式。
普通的 正向代理 是一个中间服务器,位于客户端和源服务器之间。为了从源服务器获取内容,客户端向代理发送一个请求,将源服务器命名为目标。然后,代理从源服务器请求内容并将其返回给客户端。客户端必须专门配置为使用正向代理访问其他站点。
正向代理的典型用法是为受防火墙限制的内部客户端提供 Internet 访问。正向代理还可以使用缓存(由 mod_cache
提供)来减少网络使用。
正向代理使用 ProxyRequests
指令激活。因为正向代理允许客户端通过您的服务器访问任意站点并隐藏其真实来源,所以您必须保护您的服务器,以便只有授权的客户端才能在激活正向代理之前访问代理。
相反,反向代理(或 网关)对客户端来说就像一个普通的 Web 服务器。客户端不需要进行任何特殊配置。客户端对反向代理命名空间中的内容发出普通请求。然后,反向代理决定将这些请求发送到哪里,并将内容返回,就好像它本身是源服务器一样。
反向代理的典型用法是为位于防火墙后面的服务器提供 Internet 用户访问。反向代理还可以用于在多个后端服务器之间平衡负载或为较慢的后端服务器提供缓存。此外,反向代理可以简单地用于将多个服务器引入同一个 URL 空间。
反向代理使用 ProxyPass
指令或 RewriteRule
指令的 [P]
标志激活。不需要打开 ProxyRequests
才能配置反向代理。
以下示例只是帮助您入门的非常基本的想法。请阅读有关各个指令的文档。
此外,如果您希望启用缓存,请查阅 mod_cache
的文档。
ProxyPass "/foo" "http://foo.example.com/bar" ProxyPassReverse "/foo" "http://foo.example.com/bar"
ProxyRequests On ProxyVia On <Proxy "*"> Require host internal.example.com </Proxy>
ProxyPass "/some/ws/capable/path/" "http://example.com/some/ws/capable/path/" upgrade=websocket
您还可以通过创建合适的处理程序传递来强制将请求作为反向代理请求处理。以下示例配置将使用反向代理将所有对 PHP 脚本的请求传递到指定的 FastCGI 服务器
<FilesMatch "\.php$"> # Unix sockets require 2.4.7 or later SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/" </FilesMatch>
此功能在 Apache HTTP Server 2.4.10 及更高版本中可用。
代理在称为 工作者 的对象中管理源服务器的配置及其通信参数。有两个内置工作者:默认正向代理工作者和默认反向代理工作者。可以显式配置其他工作者。
两个默认工作者具有固定的配置,如果没有任何其他工作者匹配请求,则将使用它们。它们不使用 HTTP Keep-Alive 或连接重用。相反,将为每个请求打开和关闭到源服务器的 TCP 连接。
显式配置的工作者由其 URL 标识。它们通常使用 ProxyPass
或 ProxyPassMatch
在反向代理中使用时创建和配置
ProxyPass "/example" "http://backend.example.com" connectiontimeout=5 timeout=30
这将创建一个与源服务器 URL http://backend.example.com
关联的工作者,该工作者将使用给定的超时值。在正向代理中使用时,工作者通常通过 ProxySet
指令定义
ProxySet "http://backend.example.com" connectiontimeout=5 timeout=30
<Proxy "http://backend.example.com"> ProxySet connectiontimeout=5 timeout=30 </Proxy>
在正向模式下使用显式配置的工作者并不常见,因为正向代理通常与许多不同的源服务器通信。如果某些源服务器使用频率很高,那么为它们创建显式工作者仍然很有用。显式配置的工作者本身没有正向或反向代理的概念。它们封装了与源服务器通信的通用概念。由 ProxyPass
创建的用于反向代理的工作者,只要源服务器的 URL 与工作者 URL 匹配,也会用于正向代理请求,反之亦然。
标识直接工作者的 URL 是其源服务器的 URL,包括给定的任何路径组件
ProxyPass "/examples" "http://backend.example.com/examples" ProxyPass "/docs" "http://backend.example.com/docs"
此示例定义了两个不同的工作者,每个工作者使用单独的连接池和配置。
如果工作者 URL 重叠,则会发生工作者共享,这种情况发生在某个工作者的 URL 是配置文件中稍后定义的另一个工作者的 URL 的前导子字符串时。在以下示例中
ProxyPass "/apps" "http://backend.example.com/" timeout=60 ProxyPass "/examples" "http://backend.example.com/examples" timeout=10
实际上并没有创建第二个工作者。相反,将使用第一个工作者。好处是,只有一个连接池,因此连接更常被重用。请注意,为后来的工作者显式给出的所有配置属性都将被忽略。这将被记录为警告。在上面的示例中,URL /examples
的最终超时值为 60
而不是 10
!
如果您想避免工作者共享,请按 URL 长度对工作者定义进行排序,从最长的工作者 URL 开始。如果您想最大限度地共享工作者,请使用反向排序顺序。另请参见有关排序 ProxyPass
指令的相关警告。
显式配置的 worker 有两种类型:直接 worker 和 (负载) balancer worker。它们支持许多重要的配置属性,这些属性将在下面的 ProxyPass
指令中描述。相同的属性也可以使用 ProxySet
设置。
直接 worker 可用的选项集取决于在源服务器 URL 中指定的协议。可用的协议包括 ajp
、fcgi
、ftp
、http
和 scgi
。
Balancer worker 是虚拟 worker,它们使用称为其成员的直接 worker 来实际处理请求。每个 balancer 可以有多个成员。当它处理请求时,它会根据配置的负载均衡算法选择一个成员。
如果其 worker URL 使用 balancer
作为协议方案,则会创建一个 balancer worker。balancer URL 唯一标识 balancer worker。使用 BalancerMember
将成员添加到 balancer。
DNS 解析发生在首次创建到源域名的套接字时。当启用连接重用时,每个后端域名仅在每个子进程中解析一次,并在所有后续连接中缓存,直到子进程被回收。在计划涉及后端域名的 DNS 维护任务时,应考虑此信息。请还查看 ProxyPass
参数以了解有关连接重用的更多详细信息。
您可以通过 <Proxy>
控制块控制谁可以访问您的代理,如下例所示
<Proxy "*"> Require ip 192.168.0 </Proxy>
有关访问控制指令的更多信息,请参见 mod_authz_host
。
如果您使用的是正向代理(使用 ProxyRequests
指令),则严格限制访问至关重要。否则,您的服务器可以被任何客户端用来访问任意主机,同时隐藏其真实身份。这对您的网络和整个互联网来说都是危险的。当使用反向代理(使用 ProxyPass
指令,其中 ProxyRequests Off
)时,访问控制不太重要,因为客户端只能联系您已明确配置的主机。
另请参见 Proxy-Chain-Auth 环境变量。
如果您使用的是 ProxyBlock
指令,则主机名的 IP 地址将在启动期间查找并缓存,以便以后进行匹配测试。这可能需要几秒钟(或更长时间),具体取决于主机名查找的速度。
位于内联网中的 Apache httpd 代理服务器需要通过公司的防火墙转发外部请求(为此,请配置 ProxyRemote
指令以将相应的 scheme 转发到防火墙代理)。但是,当它必须访问内联网中的资源时,它可以在访问主机时绕过防火墙。 NoProxy
指令对于指定哪些主机属于内联网并应直接访问很有用。
内联网中的用户倾向于从其 WWW 请求中省略本地域名,因此请求 "http://somehost/" 而不是 http://somehost.example.com/
。一些商业代理服务器允许他们摆脱这种困境,并简单地提供请求,这意味着配置了本地域名。当使用 ProxyDomain
指令并且服务器 配置为代理服务 时,Apache httpd 可以返回重定向响应并将客户端发送到正确的、完全限定的服务器地址。这是首选方法,因为用户的书签文件将包含完全限定的主机。
对于 mod_proxy
向未正确实现 keepalives 或 HTTP/1.1 的源服务器发送请求的情况,有两个 环境变量 可以强制请求使用 HTTP/1.0 且不使用 keepalive。这些是通过 SetEnv
指令设置的。
这些是 force-proxy-request-1.0
和 proxy-nokeepalive
注释。
<Location "/buggyappserver/"> ProxyPass "http://buggyappserver:7001/foo/" SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 </Location>
在 2.4.26 及更高版本中,可以设置 "no-proxy" 环境变量以禁用 mod_proxy
处理当前请求。此变量应使用 SetEnvIf
设置,因为 SetEnv
的评估时间不够早。
一些请求方法(如 POST)包含请求主体。HTTP 协议要求包含主体的请求要么使用分块传输编码,要么发送 Content-Length
请求头。当将这些请求传递给源服务器时,mod_proxy_http
将始终尝试发送 Content-Length
。但是,如果主体很大并且原始请求使用分块编码,则上游请求中也可能使用分块编码。您可以使用 环境变量 控制此选择。设置 proxy-sendcl
通过始终发送 Content-Length
来确保与上游服务器的最大兼容性,而设置 proxy-sendchunked
通过使用分块编码来最大限度地减少资源使用。
在某些情况下,服务器必须将请求主体转储到磁盘以满足对请求主体处理的请求。例如,如果原始主体使用分块编码发送(并且很大),但管理员要求将后端请求发送为 Content-Length 或 HTTP/1.0,则会发生此转储。如果请求主体已经具有 Content-Length 标头,但服务器配置为过滤传入的请求主体,则也会发生此转储。
当以反向代理模式运行(例如,使用 ProxyPass
指令)时,mod_proxy_http
会添加几个请求头以将信息传递给源服务器。这些头是
X-Forwarded-For
X-Forwarded-Host
Host
HTTP 请求头中请求的原始主机。X-Forwarded-Server
在源服务器上使用这些头时要小心,因为如果原始请求已经包含其中一个头,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i
来记录原始客户端的 IP 地址,但如果请求通过多个代理,您可能会获得多个地址。
另请参见 ProxyPreserveHost
和 ProxyVia
指令,它们控制其他请求头。
注意:如果您需要指定要添加到转发请求的自定义请求头,请使用 RequestHeader
指令。
描述 | 可以添加的额外 Balancer 的数量,这些 Balancer 可以通过后配置添加 |
---|---|
语法 | BalancerGrowth # |
默认值 | BalancerGrowth 5 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | BalancerGrowth 仅在 Apache HTTP Server 2.3.13 及更高版本中可用。 |
此指令允许在虚拟主机中为 Balancer 的数量提供增长潜力,除了预先配置的数量之外。它仅在至少有一个预先配置的 Balancer 时才生效。
描述 | 从主服务器继承 ProxyPassed Balancer/Worker |
---|---|
语法 | BalancerInherit On|Off |
默认值 | BalancerInherit On |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | BalancerInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。 |
此指令将导致当前服务器/虚拟主机“继承”在主服务器中定义的 ProxyPass Balancer 和 Worker。如果使用 Balancer Manager,这可能会导致问题和不一致的行为,因此如果使用该功能,应将其禁用。
全局服务器中的设置定义了所有虚拟主机的默认值。
描述 | 将成员添加到负载均衡组 |
---|---|
语法 | BalancerMember [balancerurl] url [key=value [key=value ...]] |
上下文 | 目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | BalancerMember 仅在 Apache HTTP Server 2.2 及更高版本中可用。 |
此指令将成员添加到负载均衡组。它可以在 <Proxy balancer://...>
容器指令中使用,并且可以采用 ProxyPass
指令可用的任何键值对参数。
只有一个额外的参数仅对 BalancerMember
指令可用:loadfactor。这是成员负载系数 - 一个介于 1.0(默认值)和 100.0 之间的十进制数,它定义了要应用于该成员的加权负载。
仅当不在 <Proxy balancer://...>
容器指令中时才需要 balancerurl。它对应于在 ProxyPass
指令中定义的 balancer 的 url。
任何 <Proxy balancer://...>
容器指令中的 balancer URL 的路径组件将被忽略。
通常应从 BalancerMember
的 URL 中删除尾部斜杠。
描述 | 尝试在重启之间持久化 Balancer Manager 所做的更改。 |
---|---|
语法 | BalancerPersist On|Off |
默认值 | BalancerPersist Off |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | BalancerPersist 仅在 Apache HTTP Server 2.4.4 及更高版本中可用。 |
此指令将导致与 balancer 和 balancer 成员关联的共享内存存储在重启之间持久化。这允许这些本地更改在正常的重启/优雅状态转换期间不会丢失。
描述 | 将直接连接到的主机、域名或网络 |
---|---|
语法 | NoProxy host [host] ... |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
此指令仅适用于内联网中的 Apache httpd 代理服务器。 NoProxy
指令指定一个由空格分隔的子网、IP 地址、主机和/或域列表。对与其中一个或多个匹配的主机的请求将始终直接提供服务,而不会转发到配置的 ProxyRemote
代理服务器。
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21"
NoProxy
指令的 host 参数是以下类型列表之一
一个 域 是一个部分限定的 DNS 域名,前面有一个句点。它代表一个逻辑上属于同一个 DNS 域或区域的主机列表(即,主机名的后缀都以 域 结尾)。
.com .example.org.
为了区分 域 和 主机名(在语法和语义上;DNS 域也可以有 DNS A 记录!),域 始终以一个句点开头。
域名比较不区分大小写,并且 域 始终被认为是锚定在 DNS 树的根目录中;因此,两个域 .ExAmple.com
和 .example.com.
(注意尾部的句点)被认为是相等的。由于域比较不涉及 DNS 查询,因此它比子网比较效率更高。
一个 子网 是一个部分限定的互联网地址,以数字(点分十进制)形式表示,后面可以选择跟一个斜杠和网络掩码,以 子网 中有效位的数量指定。它用于表示可以通过公共网络接口访问的主机子网。在没有显式网络掩码的情况下,假设省略(或值为零)的尾部数字指定掩码。(在这种情况下,网络掩码只能是 8 位宽的倍数。)示例
192.168
或 192.168.0.0
255.255.0.0
中使用)192.168.112.0/21
192.168.112.0/21
,网络掩码为 21 个有效位(也以 255.255.248.0
的形式使用)作为一种退化情况,具有 32 个有效位的 子网 等效于一个 IPAddr,而具有零个有效位的 子网(例如,0.0.0.0/0)与常量 _Default_ 相同,匹配任何 IP 地址。
一个 IPAddr 代表一个以数字(点分十进制)形式表示的完全限定的互联网地址。通常,此地址代表一个主机,但不必一定与地址关联一个 DNS 域名。
192.168.123.7
一个 IPAddr 不需要由 DNS 系统解析,因此它可以提高 Apache 的性能。
一个 主机名 是一个完全限定的 DNS 域名,可以通过 DNS 域名服务解析为一个或多个 IPAddrs。它代表一个逻辑主机(与 域 相反,见上文),并且必须解析为至少一个 IPAddr(或者通常解析为具有不同 IPAddr 的主机列表)。
prep.ai.example.edu
www.example.org
在许多情况下,指定一个 IPAddr 来代替 主机名 更有效,因为可以避免 DNS 查询。当连接到名称服务器使用慢速 PPP 链路时,Apache httpd 中的名称解析可能需要相当长的时间。
主机名 比较不区分大小写,并且 主机名 始终被认为是锚定在 DNS 树的根目录中;因此,两个主机 WWW.ExAmple.com
和 www.example.com.
(注意尾部的句点)被认为是相等的。
描述 | 应用于代理资源的指令的容器 |
---|---|
语法 | <Proxy 通配符 URL> ...</Proxy> |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
放置在 <Proxy>
部分中的指令仅适用于匹配的代理内容。允许使用 shell 风格的通配符。
例如,以下内容将只允许 yournetwork.example.com
中的主机通过您的代理服务器访问内容
<Proxy "*"> Require host yournetwork.example.com </Proxy>
以下示例将在通过代理服务器发送时,通过 INCLUDES
过滤器处理 example.com
的 foo
目录中的所有文件
<Proxy "http://example.com/foo/*"> SetOutputFilter INCLUDES </Proxy>
如果后端 URL 以 通配符 URL 字符串开头,则它将匹配配置部分,即使指令中的最后一个路径段仅匹配后端 URL 的前缀。例如,<Proxy "http://example.com/foo"> 匹配所有 http://example.com/foo、http://example.com/foo/bar 和 http://example.com/foobar。最终 URL 的匹配与 <Location>
部分的行为不同,为了便于说明,该部分将最终路径组件视为以斜杠结尾。
要更精确地控制匹配,请参见 <ProxyMatch>
。
描述 | 将 100 继续期望转发到源服务器 |
---|---|
语法 | Proxy100Continue Off|On |
默认值 | Proxy100Continue On |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 2.4.40 及更高版本中可用 |
此指令确定代理是否应将 100 继续 Expect:ation 转发到源服务器,从而让它决定何时/是否应读取 HTTP 请求正文,或者当 Off
时,代理应在转发请求正文之前自行生成 100 Continue 中间响应。
此选项仅适用于 HTTP 代理,如 mod_proxy_http
所处理。
描述 | 在 X-Forwarded-* 标头中添加代理信息 |
---|---|
语法 | ProxyAddHeaders Off|On |
默认值 | ProxyAddHeaders On |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 2.3.10 及更高版本中可用 |
此指令确定是否应通过 X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Server HTTP 标头将代理相关信息传递到后端服务器。
此选项仅适用于 HTTP 代理,如 mod_proxy_http
所处理。
描述 | 确定如何处理响应中的错误标头行 |
---|---|
语法 | ProxyBadHeader IsError|Ignore|StartBody |
默认值 | ProxyBadHeader IsError |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
ProxyBadHeader
指令确定 mod_proxy
在从源服务器接收语法上无效的响应标头行(即,不包含冒号)时的行为。以下参数是可能的
IsError
Ignore
StartBody
描述 | 禁止代理的单词、主机或域 |
---|---|
语法 | ProxyBlock *|word|host|domain [word|host|domain] ... |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
ProxyBlock
指令指定一个由空格分隔的单词、主机和/或域列表。对名称包含匹配的单词、主机或域的网站的 HTTP、HTTPS 和 FTP 文档请求将被代理服务器 阻止。代理模块还将尝试在启动时确定列表项的 IP 地址(这些地址可能是主机名),并将它们缓存以进行匹配测试。这可能会减慢服务器的启动时间。
ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"
请注意,example
也足以匹配以下任何网站。
如果通过 IP 地址引用,主机也会被匹配。
还要注意
ProxyBlock "*"
阻止与所有网站的连接。
描述 | 代理请求的默认域名 |
---|---|
语法 | ProxyDomain Domain |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
此指令仅适用于内联网中的 Apache httpd 代理服务器。 ProxyDomain
指令指定 Apache 代理服务器将所属的默认域。如果遇到对没有域名的主机的请求,将生成一个重定向响应,将配置的 Domain 附加到相同主机。
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21" ProxyDomain ".example.com"
描述 | 覆盖代理内容的错误页面 |
---|---|
语法 | ProxyErrorOverride Off|On [code ...] |
默认值 | ProxyErrorOverride Off |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 状态码列表在 2.4.47 中添加 |
此指令对于反向代理设置很有用,在这些设置中,您希望在最终用户看到的错误页面上具有统一的外观。这也允许包含文件(通过 mod_include
的 SSI)获取错误代码并相应地采取行动。(默认行为将显示代理服务器的错误页面。启用此选项将显示 SSI 错误消息。)
此指令不会影响信息性 (1xx)、正常成功 (2xx) 或重定向 (3xx) 响应的处理。
默认情况下,ProxyErrorOverride
会影响所有代码介于 400(包括)和 600(不包括)之间的响应。
ProxyErrorOverride On
要更改默认行为,您可以指定要考虑的状态码,用空格分隔。如果您这样做,所有其他状态码将被忽略。您只能指定被视为错误代码的状态码:介于 400(包括)和 600(不包括)之间。
ProxyErrorOverride On 403 405 500 501 502 503 504
描述 | 确定内部数据吞吐缓冲区的大小 |
---|---|
语法 | ProxyIOBufferSize bytes |
默认值 | ProxyIOBufferSize 8192 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
ProxyIOBufferSize
指令调整内部缓冲区的大小,该缓冲区用作输入和输出之间数据的临时存储区。大小必须至少为 512
。
几乎在所有情况下,都没有理由更改该值。
如果与 AJP 一起使用,此指令将设置以字节为单位的最大 AJP 数据包大小。大于 65536 的值将设置为 65536。如果您从默认值更改它,您还必须更改 Tomcat 端 AJP 连接器上的 packetSize
属性!属性 packetSize
仅在 Tomcat 5.5.20+
和 6.0.2+
中可用
通常没有必要更改最大数据包大小。在发送证书或证书链时,已报告默认值的出现问题。
描述 | 应用于正则表达式匹配的代理资源的指令的容器 |
---|---|
语法 | <ProxyMatch regex> ...</ProxyMatch> |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
<ProxyMatch>
指令与 <Proxy>
指令相同,只是它使用 正则表达式 匹配 URL。
从 2.4.8 开始,命名的组和反向引用被捕获并写入环境,相应的名称以 "MATCH_" 为前缀并大写。这允许在 表达式 和 mod_rewrite
等模块中引用 URL 的元素。为了避免混淆,编号(未命名)的反向引用将被忽略。请改用命名组。
<ProxyMatch "^http://(?<sitename>[^/]+)"> Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example </ProxyMatch>
描述 | 请求可以转发通过的最大代理数量 |
---|---|
语法 | ProxyMaxForwards number |
默认值 | ProxyMaxForwards -1 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 默认行为在 2.2.7 中更改 |
ProxyMaxForwards
指令指定如果请求没有提供 Max-Forwards
标头,则请求可以经过的最大代理数量。这可以设置为防止无限代理循环或 DoS 攻击。
ProxyMaxForwards 15
请注意,设置 ProxyMaxForwards
违反了 HTTP/1.1 协议 (RFC2616),该协议禁止代理在客户端未设置的情况下设置 Max-Forwards
。早期的 Apache httpd 版本总是会设置它。负数的 ProxyMaxForwards
值(包括默认值 -1)可以提供符合协议的行为,但可能会使您容易受到循环攻击。
描述 | 将远程服务器映射到本地服务器的 URL 空间 |
---|---|
语法 | ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] [noquery] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | Unix 域套接字 (UDS) 支持在 2.4.7 中添加 |
此指令允许将远程服务器映射到本地服务器的空间。本地服务器不会以传统意义上的代理方式运行,而是看起来像是远程服务器的镜像。本地服务器通常被称为 反向代理 或 网关。 path 是本地虚拟路径的名称; url 是远程服务器的 URL 部分,不能包含查询字符串。
ProxyPass
时,通常应将 ProxyRequests
指令设置为 关闭。在 2.4.7 及更高版本中,通过使用以 unix:/path/lis.sock|
开头的目标,可以使用 Unix 域套接字。例如,要代理 HTTP 并将目标设置为 /home/www.socket 上的 UDS,可以使用 unix:/home/www.socket|http://localhost/whatever/
。
unix:
URL 关联的路径是 DefaultRuntimeDir
意识的。当在 <Location>
部分内使用时,第一个参数将被省略,本地目录将从 <Location>
中获取。在 <LocationMatch>
部分内也会发生同样的情况;但是,ProxyPass 不会将正则表达式解释为正则表达式,因此在这种情况下,需要使用 ProxyPassMatch
。
假设本地服务器的地址为 http://example.com/
;那么
<Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location>
将导致对 http://example.com/mirror/foo/bar
的本地请求在内部转换为对 http://backend.example.com/bar
的代理请求。
如果您需要更灵活的反向代理配置,请参阅带有 [P]
标志的 RewriteRule
指令。
以下替代语法是可能的;但是,当存在大量此类语法时,它可能会带来性能损失。以下语法的优点是它允许通过 Balancer Manager 接口进行动态控制
ProxyPass "/mirror/foo/" "http://backend.example.com/"
如果第一个参数以尾部的 / 结尾,则第二个参数也应该以尾部的 / 结尾,反之亦然。否则,对后端的请求可能会丢失一些必要的斜杠,并且不会提供预期的结果。
!
指令在您不想反向代理子目录的情况下很有用,例如
<Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location> <Location "/mirror/foo/i"> ProxyPass "!" </Location>
ProxyPass "/mirror/foo/i" "!" ProxyPass "/mirror/foo" "http://backend.example.com"
将代理所有对 /mirror/foo
的请求到 backend.example.com
,除了对 /mirror/foo/i
的请求。
在不同上下文中混合使用 ProxyPass 设置不起作用
ProxyPass "/mirror/foo/i" "!" <Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location>
在这种情况下,对 /mirror/foo/i
的请求将被代理,因为 Location 块中的 ProxyPass
指令将首先被评估。 ProxyPass
支持服务器和目录上下文这一事实并不意味着它们在配置文件中的范围和位置将保证任何排序或覆盖。
配置的 ProxyPass
和 ProxyPassMatch
规则将按照配置顺序进行检查。第一个匹配的规则获胜。因此,通常您应该对冲突的 ProxyPass
规则进行排序,从最长的 URL 开始。否则,较长的 URL 的后续规则将被任何使用 URL 的前导子字符串的早期规则隐藏。请注意,这与工作进程共享有一些关系。
排除项必须放在一般的 ProxyPass
指令之前。在 2.4.26 及更高版本中,"no-proxy" 环境变量是排除项的替代方法,也是在 Location
上下文中配置 ProxyPass
指令排除的唯一方法。此变量应使用 SetEnvIf
设置,因为 SetEnv
的评估时间不够早。
ProxyPass key=value
参数
在 Apache HTTP Server 2.1 及更高版本中,mod_proxy 支持对后端服务器进行池化连接。按需创建的连接可以保留在池中以供将来使用。池大小限制和其他设置可以使用以下表格中描述的 ProxyPass
指令中的 key=value
参数进行编码。
默认情况下,mod_proxy 将允许并保留该 Web 服务器子进程可以同时使用的最大连接数。使用 max
参数可以将该数字从默认值减少。连接池是针对每个 Web 服务器子进程维护的,并且 max
和其他设置不会在所有子进程之间协调,除非配置或 MPM 设计只允许一个子进程。
使用 ttl
参数可以设置可选的生存时间;至少 ttl
秒内未使用的连接将被关闭。 ttl
可用于避免使用由于后端服务器的保持活动超时而可能关闭的连接。
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
工作进程 | BalancerMember 参数 |
---|
参数 | 默认值 | 描述 | |||||||
---|---|---|---|---|---|---|---|---|---|
min | 0 | 连接池条目的最小数量,与实际连接数量无关。这只需要在特殊情况下修改默认值,在这些情况下,与后端连接相关的堆内存应该预先分配或保留。 | |||||||
max | 1...n | 允许到后端服务器的最大连接数。此限制的默认值为活动 MPM 中每个进程的线程数。在 Prefork MPM 中,这始终为 1,而在其他 MPM 中,它由 ThreadsPerChild 指令控制。 | |||||||
smax | max | 如果超过此限制,保留的连接池条目将在某些操作期间被释放,前提是它们在超过由 ttl 参数控制的生存时间后一直未使用。如果连接池条目具有关联的连接,则该连接将被关闭。这只需要在特殊情况下修改默认值,在这些情况下,需要更积极地释放或关闭超过生存时间的连接池条目和任何关联的连接。 | |||||||
acquire | - | 如果设置,这将是等待连接池中空闲连接的最大时间(以毫秒为单位)。如果池中没有空闲连接,Apache httpd 将向客户端返回 SERVER_BUSY 状态。 | |||||||
connectiontimeout | timeout | 连接超时时间(以秒为单位)。Apache httpd 等待与后端建立连接完成的秒数。通过添加后缀 ms,超时时间也可以设置为毫秒。 | |||||||
disablereuse | Off | 当您希望强制 mod_proxy 在使用后立即关闭与后端的连接时,应使用此参数,从而禁用对该后端的持久连接和池。这有助于解决各种情况,在这些情况下,Apache httpd 和后端服务器之间的防火墙(无论协议如何)往往会静默地丢弃连接,或者后端本身可能处于轮询 DNS 中。当启用连接重用时,每个后端域只会在每个子进程中解析一次(使用 DNS 查询),并缓存以供所有后续连接使用,直到子进程被回收。要禁用连接重用,请将此属性值设置为 On 。 | |||||||
enablereuse | On | 这是上面 "disablereuse" 的反面,提供给需要选择加入连接重用的方案处理程序(例如 mod_proxy_fcgi )。2.4.11 及更高版本。 | |||||||
flushpackets | off | 确定代理模块是否会在发送每个数据“块”后自动刷新输出旅馆。'off' 表示它只会在需要时刷新;'on' 表示在发送每个块后刷新;'auto' 表示轮询/等待一段时间,如果在 'flushwait' 毫秒内没有收到输入,则刷新。目前,这仅对 mod_proxy_ajp 和 mod_proxy_fcgi 有效。 | |||||||
flushwait | 10 | 如果 'flushpackets' 为 'auto',则在刷新输出旅馆之前等待额外输入的时间(以毫秒为单位)。 | |||||||
iobuffersize | 8192 | 调整内部暂存盘 IO 缓冲区的大小。这允许您为特定工作进程覆盖 ProxyIOBufferSize 。这必须至少为 512 或设置为 0 以使用系统的默认值 8192。 | |||||||
responsefieldsize | 8192 | 调整代理响应字段缓冲区的大小。缓冲区大小应至少为从代理响应中预期到的最大标头大小。将该值设置为 0 将使用系统的默认值 8192 字节。 在 Apache HTTP Server 2.4.34 及更高版本中可用。 | |||||||
keepalive | Off | 当您在 Apache httpd 和后端服务器之间有防火墙,并且该防火墙倾向于丢弃非活动连接时,应使用此参数。此标志将告诉操作系统在非活动连接上发送 初始和后续 TCP 保活探测的频率取决于全局操作系统设置,可能高达 2 小时。为了有效,操作系统中配置的频率必须小于防火墙使用的阈值。 | |||||||
lbset | 0 | 设置工作器所属的负载均衡器集群集。负载均衡器将在尝试更高编号的 lbset 之前尝试所有较低编号的 lbset 成员。 | |||||||
ping | 0 | Ping 属性告诉 Web 服务器在转发请求之前“测试”与后端的连接。对于 AJP,它会导致 mod_proxy_ajp 在 ajp13 连接上发送 CPING 请求(在 Tomcat 3.3.2+、4.1.28+ 和 5.0.13+ 上实现)。对于 HTTP,它会导致 mod_proxy_http 向后端发送 100-Continue (仅对 HTTP/1.1 有效 - 对于非 HTTP/1.1 后端,此属性无效)。在这两种情况下,参数都是等待回复的延迟时间(以秒为单位)。此功能已添加以避免挂起和繁忙的后端问题。这将在正常操作期间增加网络流量,这可能是一个问题,但它将在某些集群节点关闭或繁忙的情况下降低流量。通过添加后缀 ms,延迟也可以以毫秒为单位设置。 | |||||||
receivebuffersize | 0 | 调整代理连接的显式(TCP/IP)网络缓冲区大小。这允许您为特定工作器覆盖 ProxyReceiveBufferSize 。这必须至少为 512 或设置为 0 以使用系统默认值。 | |||||||
redirect | - | 工作器的重定向路由。此值通常动态设置以启用从集群中安全删除节点。如果设置,所有没有会话 ID 的请求都将重定向到路由参数等于此值的 BalancerMember。 | |||||||
retry | 60 | 连接池工作器重试超时(以秒为单位)。如果与后端服务器的连接池工作器处于错误状态,Apache httpd 不会将任何请求转发到该服务器,直到超时时间到期。这使得能够关闭后端服务器以进行维护,并在以后将其重新联机。值为 0 表示始终重试处于错误状态的工作器,没有超时。 | |||||||
route | - | 在负载均衡器内使用时工作器的路由。路由是附加到会话 ID 的值。 | |||||||
status | - | 定义此工作器初始状态的单个字母值。
| |||||||
timeout | ProxyTimeout |
套接字超时(以秒为单位)。Apache httpd 等待从后端发送/接收数据的秒数。 | |||||||
ttl | - | 非活动连接和关联的连接池条目生存时间(以秒为单位)。达到此限制后,连接将不再使用;它将在稍后关闭。 | |||||||
flusher | flush |
| |||||||
secret | - | mod_proxy_ajp 使用的密钥的值。它必须与 AJP 连接服务器端配置的密钥相同。在 Apache HTTP Server 2.4.42 及更高版本中可用。 | |||||||
upgrade | - | 由 | |||||||
mapping | - | path 和 url 之间的映射类型。这决定了
ProxyPass "/special%3Fsegment" "https://example.com/special%3Fsegment" mapping=encoded <Location "/special%3Fsegment"> Require ip 172.17.2.0/24 </Location>
ProxyPass "/some/path" "https://servlet.example.com/some/path" mapping=servlet <Location "/some/path"> Require valid-user </Location> 注意建议在 Apache httpd 端使用与后端端使用的相同的映射。例如,当在 | |||||||
addressttl | -1 | 后端地址的 DNS 解析缓存时间(以秒为单位)。-1 表示直到 Apache httpd 重新启动。 |
如果 Proxy 指令方案以 balancer://
开头(例如:balancer://cluster
,任何路径信息都会被忽略),那么将创建一个实际上不与后端服务器通信的虚拟工作器。相反,它负责管理多个“真实”工作器。在这种情况下,可以将特殊参数集添加到此虚拟工作器。有关均衡器工作原理的更多信息,请参阅 mod_proxy_balancer
。
均衡器参数 |
---|
参数 | 默认值 | 描述 |
---|---|---|
lbmethod | byrequests | 均衡器负载均衡方法。选择要使用的负载均衡调度程序方法。可以是 byrequests ,执行加权请求计数;bytraffic ,执行加权流量字节计数均衡;或 bybusyness ,执行待处理请求均衡。默认值为 byrequests 。 |
maxattempts | 比工作器数量少一个,或者只有一个工作器时为 1。 | 在放弃之前允许的最大故障转移尝试次数。 |
nofailover | Off | 如果设置为 On ,如果工作器处于错误状态或已禁用,会话将断开。如果后端服务器不支持会话复制,请将此值设置为 On 。 |
stickysession | - | 均衡器粘性会话名称。该值通常设置为类似 JSESSIONID 或 PHPSESSIONID 的内容,它取决于支持会话的后端应用程序服务器。如果后端应用程序服务器对 cookie 和 URL 编码 ID 使用不同的名称(如 servlet 容器),请使用 | 将它们分隔开。第一部分用于 cookie,第二部分用于路径。在 Apache HTTP Server 2.4.4 及更高版本中可用。 |
stickysessionsep | "." | 设置会话 cookie 中的分隔符。一些后端应用程序服务器不使用 '.' 作为符号。例如,Oracle Weblogic 服务器使用 '!'。可以使用此选项设置正确的符号。设置 'Off' 表示不使用任何符号。 |
scolonpathdelim | Off | 如果设置为 On ,分号字符 ';' 将用作额外的粘性会话路径分隔符/分隔符。这主要用于在处理诸如 JSESSIONID=6736bcf34;foo=aabfa 之类的路径时模拟 mod_jk 的行为 |
timeout | 0 | 均衡器超时(以秒为单位)。如果设置,这将是等待空闲工作器的最长时间。默认是不等待。 |
failonstatus | - | 单个或逗号分隔的 HTTP 状态代码列表。如果设置,当后端返回列表中的任何状态代码时,这将强制工作器进入错误状态。工作器恢复的行为与其他工作器错误相同。 |
failontimeout | Off | 如果设置,在将请求发送到后端后发生的 IO 读取超时将强制工作器进入错误状态。工作器恢复的行为与其他工作器错误相同。 在 Apache HTTP Server 2.4.5 及更高版本中可用。 |
nonce | <auto> | balancer-manager 应用程序页面中使用的保护性 nonce。默认情况下使用自动确定的基于 UUID 的 nonce,以提供对页面的进一步保护。如果设置,则 nonce 将设置为该值。设置 None 将禁用所有 nonce 检查。注意除了 nonce 之外, |
growth | 0 | 除了配置中定义的 BalancerMember 之外,允许添加到此均衡器的额外 BalancerMember 数量。 |
forcerecovery | On | 如果均衡器的所有工作器都处于错误状态,则强制立即恢复所有工作器,而不考虑工作器的重试参数。可能存在以下情况:如果在不考虑每个工作器的重试参数的情况下强制执行所有工作器的恢复,则已经过载的后端可能会陷入更严重的问题。在这种情况下,设置为 Off 。在 Apache HTTP Server 2.4.2 及更高版本中可用。 |
一个示例均衡器设置
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10 ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On <Proxy "balancer://mycluster"> BalancerMember "ajp://1.2.3.4:8009" BalancerMember "ajp://1.2.3.5:8009" loadfactor=20 # Less powerful server, don't send as many requests there, BalancerMember "ajp://1.2.3.6:8009" loadfactor=5 </Proxy>
配置热备可以帮助确保每个负载均衡器集始终有特定数量的工作器可用
ProxyPass "/" "balancer://sparecluster/" <Proxy balancer://sparecluster> BalancerMember ajp://1.2.3.4:8009 BalancerMember ajp://1.2.3.5:8009 # The servers below are hot spares. For each server above that is unusable # (draining, stopped, unreachable, in error state, etc.), one of these spares # will be used in its place. Two servers will always be available for a request # unless one or more of the spares is also unusable. BalancerMember ajp://1.2.3.6:8009 status=+R BalancerMember ajp://1.2.3.7:8009 status=+R </Proxy>
设置一个热备,只有在负载均衡器集中没有其他成员(或备用工作器)可用时才会使用
ProxyPass "/" "balancer://hotcluster/" <Proxy "balancer://hotcluster"> BalancerMember "ajp://1.2.3.4:8009" loadfactor=1 BalancerMember "ajp://1.2.3.5:8009" loadfactor=2.25 # The server below is on hot standby BalancerMember "ajp://1.2.3.6:8009" status=+H ProxySet lbmethod=bytraffic </Proxy>
其他 ProxyPass 关键字
通常,mod_proxy 会规范化 ProxyPassed URL。但这可能与某些后端不兼容,特别是那些使用 PATH_INFO 的后端。可选的 nocanon 关键字会抑制此行为,并将 URL 路径“原始”地传递给后端。请注意,此关键字可能会影响后端的安全性,因为它会删除代理提供的针对基于 URL 的攻击的正常有限保护。
通常,mod_proxy 会在生成 SCRIPT_FILENAME 环境变量时包含查询字符串。可选的 noquery 关键字(在 httpd 2.4.1 及更高版本中可用)可以阻止这种情况。
可选的 interpolate
关键字与 ProxyPassInterpolateEnv
结合使用,会导致 ProxyPass 使用语法 ${VARNAME} 对环境变量进行插值。请注意,许多标准的 CGI 派生环境变量在进行此插值时将不存在,因此您可能仍然需要使用 mod_rewrite
来实现复杂的规则。另请注意,仅对于在解析指令时可用的变量(如 Define
),插值才支持在 URL 的方案/主机名/端口部分中进行。可以使用 mod_rewrite
来动态确定这些字段。以下示例描述了如何使用 mod_rewrite
来动态设置方案为 http 或 https
RewriteEngine On RewriteCond "%{HTTPS}" =off RewriteRule "." "-" [E=protocol:http] RewriteCond "%{HTTPS}" =on RewriteRule "." "-" [E=protocol:https] RewriteRule "^/mirror/foo/(.*)" "%{ENV:protocol}://backend.example.com/$1" [P] ProxyPassReverse "/mirror/foo/" "http://backend.example.com/" ProxyPassReverse "/mirror/foo/" "https://backend.example.com/"
从 Apache HTTP Server 2.4.47 开始,mod_proxy_http
可以使用 ProxyPass
参数 upgrade 端到端地处理协议升级(隧道)。
端到端意味着来自客户端/浏览器的 HTTP 升级请求首先由 mod_proxy_http
转发到源服务器,并且只有在源服务器接受/启动升级(HTTP 响应 101 Switching Protocols
)时,连接才会升级(并由 mod_proxy_http
隧道化)。如果源服务器以其他任何方式响应,mod_proxy_http
将继续像往常一样转发(并强制执行)此连接的 HTTP 协议。
有关使用 mod_proxy_http
的配置示例,请参见 Websocket 升级(2.4.47 及更高版本)。
对于 Apache HTTP Server 2.4.46 及更早版本(或如果从 2.4.48 及更高版本开始的 ProxyWebsocketFallbackToProxyHttp
禁用了 mod_proxy_http
处理),请参见 mod_proxy_wstunnel
的文档,了解如何代理 WebSocket 协议。
描述 | 继承从主服务器定义的 ProxyPass 指令 |
---|---|
语法 | ProxyPassInherit On|Off |
默认值 | ProxyPassInherit On |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | ProxyPassInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。 |
此指令将导致当前服务器/虚拟主机“继承”在主服务器中定义的 ProxyPass
指令。如果使用 Balancer Manager 进行动态更改,这可能会导致问题和不一致的行为,因此如果使用该功能,应禁用此指令。
全局服务器中的设置定义了所有虚拟主机的默认值。
禁用 ProxyPassInherit 也会禁用 BalancerInherit
。
描述 | 在反向代理配置中启用环境变量插值 |
---|---|
语法 | ProxyPassInterpolateEnv On|Off |
默认值 | ProxyPassInterpolateEnv Off |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 httpd 2.2.9 及更高版本中可用 |
此指令与 ProxyPass
、ProxyPassReverse
、ProxyPassReverseCookieDomain
和 ProxyPassReverseCookiePath
的 interpolate
参数一起使用,使反向代理能够使用环境变量进行动态配置,这些环境变量可能由其他模块(如 mod_rewrite
)设置。它会影响 ProxyPass
、ProxyPassReverse
、ProxyPassReverseCookieDomain
和 ProxyPassReverseCookiePath
指令,并导致它们在配置指令中将环境变量 varname
的值替换为字符串 ${varname}
,前提是设置了 interpolate
选项。
ProxyPass
的方案/主机名/端口部分可能包含变量,但仅限于在解析指令时可用的变量(例如,使用 Define
)。对于所有其他用例,请考虑使用 mod_rewrite
。
除非您需要,否则请将其关闭!例如,将变量添加到 ProxyPass
中可能会导致使用配置的默认 mod_proxy 工作程序(这些工作程序不允许任何微调,例如连接重用等)。
描述 | 使用正则表达式将远程服务器映射到本地服务器 URL 空间 |
---|---|
语法 | ProxyPassMatch [regex] !|url [key=value [key=value ...]] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 从 2.4.47 开始,当 url 参数包含反向引用时,会尊重 key=value 参数(参见下面的说明)。 |
此指令等效于 ProxyPass
,但使用正则表达式而不是简单的前缀匹配。提供的正则表达式与 url 匹配,如果匹配,服务器将把任何带括号的匹配项替换到给定的字符串中,并将其用作新的 url。
<Directory>
上下文中使用。假设本地服务器的地址为 http://example.com/
;那么
ProxyPassMatch "^/(.*\.gif)$" "http://backend.example.com/$1"
将导致对 http://example.com/foo/bar.gif
的本地请求在内部转换为对 http://backend.example.com/foo/bar.gif
的代理请求。
!
指令在您不想反向代理子目录的情况下很有用。
在 <LocationMatch>
部分中使用时,第一个参数被省略,正则表达式从 <LocationMatch>
获取。
如果您需要更灵活的反向代理配置,请参阅带有 [P]
标志的 RewriteRule
指令。
当 URL 参数不使用任何对正则表达式的反向引用时,原始 URL 将附加到 URL 参数。
key=value
参数与带有反向引用的 url从 Apache HTTP Server 2.4.47 开始,在使用带有反向引用的 url 的 ProxyPassMatch
中,key=value
参数不再被忽略。但是,为了保持关于后端连接重用/保持活动状态的现有行为(以前从未为这些 URL 重用过),参数 enablereuse(或 disablereuse)在此情况下默认为 off
(或 on
)。显式设置 enablereuse=on
允许重用连接,**除非**某些反向引用属于 url 的 authority
部分(主机名和/或端口)(此条件从 Apache HTTP Server 2.4.55 开始强制执行,并在启动时产生警告,因为这些 URL 本身不可重用)。
在构建规则的目标 URL 时要小心,要考虑允许客户端影响服务器充当代理的 URL 集的安全影响。确保 URL 的方案和主机名部分是固定的,或者不允许客户端过度影响。
描述 | 调整从反向代理服务器发送的 HTTP 响应头中的 URL |
---|---|
语法 | ProxyPassReverse [path] url [interpolate] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
此指令允许 Apache httpd 调整 HTTP 重定向响应中的 Location
、Content-Location
和 URI
头中的 URL。当 Apache httpd 用作反向代理(或网关)时,这至关重要,以避免由于位于反向代理后面的后端服务器上的 HTTP 重定向而绕过反向代理。
仅会重写上面提到的 HTTP 响应头。Apache httpd 不会重写其他响应头,也不会默认重写 HTML 页面内的 URL 引用。这意味着如果代理的内容包含绝对 URL 引用,它们将绕过代理。要重写 HTML 内容以匹配代理,您必须加载并启用 mod_proxy_html
。
path 是本地虚拟路径的名称;url 是远程服务器的部分 URL。这些参数的使用方式与 ProxyPass
指令相同。
例如,假设本地服务器的地址为 http://example.com/
;然后
ProxyPass "/mirror/foo/" "http://backend.example.com/" ProxyPassReverse "/mirror/foo/" "http://backend.example.com/" ProxyPassReverseCookieDomain "backend.example.com" "public.example.com" ProxyPassReverseCookiePath "/" "/mirror/foo/"
不仅会导致对 http://example.com/mirror/foo/bar
的本地请求在内部转换为对 http://backend.example.com/bar
的代理请求(ProxyPass
在这里提供的功能)。它还处理服务器 backend.example.com
在将 http://backend.example.com/bar
重定向到 http://backend.example.com/quux
时发送的重定向。Apache httpd 在将 HTTP 重定向响应转发到客户端之前,将其调整为 http://example.com/mirror/foo/quux
。请注意,用于构建 URL 的主机名是根据 UseCanonicalName
指令的设置选择的。
请注意,此 ProxyPassReverse
指令也可以与 mod_rewrite
中的代理功能(RewriteRule ... [P]
)结合使用,因为它不依赖于相应的 ProxyPass
指令。
可选的 interpolate
关键字与 ProxyPassInterpolateEnv
结合使用,可以启用使用格式 ${VARNAME} 指定的环境变量的插值。请注意,插值不支持在 URL 的方案部分中进行。
在 <Location>
部分中使用时,第一个参数被省略,本地目录从 <Location>
获取。在 <LocationMatch>
部分中也会发生相同的情况,但可能无法按预期工作,因为 ProxyPassReverse 会将正则表达式逐字解释为路径;如果在这种情况下需要,请在部分外部或在单独的 <Location>
部分中指定 ProxyPassReverse。
此指令不支持在 <Directory>
或 <Files>
部分中使用。
描述 | 调整来自反向代理服务器的 Set-Cookie 头中的域字符串 |
---|---|
语法 | ProxyPassReverseCookieDomain internal-domain public-domain [interpolate] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
用法与 ProxyPassReverse
基本类似,但不是重写作为 URL 的头,而是重写 Set-Cookie
头中的 domain
字符串。
描述 | 调整来自反向代理服务器的 Set-Cookie 标头中的 Path 字符串 |
---|---|
语法 | ProxyPassReverseCookiePath 内部路径 公共路径 [interpolate] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
与 ProxyPassReverse
结合使用时很有用,在后端 URL 路径映射到反向代理上的公共路径的情况下。此指令会重写 Set-Cookie
标头中的 path
字符串。如果 cookie 路径的开头与 内部路径 匹配,则 cookie 路径将被替换为 公共路径。
在 ProxyPassReverse
中给出的示例中,指令
ProxyPassReverseCookiePath "/" "/mirror/foo/"
将把具有后端路径 /
(或 /example
,实际上,任何内容)的 cookie 重写为 /mirror/foo/
。
描述 | 将传入的 Host HTTP 请求标头用于代理请求 |
---|---|
语法 | ProxyPreserveHost On|Off |
默认值 | ProxyPreserveHost Off |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 2.3.3 及更高版本中,可在目录上下文中使用。 |
启用此选项后,它将把传入请求中的 Host:
行传递给代理主机,而不是 ProxyPass
行中指定的 hostname。
此选项通常应设置为 Off
。它主要在特殊配置中很有用,例如代理的基于名称的大规模虚拟主机,其中后端服务器需要评估原始 Host 标头。
描述 | 代理的 HTTP 和 FTP 连接的网络缓冲区大小 |
---|---|
语法 | ProxyReceiveBufferSize 字节 |
默认值 | ProxyReceiveBufferSize 0 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
ProxyReceiveBufferSize
指令指定代理的 HTTP 和 FTP 连接的显式(TCP/IP)网络缓冲区大小,以提高吞吐量。它必须大于 512
或设置为 0
以指示应使用系统的默认缓冲区大小。
ProxyReceiveBufferSize 2048
描述 | 用于处理某些请求的远程代理 |
---|---|
语法 | ProxyRemote 匹配 远程服务器 [用户名:密码] |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 可选的第三个参数仅在 httpd 2.4.59 及更高版本中可用。 |
这定义了此代理的远程代理。 匹配 既可以是远程服务器支持的 URL 方案的名称,也可以是远程服务器应使用该服务器的 URL 部分,也可以是 *
以指示应联系该服务器以处理所有请求。 远程服务器 是远程服务器的 URL 部分。语法
远程服务器 = 方案://主机名[:端口]
方案 实际上是用于与远程服务器通信的协议;此模块仅支持 http
和 https
。使用 https
时,请求将使用 HTTP CONNECT 方法通过远程代理转发。
ProxyRemote "http://goodguys.example.com/" "http://mirrorguys.example.com:8000" ProxyRemote "*" "http://cleverproxy.localdomain" ProxyRemote "ftp" "http://ftpproxy.mydomain:8080"
在最后一个示例中,代理将转发 FTP 请求,封装为另一个 HTTP 代理请求,转发到另一个可以处理它们的代理。
此选项还支持反向代理配置;后端 Web 服务器可以嵌入到虚拟主机 URL 空间中,即使该服务器被另一个转发代理隐藏。
可以提供可选的第三个参数 用户名:密码,它定义要传递给配置的远程代理的基本身份验证凭据。凭据将始终在不首先等待远程代理发送基本身份验证质询的情况下发送。如果使用此参数,则 Proxy-Chain-Auth 环境变量无效。
描述 | 用于处理由正则表达式匹配的请求的远程代理 |
---|---|
语法 | ProxyRemoteMatch 正则表达式 远程服务器 [用户名:密码] |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 可选的第三个参数仅在 httpd 2.4.59 及更高版本中可用。 |
ProxyRemoteMatch
与 ProxyRemote
指令相同,只是第一个参数是针对请求的 URL 的 正则表达式 匹配。
描述 | 启用转发(标准)代理请求 |
---|---|
语法 | ProxyRequests On|Off |
默认值 | ProxyRequests Off |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
这允许或阻止 Apache httpd 充当转发代理服务器。(将 ProxyRequests 设置为 Off
不会禁用 ProxyPass
指令的使用。)
在典型的反向代理或网关配置中,此选项应设置为 Off
。
为了获得代理 HTTP 或 FTP 站点的功能,您还需要在服务器中存在 mod_proxy_http
或 mod_proxy_ftp
(或两者)。
为了获得(转发)代理 HTTPS 站点的功能,您需要在服务器中启用 mod_proxy_connect
。
在您保护您的服务器之前,请勿使用 ProxyRequests
启用代理。开放代理服务器对您的网络和整个互联网都构成危险。
描述 | 设置各种代理负载均衡器或成员参数 |
---|---|
语法 | ProxySet url key=value [key=value ...] |
上下文 | 服务器配置、虚拟主机、目录 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | ProxySet 仅在 Apache HTTP Server 2.2 及更高版本中可用。 |
此指令用作设置代理负载均衡器和工作程序可用的任何参数的替代方法,这些参数通常通过 ProxyPass
指令完成。如果在 <Proxy balancer url|worker url>
容器指令中使用,则不需要 url 参数。作为副作用,相应的负载均衡器或工作程序将被创建。这在通过 RewriteRule
而不是 ProxyPass
指令进行反向代理时可能很有用。
<Proxy "balancer://hotcluster"> BalancerMember "http://www2.example.com:8080" loadfactor=1 BalancerMember "http://www3.example.com:8080" loadfactor=2 ProxySet lbmethod=bytraffic </Proxy>
<Proxy "http://backend"> ProxySet keepalive=On </Proxy>
ProxySet "balancer://foo" lbmethod=bytraffic timeout=15
ProxySet "ajp://backend:7001" timeout=15
请记住,相同的参数键可能具有不同的含义,具体取决于它是应用于负载均衡器还是工作程序,如上面关于超时的两个示例所示。
描述 | 设置传出代理连接的本地 IP 地址 |
---|---|
语法 | ProxySourceAddress 地址 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 2.3.9 及更高版本中可用 |
此指令允许设置一个特定的本地地址,以便在连接到后端服务器时绑定到该地址。
描述 | 在 mod_status 中显示代理负载均衡器状态 |
---|---|
语法 | ProxyStatus Off|On|Full |
默认值 | ProxyStatus Off |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
兼容性 | 在 2.2 及更高版本中可用 |
此指令确定是否通过 mod_status
服务器状态页面显示代理负载均衡器状态数据。
Full 与 On 同义
描述 | 代理请求的网络超时 |
---|---|
语法 | ProxyTimeout 秒 |
默认值 |
|
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
此指令允许用户在代理请求上指定超时。当您有一个缓慢/有错误的应用程序服务器挂起时,这很有用,您宁愿返回超时并优雅地失败,而不是等待服务器返回所需的时间。
描述 | 在代理请求的 Via HTTP 响应标头中提供的信息 |
---|---|
语法 | ProxyVia On|Off|Full|Block |
默认值 | ProxyVia Off |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_proxy |
此指令控制代理使用 Via:
HTTP 标头。它的预期用途是控制代理请求在一系列代理服务器中的流动。有关 Via:
标头行的说明,请参见 RFC 2616(HTTP/1.1),第 14.45 节。
Off
(这是默认设置),则不会执行任何特殊处理。如果请求或回复包含 Via:
标头,则会原样传递。On
,则每个请求和回复都将为当前主机添加一个 Via:
标头行。Full
,则每个生成的 Via:
标头行还将显示 Apache httpd 服务器版本作为 Via:
注释字段。Block
,则每个代理请求都将删除其所有 Via:
标头行。不会生成新的 Via:
标头。