On this page
Apache 模块 mod_proxy
Description: | 多协议代理/网关服务器 |
---|---|
Status: | Extension |
Module Identifier: | proxy_module |
Source File: | mod_proxy.c |
Summary
Warning
在拥有保护您的服务器之前,请勿使用ProxyRequests启用代理。开放式代理服务器对您的网络和整个 Internet 都是危险的。
mod_proxy及其相关模块为 Apache HTTP Server 实现代理/网关,支持许多流行的协议以及几种不同的负载平衡算法。第三方模块可以添加对其他协议和负载平衡算法的支持。
必须将一组模块加载到服务器中以提供必要的功能。这些模块可以在构建时静态包含,也可以通过LoadModule指令动态包含)。该集合必须包括:
mod_proxy,提供基本的代理功能
mod_proxy_balancer和一个或多个平衡器模块(如果需要负载平衡)。 (有关更多信息,请参见mod_proxy_balancer。)
一个或多个代理方案或协议模块:
Protocol | Module |
---|---|
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 |
SCGI | mod_proxy_scgi |
WS 和 WSS(Web 套接字) | mod_proxy_wstunnel |
另外,其他模块提供了扩展功能。 mod_cache和相关模块提供缓存。 mod_ssl的SSLProxy*
指令提供了使用 SSL/TLS 协议联系远程服务器的能力。这些附加模块将需要加载和配置以利用这些功能。
正向代理和反向代理/网关
可以在正向和反向代理(也称为网关)模式下配置 Apache HTTP Server。
普通转发代理是位于 Client 端和* origin 服务器*之间的中间服务器。为了从原始服务器获取内容,Client 端向代理发送请求,将原始服务器命名为目标。然后,代理从原始服务器请求内容,并将其返回给 Client 端。必须将 Client 端特别配置为使用正向代理访问其他站点。
转发代理的典型用法是向内部 Client 端提供 Internet 访问,否则内部 Client 端会受到防火墙的限制。转发代理还可以使用缓存(由mod_cache提供)来减少网络使用量。
使用ProxyRequests指令激活转发代理。因为转发代理允许 Client 端通过您的服务器访问任意站点并隐藏其真实来源,所以您必须保护您的服务器以便只有授权的 Client 端才能访问代理,然后再激活转发代理。
相反,反向代理(或网关)对 Client 端来说就像普通的 Web 服务器一样。Client 端上不需要特殊配置。Client 端向反向代理的名称空间中的内容发出普通请求。然后,反向代理决定将这些请求发送到哪里,并像返回内容本身一样返回内容。
反向代理的典型用法是为 Internet 用户提供对位于防火墙后面的服务器的访问权限。反向代理还可以用于平衡多个后端服务器之间的负载,或为较慢的后端服务器提供缓存。此外,反向代理可以简单地用于将多个服务器带入相同的 URL 空间。
使用ProxyPass指令或RewriteRule指令的[P]
标志激活反向代理。不需要ProxyRequests来配置反向代理。
Basic Examples
下面的示例只是一个非常基本的想法,可以帮助您入门。请阅读有关各个指令的文档。
另外,如果您希望启用缓存,请查阅mod_cache中的文档。
Reverse Proxy
ProxyPass "/foo" "http://foo.example.com/bar"
ProxyPassReverse "/foo" "http://foo.example.com/bar"
Forward Proxy
ProxyRequests On
ProxyVia On
<Proxy "*">
Require host internal.example.com
</Proxy>
通过处理程序访问
您还可以通过创建合适的 Handler 传递,将请求强制处理为反向代理请求。下面的示例配置将使用反向代理将对 PHP 脚本的所有请求传递到指定的 FastCGI 服务器:
反向代理 PHP 脚本
<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 和更高版本中提供了此功能。
Workers
代理在称为工作程序的对象中 Management 原始服务器的配置及其通信参数。有两个内置工作器:默认的正向代理工作器和默认的反向代理工作器。可以明确配置其他工作程序。
这两个默认工作程序具有固定的配置,如果没有其他工作程序匹配该请求,则将使用它们。他们不使用 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>
在转发模式下使用显式配置的工作程序不是很常见,因为转发代理通常与许多不同的原始服务器通信。如果经常使用原始服务器,则为某些原始服务器创建显式工作器仍然很有用。明确配置的工作人员本身没有正向或反向代理的概念。它们封装了与原始服务器通信的通用概念。每当到原始服务器的 URL 与工作服务器 URL 匹配时,由ProxyPass创建的用于反向代理的工作服务器也将用于正向代理服务器请求,反之亦然。
标识直接工作者的 URL 是其原始服务器的 URL,包括给定的所有路径组件:
ProxyPass "/examples" "http://backend.example.com/examples"
ProxyPass "/docs" "http://backend.example.com/docs"
本示例定义了两个不同的工作程序,每个工作程序都使用单独的连接池和配置。
Worker Sharing
如果工作程序 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 长度对工作程序定义进行排序。如果要最大程度地共享工作人员,请使用相反的排序 Sequences。另请参阅有关 OrderProxyPass指令的相关警告。
显式配置的工作者有两种风格:直接工作者和(负载)平衡器工作者。它们支持许多重要的配置属性,下面在ProxyPass指令中进行了描述。也可以使用ProxySet设置相同的属性。
直接工作者可用的选项集取决于原始服务器 URL 中指定的协议。可用的协议包括ajp
,fcgi
,ftp
,http
和scgi
。
平衡器 Worker 是虚拟 Worker,他们使用直接 Worker(称为其成员)来实际处理请求。每个平衡器可以有多个成员。处理请求时,它将根据配置的负载平衡算法选择一个成员。
如果平衡器工作程序的 URL 使用balancer
作为协议方案,则会创建一个平衡器工作程序。平衡器 URL 唯一标识平衡器工作程序。使用BalancerMember将成员添加到平衡器。
DNS resolution for origin domains
首次创建到原始域的套接字时,会发生 DNS 解析。启用连接重用后,每个后端域在每个子进程中仅解析一次,并为所有其他连接进行缓存,直到子级被回收为止。在计划涉及后端域的 DNS 维护任务时,应考虑此信息。另请检查ProxyPass参数以获取有关连接重用的更多详细信息。
控制对代理的访问
您可以控制谁可以通过<Proxy>控制块访问您的代理,如以下示例所示:
<Proxy "*">
Require ip 192.168.0
</Proxy>
有关访问控制指令的更多信息,请参见mod_authz_host。
如果您使用转发代理(使用ProxyRequests指令),则严格限制访问权限至关重要。否则,任何 Client 端都可以使用您的服务器访问任意主机,同时隐藏其真实身份。这对于您的网络和整个 Internet 都是危险的。使用反向代理时(将ProxyPass指令与ProxyRequests Off
一起使用),访问控制的重要性不那么严格,因为 Client 端只能联系您专门配置的主机。
另请参见 Proxy-Chain-Auth环境变量。
Slow Startup
如果您使用的是ProxyBlock指令,则会在启动过程中查找并缓存主机名的 IP 地址,以供以后进行匹配测试。这可能需要几秒钟(或更长时间),具体取决于主机名查找发生的速度。
Intranet Proxy
内联网中的 Apache httpd 代理服务器需要通过公司的防火墙转发外部请求(为此,配置ProxyRemote指令以将相应的方案转发到防火墙代理)。但是,当它必须访问 Intranet 中的资源时,可以在访问主机时绕过防火墙。 NoProxy指令对于指定哪些主机属于 Intranet 很有用,应直接访问。
内联网中的用户倾向于从其 WWW 请求中省略本地域名,从而请求使用“ http:// somehost /”而不是http://somehost.example.com/
。一些商业代理服务器允许他们摆脱这种情况,而只是为请求提供服务,这意味着已配置了本地域。当使用ProxyDomain指令且服务器为配置为代理服务时,Apache httpd 可以返回重定向响应,并将 Client 端发送到正确的标准服务器地址。这是首选方法,因为用户的书签文件将包含完全合格的主机。
Protocol Adjustments
对于mod_proxy将请求发送到未正确实现 Keepalive 或 HTTP/1.1 的原始服务器的情况,有两个environment variables可以强制请求使用不具有 keepalive 的 HTTP/1.0. 这些是通过SetEnv指令设置的。
这些是force-proxy-request-1.0
和proxy-nokeepalive
Comments。
<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的评估还不够早。
Request Bodies
一些请求方法(例如 POST)包括请求正文。 HTTP 协议要求包含正文的请求使用分块传输编码或发送Content-Length
请求 Headers。将这些请求传递到原始服务器时,mod_proxy_http将始终尝试发送Content-Length
。但是,如果主体很大,并且原始请求使用了分块编码,那么分块编码也可以在上游请求中使用。您可以使用environment variables控制此选择。设置proxy-sendcl
通过始终发送Content-Length
来确保与上游服务器的最大兼容性,而设置proxy-sendchunked
则通过使用分块编码来最大程度地减少资源使用。
在某些情况下,服务器必须将请求正文后台处理到磁盘上,以满足请求的请求正文处理。例如,如果原始正文是通过分块编码发送的(并且很大),则将发生假脱机,但是 Management 员已要求使用 Content-Length 或 HTTP/1.0 发送后端请求。如果请求正文已具有 Content-Length Headers,但服务器已配置为过滤传入的请求正文,则也可能发生假脱机。
LimitRequestBody仅适用于服务器将后台处理到磁盘的请求正文
反向代理请求 Headers
在反向代理模式下(例如,使用ProxyPass指令)时,mod_proxy_http添加了几个请求 Headers,以便将信息传递到原始服务器。这些标题是:
X-Forwarded-For
- Client 端的 IP 地址。
X-Forwarded-Host
- Client 端在
Host
HTTP 请求 Headers 中请求的原始主机。
- Client 端在
X-Forwarded-Server
- 代理服务器的主机名。
在原始服务器上使用这些 Headers 时要小心,因为如果原始请求中已经包含这些 Headers 之一,则它们将包含多个(逗号分隔)值。例如,您可以在原始服务器的日志格式字符串中使用%{X-Forwarded-For}i
来记录原始 Client 端 IP 地址,但是如果请求通过多个代理,则可能会获得多个地址。
另请参见ProxyPreserveHost和ProxyVia指令,它们控制其他请求 Headers。
注意:如果需要指定要添加到转发的请求中的自定义请求 Headers,请使用RequestHeader指令。
BalancerGrowth Directive
Description: | 配置后可以添加的其他均衡器数量 |
---|---|
Syntax: | BalancerGrowth # |
Default: | BalancerGrowth 5 |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | BalancerGrowth 仅在 Apache HTTP Server 2.3.13 和更高版本中可用。 |
除了预配置的数量外,该指令还可以增加虚拟主机可用的均衡器数量的增长潜力。仅在至少有一个预配置的 Balancer 时才生效。
BalancerInherit Directive
Description: | 从主服务器继承 ProxyPassed Balancer/Workers |
---|---|
Syntax: | BalancerInherit On|Off |
Default: | BalancerInherit On |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | BalancerInherit 仅在 Apache HTTP Server 2.4.5 和更高版本中可用。 |
此指令将导致当前服务器/虚拟主机“继承”主服务器中定义的 ProxyPass 平衡器和工作器。如果使用 Balancer Manager,这可能会导致问题和行为不一致,因此,如果使用该功能,则应将其禁用。
全局服务器中的设置定义了所有虚拟主机的默认设置。
BalancerMember Directive
Description: | 将成员添加到负载均衡组 |
---|---|
Syntax: | BalancerMember [balancerurl] url [key=value [key=value ...]] |
Context: | directory |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | BalancerMember 仅在 Apache HTTP Server 2.2 和更高版本中可用。 |
该指令将成员添加到负载平衡组。它可以在<Proxy balancer://...>
容器指令中使用,并且可以采用ProxyPass指令可用的任何键值对参数。
另外一个参数仅可用于BalancerMember
指令:loadfactor。这是成员负载系数-十进制数字,介于 1.0(默认值)和 100.0 之间,它定义了要施加到所讨论成员的加权负载。
仅当不在<Proxy balancer://...>
容器指令中时才需要 balancerurl。它对应于ProxyPass指令中定义的平衡器的 url。
任何<Proxy balancer://...>
容器指令中的平衡器 URL 的路径部分都将被忽略。
通常应从BalancerMember
的 URL 中删除斜杠。
BalancerPersist Directive
Description: | 尝试在重新启动期间持久保存 Balancer Manager 所做的更改。 |
---|---|
Syntax: | BalancerPersist On|Off |
Default: | BalancerPersist Off |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | BalancerPersist 仅在 Apache HTTP Server 2.4.4 和更高版本中可用。 |
此伪指令将导致与平衡器和平衡器成员相关联的共享内存存储在重新启动后得以保留。这样,在正常的重新启动/正常状态转换期间,这些本地更改不会丢失。
NoProxy Directive
Description: | 将直接连接的主机,域或网络 |
---|---|
Syntax: | NoProxy host [host] ... |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
该指令仅对内部网中的 Apache httpd 代理服务器有用。 NoProxy
指令指定子网,IP 地址,主机和/或域的列表,以空格分隔。与主机中的一个或多个主机匹配的请求始终直接得到响应,而不会转发到已配置的ProxyRemote代理服务器。
Example
ProxyRemote "*" "http://firewall.example.com:81"
NoProxy ".example.com" "192.168.112.0/21"
NoProxy
指令的主机参数是以下类型列表之一:
-
- 域是部分合格的 DNS 域名,后跟一个句点。它代表逻辑上属于同一 DNS 域或区域的主机列表(,即,主机名的后缀都以 Domain 结尾)。
Examples
.com .example.org.
为了区分 Domains 与Hostname s(在语法上和语义上; DNS 域也可以具有 DNS A 记录!),Domains 始终以前置句号编写。
Note
进行域名比较时不考虑大小写,并且始终假定将域名锚定在 DNS 树的根目录中。因此,将两个域.ExAmple.com
和.example.com.
(请注意尾随时间段)视为相等。由于域比较不涉及 DNS 查找,因此它比子网比较有效得多。
-
- 子网是数字(点分四边形)形式的部分合格的互联网地址,可以选择在其后跟斜杠和网络掩码,指定为子网中的有效位数。它用于表示可以通过通用网络接口访问的主机的子网。在没有显式网络掩码的情况下,假定省略(或零值)尾随数字指定掩码。 (在这种情况下,网络掩码只能是 8 位宽的倍数.)示例:
192.168
或192.168.0.0
隐含 16 个有效位的隐式网络掩码的子网 192.168.0.0(有时以
255.255.0.0
的网络掩码形式使用)192.168.112.0/21
- 子网
192.168.112.0/21
的网络掩码为 21 个有效位(也以255.255.248.0
的形式使用)
- 子网
简而言之,具有 32 个有效位的* SubNet 等效于IPAddr,而具有零有效位( eg *,0.0.0.0/0)的 SubNet 与常量_Default 相同,匹配任何 IP 地址。
-
- IPAddr 以数字(点分四边形)形式表示完全合格的 Internet 地址。通常,此地址代表一台主机,但不一定必须将 DNS 域名与该地址连接。
Example
192.168.123.7
Note
IPAddr 不需要由 DNS 系统解析,因此可以导致更有效的 Apache 性能。
Examples
prep.ai.example.edu www.example.org
Note
在许多情况下,指定IPAddr代替主机名会更有效,因为可以避免 DNS 查找。当与名称服务器的连接使用慢速 PPP 链接时,Apache httpd 中的名称解析可能会花费大量时间。
主机名比较是在不考虑大小写的情况下进行的,并且始终假定主机名锚定在 DNS 树的根中。因此,两个主机WWW.ExAmple.com
和www.example.com.
(请注意尾随周期)被视为相等。
See also
Directive
Description: | 适用于代理资源的指令的容器 |
---|---|
Syntax: | <Proxy wildcard-url> ...</Proxy> |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
放在<Proxy>
部分中的指令仅适用于匹配的代理内容。允许使用壳式通配符。
例如,以下内容将仅允许yournetwork.example.com
中的主机通过您的代理服务器访问内容:
<Proxy "*">
Require host yournetwork.example.com
</Proxy>
以下示例将在通过代理服务器发送文件时通过INCLUDES
过滤器处理example.com
foo
目录中的所有文件:
<Proxy "http://example.com/foo/*">
SetOutputFilter INCLUDES
</Proxy>
Differences from the Location configuration section
如果后端 URL 以通配符 URL 字符串开头,则它与配置节匹配,即使指令中的最后一个路径段仅与后端 URL 的前缀匹配也是如此。例如,<Proxy“ http://example.com/foo”>匹配所有 http://example.com/foo,http://example.com/foo/bar 和 http://example.com/foobar。最终 URL 的匹配与<Location>部分的行为不同,出于本说明的目的,<Location>部分的行为将最终路径部分视为以斜杠结尾。
要进一步控制匹配,请参见<ProxyMatch>
。
See also
Proxy100Continue Directive
Description: | 将 100 个 continue 的期望转发到原始服务器 |
---|---|
Syntax: | Proxy100Continue Off|On |
Default: | Proxy100Continue On |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.4.40 和更高版本中可用 |
该指令确定代理是否应将 100-continue期望:转发给原始服务器,从而让它决定何时/是否应读取 HTTP 请求正文,或者何时确定Off
代理应通过以下方式生成 100 continue中间响应:本身,然后转发请求主体。
Effectiveness
该选项仅用于mod_proxy_http处理的 HTTP 代理。
ProxyAddHeaders Directive
Description: | 在 X-Forwarded- *Headers 中添加代理信息 |
---|---|
Syntax: | ProxyAddHeaders Off|On |
Default: | ProxyAddHeaders On |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.3.10 版和更高版本中可用 |
该指令确定是否应通过 X-Forwarded-For,X-Forwarded-Host 和 X-Forwarded-Server HTTP Headers 将与代理相关的信息传递给后端服务器。
Effectiveness
该选项仅用于mod_proxy_http处理的 HTTP 代理。
ProxyBadHeader Directive
Description: | 确定如何处理响应中的错误标题行 |
---|---|
Syntax: | ProxyBadHeader IsError|Ignore|StartBody |
Default: | ProxyBadHeader IsError |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
如果ProxyBadHeader
指令从源服务器接收到语法上无效的响应头行(即不包含冒号的*,即*),则它确定mod_proxy的行为。以下参数是可能的:
IsError
- 中止该请求并以 502(错误网关)响应结束。这是默认行为。
Ignore
- 将错误的标题行视为未发送。
StartBody
- 当收到第一行错误的标题行时,请完成读取标题并将其余部分视为正文。这有助于解决有问题的后端服务器,这些服务器忘记在 Headers 和正文之间插入空行。
ProxyBlock Directive
Description: | 禁止代理的单词,主机或域 |
---|---|
Syntax: | ProxyBlock *|word|host|domain [word|host|domain] ... |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
ProxyBlock
伪指令指定单词,主机和/或域的列表,以空格分隔。对名称包含匹配的单词,主机或域的站点的 HTTP,HTTPS 和 FTP 文档请求被代理服务器“阻止”。代理模块还将尝试确定列表项的 IP 地址,这些列表项在启动期间可能是主机名,并将它们也缓存以进行匹配测试。这可能会减慢服务器的启动时间。
Example
ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"
请注意,example
也足以匹配这些网站中的任何一个。
如果 IP 地址引用了主机,主机也将匹配。
另请注意
ProxyBlock "*"
阻止与所有站点的连接。
ProxyDomain Directive
Description: | 代理请求的默认域名 |
---|---|
Syntax: | ProxyDomain Domain |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
该指令仅对内部网中的 Apache httpd 代理服务器有用。 ProxyDomain
指令指定 apache 代理服务器将属于的默认域。如果遇到对没有域名的主机的请求,将生成对附加了配置的域的同一主机的重定向响应。
Example
ProxyRemote "*" "http://firewall.example.com:81"
NoProxy ".example.com" "192.168.112.0/21"
ProxyDomain ".example.com"
ProxyErrorOverride Directive
Description: | 覆盖代理内容的错误页面 |
---|---|
Syntax: | ProxyErrorOverride On|Off |
Default: | ProxyErrorOverride Off |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
对于在最终用户看到的错误页面上具有通用外观的反向代理设置,此指令很有用。这还允许包含的文件(通过mod_include的 SSI)获取错误代码并采取相应措施。 (默认行为将显示代理服务器的错误页面.将其打开会显示 SSI 错误消息.)
该指令不影响信息性(1xx),正常成功(2xx)或重定向(3xx)响应的处理。
ProxyIOBufferSize Directive
Description: | 确定内部数据吞吐量缓冲区的大小 |
---|---|
Syntax: | ProxyIOBufferSize bytes |
Default: | ProxyIOBufferSize 8192 |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
ProxyIOBufferSize
伪指令调整内部缓冲区的大小,该缓冲区用作 Importing 和输出之间数据的暂存器。大小必须至少为512
。
在几乎每种情况下,都没有理由更改该值。
如果与 AJP 一起使用,则此伪指令设置最大 AJP 数据包大小(以字节为单位)。大于 65536 的值将设置为 65536.如果将其更改为默认值,则还必须在 Tomcat 端更改 AJP 连接器的packetSize
属性!属性packetSize
仅在 Tomcat 5.5.20+
和6.0.2+
中可用
通常,没有必要更改最大数据包大小。发送证书或证书链时,已报告默认值问题。
Directive
Description: | 适用于正则表达式匹配的代理资源的指令的容器 |
---|---|
Syntax: | <ProxyMatch regex> ...</ProxyMatch> |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
<ProxyMatch>
指令与<Proxy>指令相同,区别在于它与使用regular expressions的 URL 匹配。
从 2.4.8 开始,将捕获命名的组和反向引用,并将其以大写的前缀“ MATCH_”的相应名称写入环境。这允许从expressions和mod_rewrite之类的模块中引用 URL 的元素。为了防止混淆,已编号(未命名)的反向引用将被忽略。请改用命名组。
<ProxyMatch "^http://(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</ProxyMatch>
See also
ProxyMaxForwards Directive
Description: | 可以转发请求的最大代理数量 |
---|---|
Syntax: | ProxyMaxForwards number |
Default: | ProxyMaxForwards -1 |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 默认行为已在 2.2.7 中更改 |
ProxyMaxForwards
指令指定如果请求中没有提供Max-Forwards
Headers,则请求可以通过的最大代理数。可以设置此项以防止无限代理循环或 DoS 攻击。
Example
ProxyMaxForwards 15
请注意,设置ProxyMaxForwards
违反了 HTTP/1.1 协议(RFC2616),如果 Client 端未进行设置,则该设置将禁止代理设置Max-Forwards
。早期的 Apache httpd 版本将始终对其进行设置。负ProxyMaxForwards
值(包括默认值-1)可为您提供符合协议的行为,但可能会让您陷入循环。
ProxyPass Directive
Description: | 将远程服务器 Map 到本地服务器 URL 空间 |
---|---|
Syntax: | ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] [noquery] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.4.7 中添加了 Unix 域套接字(UDS)支持 |
该指令允许将远程服务器 Map 到本地服务器的空间。本地服务器在常规意义上不充当代理,而似乎是远程服务器的镜像。本地服务器通常称为反向代理或网关。路径是本地虚拟路径的名称; url 是远程服务器的部分 URL,不能包含查询字符串。
Note
强烈建议在 continue 进行本节之前,先回顾一下Worker的概念。
Note
<Directory>,<If>和<Files>容器不支持此指令。
Warning
使用ProxyPass
时,通常应将ProxyRequests指令设置为 off 。
在 2.4.7 及更高版本中,可以通过使用位于unix:/path/lis.sock|
前面的目标来支持使用 Unix 域套接字。例如,要代理 HTTP 并将 UDS 定位于/home/www.socket,应使用unix:/home/www.socket|http://localhost/whatever/
。
Note:
与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/"
Warning
如果第一个参数以结尾 / 结尾,则第二个参数也应以结尾 / 结尾,反之亦然。否则,对后端的最终请求可能会错过一些所需的斜杠,并且不会传递预期的结果。
!
指令在您不希望反向代理子目录(例如*)的情况下非常有用
<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
同时支持服务器和目录上下文的事实并不意味着它们在配置文件中的范围和位置将保证任何 Sequences 或覆盖。
Ordering ProxyPass Directives
按照配置 Sequences 检查已配置的ProxyPass和ProxyPassMatch规则。匹配的第一个规则获胜。因此,通常您应该首先从最长的 URL 开始对冲突的ProxyPass规则进行排序。否则,任何使用 URL 前导子串的早期规则将隐藏更长 URL 的以后规则。请注意,与 Worker 共享有一些关系。
Exclusions and the no-proxy environment variable
ProxyPass key=value
参数
在 Apache HTTP Server 2.1 和更高版本中,mod_proxy 支持与后端服务器的池化连接。可将按需创建的连接保留在池中以备将来使用。池大小和其他设置的限制可以使用key=value
参数在ProxyPass
伪指令中编码,如下表所述。
Maximum connections to the backend
默认情况下,mod_proxy 将允许并保留该 Web 服务器子进程可以同时使用的最大连接数。使用max
参数可以减少默认值。每个 Web 服务器子进程都维护连接池,并且max
和其他设置未在所有子进程之间协调,除非配置或 MPM 设计仅允许一个子进程。
使用ttl
参数设置可选的生存时间;至少ttl
秒未使用的连接将被关闭。 ttl
可用于避免使用由于后端服务器的保持活动超时而被关闭的连接。
Example
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
Worker|BalancerMember parameters |
---|
Parameter | Default | Description | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
min | 0 | 连接池条目的最小数量,与实际的连接数量无关。仅在特殊情况下需要对此默认值进行修改,在特殊情况下,应预先分配或保留与后端连接关联的堆内存。 | ||||||||||||||
max | 1...n | 后端服务器允许的最大连接数。此限制的默认值为活动 MPM 中每个进程的线程数。在 Prefork MPM 中,该值始终为 1,而对于其他 MPM,则由ThreadsPerChild 指令控制。 |
||||||||||||||
smax | max | 如果未使用的连接池条目的使用时间超过生存时间(受ttl 参数控制),则在某些操作期间将释放超过此限制的保留连接池条目。如果连接池条目具有关联的连接,它将被关闭。仅在特殊情况下才需要将其修改为默认值,在特殊情况下,需要更积极地释放或关闭超过生存时间的连接池条目和任何关联的连接。 |
||||||||||||||
acquire | - | 如果设置,这将是 await 连接池中空闲连接的最长时间,以毫秒为单位。如果池中没有可用的连接,则 Apache httpd 将向 Client 端返回SERVER_BUSY 状态。 |
||||||||||||||
connectiontimeout | timeout | 连接超时(以秒为单位)。 Apache httpd await 与后端的连接创建完成的秒数。通过添加 ms 的后缀,还可以以毫秒为单位设置超时。 | ||||||||||||||
disablereuse | Off | 如果要在使用后强制 mod_proxy 立即关闭与后端的连接,从而禁用该后端的持久连接和池,则应使用此参数。这在各种情况下有帮助,在这种情况下,Apache httpd 和后端服务器之间的防火墙(无论协议如何)倾向于无声地丢弃连接,或者后端本身可能处于循环 DNS 下。启用连接重用后,每个子域仅对每个后端进程解析一次(使用 DNS 查询),并为所有进一步的连接进行缓存,直到子级被回收为止。要禁用连接重用,请将此属性值设置为On 。 |
||||||||||||||
enablereuse | On | 这与上面的“ disablereuse”相反,它为需要选择加入连接重用(例如mod_proxy_fcgi)的方案处理程序提供了便利。仅 2.4.11 及更高版本。 | ||||||||||||||
flushpackets | off | 确定在每个“大块”数据之后,代理模块是否将自动刷新输出旅。 “ off”表示仅在需要时才冲洗; “开”表示在发送每个块之后; “自动”表示轮询/await 一段时间,如果“ flushwait”毫秒未收到任何 Importing,则刷新。当前,这仅对 mod_proxy_ajp 和 mod_proxy_fcgi 有效。 | ||||||||||||||
flushwait | 10 | 如果“ flushpackets”为“ auto”,则在刷新输出旅之前 await 额外 Importing 的时间(以毫秒为单位)。 | ||||||||||||||
iobuffersize | 8192 | 调整内部暂存器 IO 缓冲区的大小。这使您可以覆盖特定工作人员的ProxyIOBufferSize 。对于系统默认值 8192,此值必须至少为 512 或设置为 0. |
||||||||||||||
responsefieldsize | 8192 | 调整代理响应字段缓冲区的大小。缓冲区大小应至少为代理响应中最大预期报头大小的大小。将该值设置为 0 将使用系统默认值 8192 字节。<_ 606>在 Apache HTTP Server 2.4.34 和更高版本中可用。 | ||||||||||||||
keepalive | Off | 当您的 Apache httpd 和后端服务器之间有防火墙时,通常会丢弃不活动的连接,请使用此参数。此标志将告诉 os 在不活动的连接上发送KEEP_ALIVE 消息,从而防止防火墙断开连接。要启用 keepalive,请将此属性值设置为On 。<_ 609>初始和后续 TCP keepalive 探测的频率取决于全局 OS 设置,并且可能高达 2 小时。为了有用,os 中配置的频率必须小于防火墙使用的阈值。 |
||||||||||||||
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 后端,此属性无效)。在这两种情况下,该参数都是 await 答复的延迟(以秒为单位)。已添加此功能以避免后端挂起和繁忙的问题。这将在正常操作期间增加网络流量,这可能是一个问题,但是在某些群集节点出现故障或繁忙的情况下,它将降低流量。通过添加 ms 的后缀,也可以以毫秒为单位设置延迟。 |
||||||||||||||
receivebuffersize | 0 | 调整代理连接的显式(TCP/IP)网络缓冲区大小。这使您可以覆盖特定工作人员的ProxyReceiveBufferSize 。对于系统默认值,该值必须至少为 512 或设置为 0. |
||||||||||||||
redirect | - | 工作者的重定向路由。通常动态设置此值以启用从群集中安全删除节点的功能。如果设置,则所有没有会话 ID 的请求都将重定向到路由参数等于此值的 BalancerMember。 | ||||||||||||||
retry | 60 | 连接池工作者重试超时(以秒为单位)。如果到后端服务器的连接池工作程序处于错误状态,则在超时到期之前,Apache httpd 不会将任何请求转发到该服务器。这样可以关闭后端服务器以进行维护,并在以后使其重新联机。值 0 表示始终在没有超时的错误状态下重试工作线程。 | ||||||||||||||
route | - | 在负载平衡器内部使用时的工作人员 Route。路由是附加到会话 ID 的值。 | ||||||||||||||
status | - | 单个字母值,定义此工作人员的初始状态。 <_ 619> | D:工作者被禁用,将不接受任何请求。 | <_ 620> | S:Worker 在 Management 上被停止。 | <_ 621> | I:工作者处于忽略错误模式,将始终被视为可用。 | <_ 622> | R:Worker 很热。对于给定磅重中无法使用的每个 Worker(排水,停止,错误等),将使用具有相同磅重的可用热备用。热备用可以帮助确保平衡器始终可以使用特定数量的 Worker。 | <_ 623> | H:Worker 处于热待机模式,并且仅在平衡器集中没有其他可行的 Worker 或备件时才使用。 | <_ 624> | E:Worker 处于错误状态。 | <_ 625> | N:Worker 处于耗尽模式,将仅接受发往其自身的现有粘性会话,而忽略所有其他请求。 | <_ 626>可以通过在前面加上''来设置状态(默认状态),也可以在前面加上'-'来清除状态。因此,设置为“ S-E”会将此工作程序设置为“已停止”并清除错误标记。 |
timeout | ProxyTimeout | 连接超时(以秒为单位)。 Apache httpd await/发送到后端的数据的秒数。 | ||||||||||||||
ttl | - | 非活动连接和关联的连接池条目的生存时间(以秒为单位)。一旦达到此限制,将不再使用连接。它将在以后关闭。 | ||||||||||||||
flusher | flush | mod_proxy_fdpass使用的提供者的名称。有关更多详细信息,请参见此模块的文档。 | ||||||||||||||
secret | - | mod_proxy_ajp使用的 Secret 值。它必须与在 AJP 连接的服务器端配置的密码相同。<_ 633>在 Apache HTTP Server 2.4.42 和更高版本中可用。 | ||||||||||||||
upgrade | WebSocket | mod_proxy_wstunnel接受了升级头中的协议。有关更多详细信息,请参见此模块的文档。 |
如果 Proxy 指令方案以balancer://
开头(例如balancer://cluster
,则忽略任何路径信息),那么将创建一个实际上不与后端服务器通信的虚拟工作程序。相反,它负责 Management 多个“实际”Worker。在这种情况下,可以将特殊的参数集添加到该虚拟工作程序。有关平衡器如何工作的更多信息,请参见mod_proxy_balancer。
Balancer parameters |
---|
Parameter | Default | Description | |
---|---|---|---|
lbmethod | byrequests | 平衡器负载平衡方法。选择要使用的负载平衡调度程序方法。 byrequests ,执行加权请求计数; bytraffic ,执行加权流量字节计数平衡;或bybusyness ,以执行待处理的请求平衡。默认值为byrequests 。 |
|
maxattempts | 少于 Worker 人数一个,或一个 Worker 少于一个。 | 放弃之前的最大故障转移尝试次数。 | |
nofailover | Off | 如果设置为On ,则当工作程序处于错误状态或被禁用时,会话将中断。如果后端服务器不支持会话复制,则将此值设置为On 。 |
|
stickysession | - | 平衡器粘性会话名称。该值通常设置为JSESSIONID 或PHPSESSIONID 之类的值,并且取决于支持会话的后端应用程序服务器。如果后端应用程序服务器对 Cookie 和 URL 编码的 ID 使用不同的名称(例如 Servlet 容器),请使用 |
分开他们。第一部分是 cookie,第二部分是路径。<_ 648>在 Apache HTTP Server 2.4.4 和更高版本中可用。 |
stickysessionsep | "." | 在会话 cookie 中设置分隔符号。某些后端应用程序服务器不使用“。”作为符号。例如,Oracle Weblogic 服务器使用“!”。可以使用此选项设置正确的符号。设置为“关”表示不使用任何符号。 | |
scolonpathdelim | Off | 如果设置为On ,则分号字符“;”将用作附加的粘性会话路径定界符/分隔符。主要用于模拟处理诸如JSESSIONID=6736bcf34;foo=aabfa 之类的路径时 mod_jk 的行为 |
|
timeout | 0 | 平衡器超时(以秒为单位)。如果设置,这将是 await 自由工作者的最长时间。默认为不 await。 | |
failonstatus | - | 单个或逗号分隔的 HTTP 状态代码列表。如果设置,则当后端返回列表中的任何状态代码时,这将强制工作器进入错误状态。工作者恢复的行为与其他工作者错误相同。 | |
failontimeout | Off | 如果设置,在将请求发送到后端后,IO 读取超时将强制工作器进入错误状态。辅助恢复的行为与其他辅助错误相同。<_ 651>在 Apache HTTP Server 2.4.5 和更高版本中可用。 | |
nonce | <auto> | balancer-manager 应用程序页面中使用的保护性随机数。默认设置是使用自动确定的基于 UUID 的随机数,以提供对该页面的进一步保护。如果设置,则现时设置为该值。设置None 将禁用所有随机数检查。 <_ 654 >> [655] <_ 656 >> <_ 657 >> <_ 658 >>除了随机数,还应通过 ACL 保护balancer-manager 页面。<_ 660 >> <_ 661 >> |
|
growth | 0 | 除了在配置中定义的平衡器之外,还可以添加到此平衡器的其他 BalancerMember 数量。 | |
forcerecovery | On | 如果平衡器的所有 Worker 都处于错误状态,则在不考虑 Worker 的重试参数的情况下强制所有 Worker 立即恢复。如果在不考虑每个工作人员的重试参数的情况下强制执行所有工作人员的恢复,则在某些情况下,已经过载的后端可能会陷入更深的麻烦。在这种情况下,请设置为Off 。<_ 663>在 Apache HTTP Server 2.4.2 和更高版本中可用。 |
sample 平衡器设置:
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>
配置热备用可以帮助确保每个负载均衡器集始终有一定数量的 Worker 可供使用:
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 的攻击的常规有限保护。
通常,在生成 SCRIPT_FILENAME 环境变量时,mod_proxy 将包含查询字符串。可选的 noquery 关键字(在 httpd 2.4.1 和更高版本中可用)可防止此情况。
可选的 interpolate 关键字与ProxyPassInterpolateEnv结合使用,使 ProxyPass 使用语法${VARNAME}对环境变量进行插值。请注意,插值发生时,许多标准的 CGI 派生环境变量将不存在,因此对于复杂的规则,您可能仍必须求助于mod_rewrite。还要注意,URL 的方案/主机名/端口部分仅支持在解析指令时可用的变量(例如Define)内插。可以使用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/"
ProxyPassInherit Directive
Description: | 继承从主服务器定义的 ProxyPass 指令 |
---|---|
Syntax: | ProxyPassInherit On|Off |
Default: | ProxyPassInherit On |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | ProxyPassInherit 仅在 Apache HTTP Server 2.4.5 和更高版本中可用。 |
该指令将导致当前服务器/虚拟主机“继承”主服务器中定义的ProxyPass指令。如果使用 Balancer Manager 进行动态更改,则可能导致问题和行为不一致,因此,如果使用该功能,则应禁用它。
全局服务器中的设置定义了所有虚拟主机的默认设置。
禁用 ProxyPassInherit 也将禁用BalancerInherit。
ProxyPassInterpolateEnv Directive
Description: | 在反向代理配置中启用环境变量插值 |
---|---|
Syntax: | ProxyPassInterpolateEnv On|Off |
Default: | ProxyPassInterpolateEnv Off |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 httpd 2.2.9 和更高版本中可用 |
该指令与ProxyPass
,ProxyPassReverse
,ProxyPassReverseCookieDomain
和ProxyPassReverseCookiePath
的插值参数一起使用,可以使用可由其他模块(例如mod_rewrite)设置的环境变量来动态配置反向代理。如果设置了 interpolate 选项,它将影响ProxyPass
,ProxyPassReverse
,ProxyPassReverseCookieDomain
和ProxyPassReverseCookiePath
伪指令,并使它们用环境变量varname
的值替换配置伪指令中的字符串${varname}
。
ProxyPass
的 scheme/hostname/port 部分可以包含变量,但是仅当解析指令(例如,使用Define)时可用的变量。对于所有其他用例,请考虑改为使用mod_rewrite。
Performance warning
除非需要,请将其关闭!例如,将变量添加到ProxyPass
可能会导致使用配置的默认 mod_proxy 的 worker(不允许进行任何细微的调整,例如连接重用等)。
ProxyPassMatch Directive
Description: | 使用正则表达式将远程服务器 Map 到本地服务器 URL 空间 |
---|---|
Syntax: | ProxyPassMatch [regex] !|url [key=value [key=value ...]] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
该指令等效于ProxyPass,但使用正则表达式而不是简单的前缀匹配。提供的正则表达式与 url 匹配,如果匹配,则服务器会将所有带括号的匹配替换为给定的字符串,并将其用作新的 url。
Note:
该指令不能在<Directory>
上下文中使用。
假设本地服务器的地址为http://example.com/
;然后
ProxyPassMatch "^/(.*\.gif)$" "http://backend.example.com/$1"
将导致对http://example.com/foo/bar.gif
的本地请求在内部转换为对http://backend.example.com/foo/bar.gif
的代理请求。
Note
URL 参数必须可解析为正则表达式替换之前(以及之后)的 URL。这限制了您可以使用的匹配项。例如,如果我们曾经使用
ProxyPassMatch "^(/.*\.gif)$" "http://backend.example.com:8000$1"
在我们之前的示例中,它将在服务器启动时失败,并出现语法错误。这是一个错误(ASF bugzilla 中为 PR 46665),解决方法是重新构建匹配项:
ProxyPassMatch "^/(.*\.gif)$" "http://backend.example.com:8000/$1"
!
伪指令在您不想反向代理子目录的情况下很有用。
在<LocationMatch>部分中使用时,将省略第一个参数,并从<LocationMatch>获得正则表达式。
如果您需要更灵活的反向代理配置,请参阅带有[P]
标志的RewriteRule指令。
Default Substitution
当 URL 参数在正则表达式中不使用任何反向引用时,原始 URL 将附加到 URL 参数中。
Security Warning
在构造规则的目标 URL 时,请小心考虑允许 Client 端影响服务器将用作代理的 URL 集合对安全性的影响。确保 URL 的方案和主机名部分是固定的,或者不允许 Client 端产生不适当的影响。
ProxyPassReverse Directive
Description: | 调整从反向代理服务器发送的 HTTP 响应 Headers 中的 URL |
---|---|
Syntax: | ProxyPassReverse [path] url [interpolate] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
该指令使 Apache httpd 可以调整 HTTP 重定向响应中Location
,Content-Location
和URI
Headers 中的 URL。当 Apache httpd 用作反向代理(或网关)以避免由于反向服务器上的 HTTP 重定向位于反向代理后面而导致绕过反向代理时,这是必不可少的。
仅上面特别提到的 HTTP 响应 Headers 将被重写。 Apache httpd 不会重写其他响应 Headers,默认情况下也不会重写 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/quux
时服务器backend.example.com
发送的重定向。在将 HTTP 重定向响应转发到 Client 端之前,Apache httpd 将其调整为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>部分不支持此指令。
ProxyPassReverseCookieDomain Directive
Description: | 调整来自反向代理服务器的 Set-Cookie Headers 中的域字符串 |
---|---|
Syntax: | ProxyPassReverseCookieDomain internal-domain public-domain [interpolate] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
用法基本上类似于ProxyPassReverse,但不是重写 URL 头,而是重写Set-Cookie
头中的domain
字符串。
ProxyPassReverseCookiePath Directive
Description: | 调整来自反向代理服务器的 Set-Cookie Headers 中的 Path 字符串 |
---|---|
Syntax: | ProxyPassReverseCookiePath internal-path public-path [interpolate] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
在后端 URL 路径 Map 到反向代理上的公共路径的情况下,与ProxyPassReverse结合使用时非常有用。该指令将Set-Cookie
Headers 中的path
字符串重写。如果 Cookie 路径的开头与内部路径匹配,则 Cookie 路径将替换为 public-path。
在ProxyPassReverse给出的示例中,指令:
ProxyPassReverseCookiePath "/" "/mirror/foo/"
会将后端路径为/
(或/example
或实际上为任何东西)的 cookie 重写为/mirror/foo/
。
ProxyPreserveHost Directive
Description: | 使用传入的主机 HTTP 请求 Headers 进行代理请求 |
---|---|
Syntax: | ProxyPreserveHost On|Off |
Default: | ProxyPreserveHost Off |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.3.3 及更高版本中的目录上下文中可用。 |
启用后,此选项会将 Host:行从传入请求传递到代理主机,而不是在ProxyPass行中指定的主机名。
通常应将此选项设置为Off
。它在特殊的配置(例如基于质量的代理虚拟主机)中非常有用,其中原始 Host Headers 需要后端服务器评估。
ProxyReceiveBufferSize Directive
Description: | 代理 HTTP 和 FTP 连接的网络缓冲区大小 |
---|---|
Syntax: | ProxyReceiveBufferSize bytes |
Default: | ProxyReceiveBufferSize 0 |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
ProxyReceiveBufferSize
指令为代理的 HTTP 和 FTP 连接指定显式(TCP/IP)网络缓冲区大小,以提高吞吐量。它必须大于512
或设置为0
,以指示应使用系统的默认缓冲区大小。
Example
ProxyReceiveBufferSize 2048
ProxyRemote Directive
Description: | 用于处理某些请求的远程代理 |
---|---|
Syntax: | ProxyRemote match remote-server |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
这定义了此代理的远程代理。 match 是远程服务器支持的 URL 方案的名称,或者是应使用远程服务器的部分 URL,或者*
表示应为所有请求联系该服务器。 remote-server 是远程服务器的部分 URL。句法:
remote-server = scheme://hostname[:port]
方案实际上是应该用于与远程服务器通信的协议;此模块仅支持http
和https
。使用https
时,将使用 HTTP CONNECT 方法通过远程代理转发请求。
Example
ProxyRemote "http://goodguys.example.com/" "http://mirrorguys.example.com:8000"
ProxyRemote "*" "http://cleverproxy.localdomain"
ProxyRemote "ftp" "http://ftpproxy.mydomain:8080"
在最后一个示例中,代理将转发封装为另一个 HTTP 代理请求的 FTP 请求到另一个可以处理它们的代理。
此选项还支持反向代理配置。可以将后端 Web 服务器嵌入到虚拟主机 URL 空间中,即使该服务器被另一个正向代理隐藏了。
ProxyRemoteMatch Directive
Description: | 用于处理正则表达式匹配的请求的远程代理 |
---|---|
Syntax: | ProxyRemoteMatch regex remote-server |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
ProxyRemoteMatch
与ProxyRemote指令相同,除了第一个参数是与所请求 URL 的regular expression匹配。
ProxyRequests Directive
Description: | 启用转发(标准)代理请求 |
---|---|
Syntax: | ProxyRequests On|Off |
Default: | ProxyRequests Off |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
这允许或阻止 Apache httpd 充当正向代理服务器。 (将 ProxyRequests 设置为Off
不会禁用ProxyPass指令的使用。)
在典型的反向代理或网关配置中,此选项应设置为Off
。
为了获得代理 HTTP 或 FTP 站点的功能,服务器中还需要存在mod_proxy_http或mod_proxy_ftp(或两者都有)。
为了获得(转发)代理 HTTPS 站点的功能,您需要在服务器中启用mod_proxy_connect。
Warning
在拥有保护您的服务器之前,请勿使用ProxyRequests启用代理。开放式代理服务器对您的网络和整个 Internet 都是危险的。
See also
ProxySet Directive
Description: | 设置各种代理平衡器或成员参数 |
---|---|
Syntax: | ProxySet url key=value [key=value ...] |
Context: | 服务器配置,虚拟主机,目录 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | ProxySet 仅在 Apache HTTP Server 2.2 和更高版本中可用。 |
此伪指令用作设置通常可通过ProxyPass伪指令完成的代理平衡器和工作者可用参数的替代方法。如果在<Proxy balancer url|worker url>
容器指令中使用,则不需要 url 参数。作为副作用,创建了各个平衡器或 Worker。通过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
Warning
请记住,相同的参数键可能会具有不同的含义,具体取决于将其应用于平衡器还是 Worker,如上面有关超时的两个示例所示。
ProxySourceAddress Directive
Description: | 设置传出代理连接的本地 IP 地址 |
---|---|
Syntax: | ProxySourceAddress address |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.3.9 版和更高版本中可用 |
此指令允许设置连接到后端服务器时要绑定的特定本地地址。
ProxyStatus Directive
Description: | 在 mod_status 中显示代理 LoadBalancer 状态 |
---|---|
Syntax: | ProxyStatus Off|On|Full |
Default: | ProxyStatus Off |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
Compatibility: | 在 2.2 版和更高版本中可用 |
该指令确定是否通过mod_status server-status 页面显示代理负载均衡器状态数据。
Note
全 与 开 同义
ProxyTimeout Directive
Description: | 代理请求的网络超时 |
---|---|
Syntax: | ProxyTimeout seconds |
Default: | 值Timeout |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
该指令允许用户指定代理请求的超时时间。当您的应用服务器慢速/挂起时,这很有用,您宁愿返回超时并优雅地失败,而不是 await 服务器返回所需的时间。
ProxyVia Directive
Description: | Via HTTP 响应 Headers 中提供的有关代理请求的信息 |
---|---|
Syntax: | ProxyVia On|Off|Full|Block |
Default: | ProxyVia Off |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_proxy |
此伪指令控制代理对Via:
HTTP Headers 的使用。它的预期用途是控制沿着代理服务器链的代理请求的流。有关Via:
Headers 行的说明,请参见RFC 2616(HTTP/1.1),第 14.45 节。
如果设置为默认值
Off
,则不执行任何特殊处理。如果请求或答复包含Via:
Headers,则会原样传递。如果设置为
On
,则每个请求和回复都将为当前主机添加Via:
标题行。如果设置为
Full
,则每个生成的Via:
Headers 行还将具有显示为Via:
Comments 字段的 Apache httpd 服务器版本。如果设置为
Block
,则每个代理请求都将删除其所有Via:
Headers 行。不会生成新的Via:
Headers。