mod_proxy
描述: | Multi-protocol proxy/gateway 服务器 |
状态: | 延期 |
模块标识符: | proxy_module |
源文件: | mod_proxy.c |
摘要
警告
在有保护你的服务器之前,不要使用将 ProxyRequests启用代理。开放代理服务器对您的网络和整个 Internet 都是危险的。
mod_proxy和相关模块为 Apache HTTP Server 实现 proxy/gateway,支持许多流行的协议以及几种不同的负载平衡算法。 Third-party 模块可以添加对其他协议和负载平衡算法的支持。
必须将一组模块加载到服务器中以提供必要的 features。这些模块可以静态包含在 build time 中,也可以通过LoadModule指令动态包含在内。该套装必须包括:
- mod_proxy,提供基本的代理功能
- 如果需要负载平衡,则mod_proxy_balancer和一个或多个平衡器模块。(更多 information.)见mod_proxy_balancer
- 一个或多个代理 scheme 或协议模块:
协议 | 模 |
AJP13(Apache JServe Protocol version 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-sockets) | mod_proxy_wstunnel |
此外,扩展的 features 由其他模块提供。缓存由mod_cache和相关模块提供。使用 SSL/TLS 协议联系 remote 服务器的能力由mod_ssl的SSLProxy*
指令提供。需要加载和配置这些附加模块以利用这些 features。
前进代理和反向 Proxies/Gateways
Apache HTTP Server 可以在正向和反向代理(也称为网关)模式下配置。
普通转发代理是位于 client 和源服务器之间的中间服务器。在 order 中从原始服务器获取内容时,client 向代理发送请求,将源服务器命名为目标。然后,代理从源服务器请求内容并将其返回给 client。必须专门配置 client 才能使用转发代理访问其他站点。
转发代理的典型用法是为内部客户端提供 Internet 访问,否则这些客户端受防火墙限制。转发代理还可以使用缓存(由mod_cache提供)来减少网络使用。
使用将 ProxyRequests指令激活转发代理。由于转发代理允许客户端通过您的服务器访问任意站点并隐藏其 true 源,因此您必须保护您的服务器以便只有授权的客户端才能在激活转发代理之前访问代理。
相比之下,反向代理(或网关)在 client 中就像普通的 web 服务器一样。 client 上没有特殊的 configuration 是必需的。 client 对反向代理的命名空间中的内容进行普通请求。然后,反向代理决定将这些请求发送到何处,并返回内容,就好像它本身就是原点一样。
反向代理的典型用法是为 Internet 用户提供对防火墙后面的服务器的访问。反向代理也可用于平衡多个 back-end 服务器之间的负载或为较慢的 back-end 服务器提供缓存。此外,反向代理可以简单地用于将多个服务器引入相同的 URL 空间。
使用ProxyPass指令或[P]
flag 激活反向代理到重写规则指令。在 order 中打开将 ProxyRequests以配置反向代理是不必要的。
基本例子
以下示例仅是帮助您入门的非常基本的 idea。请阅读有关各个指令的文档。
此外,如果您希望启用缓存,请参阅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>
通过处理程序访问
您还可以通过创建合适的 Handler pass-through 来强制将请求作为 reverse-proxy 请求处理。下面的 example configuration 将使用反向代理将所有 PHP 脚本请求传递给指定的 FastCGI 服务器:
反向代理 PHP 脚本
<FilesMatch ".php$"> # Unix sockets require 2.4.7 or later SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/" </FilesMatch>
此 feature 可在 Apache HTTP Server 2.4.10 及更高版本中使用。
工作人员
代理在名为 workers 的 objects 中管理原始服务器的 configuration 及其通信参数。有两个 built-in workers:默认的正向代理 worker 和默认的反向代理 worker。可以显式配置其他 workers。
这两个默认的 workers 具有固定的 configuration,如果没有其他 worker 匹配请求,将使用它。它们不使用 HTTP Keep-Alive 或连接重用。而是为每个请求打开和关闭到源服务器的 TCP 连接。
明确配置的 workers 由其 URL 标识。当用于反向代理时,通常使用ProxyPass或ProxyPassMatch创建和配置它们:
ProxyPass "/example" "http://backend.example.com" connectiontimeout=5 timeout=30
这将创建一个与原始服务器 URL http://backend.example.com
关联的 worker,它将使用给定的超时值。在转发代理中使用时,workers 通常通过ProxySet指令定义:
ProxySet "http://backend.example.com" connectiontimeout=5 timeout=30
或者使用代理和ProxySet:
<Proxy "http://backend.example.com"> ProxySet connectiontimeout=5 timeout=30 </Proxy>
在转发模式下使用显式配置的 workers 并不是非常常见的,因为转发代理通常与许多不同的源服务器通信。如果经常使用某些原始服务器,为某些原始服务器创建显式 workers 仍然很有用。明确配置的 workers 本身没有正向或反向代理的概念。它们封装了与原始服务器通信的 common 概念。每当原始服务器的 URL 与 worker URL 匹配时,ProxyPass创建的用于反向代理的 worker 也将用于转发代理请求,反之亦然。
标识直接 worker 的 URL 是其原始服务器的 URL,包括给定的任何路径组件:
ProxyPass "/examples" "http://backend.example.com/examples" ProxyPass "/docs" "http://backend.example.com/docs"
此 example 定义了两个不同的 workers,每个 workers 都使用单独的连接池和 configuration。
Worker Sharing
如果 worker URL 重叠,则会发生 Worker 共享,这发生在某些 worker 的 URL 是 configuration 文件中稍后定义的另一个 worker 的 URL 的前导子字符串时。在下面的例子中
ProxyPass "/apps" "http://backend.example.com/" timeout=60 ProxyPass "/examples" "http://backend.example.com/examples" timeout=10
第二个 worker 实际上并没有创建。而是使用第一个 worker。好处是,只有一个连接池,因此连接更经常被重用。请注意,将忽略为后面的 worker 明确指定的所有 configuration 属性。这将被记录为警告。在上面的例子中,URL /examples
的结果超时值将是60
而不是10
!
如果要避免 worker 共享,请按 URL 长度对 worker 定义进行排序,从最长的 worker URL 开始。如果要最大化 worker 共享,请使用 reverse sort order。另请参阅有关 ordering ProxyPass指令的相关警告。
明确配置的 workers 有两种形式:direct workers 和(load)balancer workers。它们支持许多重要的 configuration 属性,这些属性将在ProxyPass指令中描述。也可以使用ProxySet设置相同的属性。
可用于直接 worker 的选项集取决于在源服务器 URL 中指定的协议。可用的协议包括ajp
,fcgi
,ftp
,http
和scgi
。
Balancer workers 是虚拟的 workers,它们使用直接 workers 作为其成员来实际处理请求。每个平衡器可以有多个成员。处理请求时,会根据配置的负载均衡算法选择成员。
如果 worker URL 使用balancer
作为协议 scheme,则会创建一个平衡器 worker。平衡器 URL 唯一标识平衡器 worker。使用BalancerMember将成员添加到平衡器。
原始域的 DNS 解析
当为第一个 time 创建到原始域的 socket 时,会发生 DNS 解析。启用连接重用后,每个子进程只解析一个后端域,并为所有进一步的连接缓存,直到子进程被回收。在规划涉及后端域的 DNS 维护任务时,应考虑此信息。还请检查ProxyPass参数以获取有关连接重用的更多详细信息。
控制对代理的访问
您可以通过<Proxy>控制块控制谁可以访问您的代理,如下例所示:
<Proxy "*"> Require ip 192.168.0 </Proxy>
有关访问控制指令的更多信息,请参阅mod_authz_host。
如果使用正向代理(使用将 ProxyRequests指令),则严格限制访问是必不可少的。否则,任何 client 都可以使用您的服务器访问任意主机,同时隐藏其 true 标识。这对您的网络和整个 Internet 都很危险。使用反向代理(使用带ProxyRequests Off
的ProxyPass指令)时,访问控制不太重要,因为 clients 只能联系您专门配置的主机。
另请参见Proxy-Chain-Auth环境变量。
慢启动
如果您正在使用ProxyBlock指令,则会在启动期间查找并缓存主机名的 IP 地址,以便以后进行 match 测试。这可能需要几秒钟(或更长时间),具体取决于主机名查找的速度。
内联网代理
位于 Intranet 中的 Apache httpd 代理服务器需要通过公司的防火墙转发外部请求(为此,配置ProxyRemote指令以将相应的 scheme 转发到防火墙代理)。但是,当它必须访问 Intranet 中的资源时,它可以在访问主机时绕过防火墙。NOPROXY指令对于指定哪些主机属于 Intranet 并且应该直接访问非常有用。
Intranet 中的用户倾向于从其 WWW 请求中省略本地域 name,因此请求“http://somehost/”而不是http://somehost.example.com/
。一些商业代理服务器让他们逃脱这一点,只是提供请求,暗示配置的本地域。当使用proxyDomain 行指令且服务器是配置为代理服务时,Apache httpd 可以 return 重定向响应并将 client 发送到正确的完全限定的服务器地址。这是首选方法,因为用户的书签 files 将包含完全限定的主机。
协议调整
对于mod_proxy正在向未正确实现 keepalive 或 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 标头,但服务器配置为过滤传入的请求正文,也会发生此假脱机。
LimitRequestBody仅适用于服务器将假脱机到磁盘的请求主体
反向代理请求 Headers
当以 reverse-proxy 模式运行时(使用ProxyPass指令,对于 example),mod_proxy_http在 order 中添加了几个请求_header 以将信息传递给源服务器。这些 headers 是:
X-Forwarded-For
client 的 IP 地址。X-Forwarded-Host
Host HTTP 请求标头中 client 请求的原始 host。X-Forwarded-Server
代理服务器的主机名。
在原始服务器上使用这些 headers 时要小心,因为如果原始请求已经包含其中一个_header,它们将包含多个(comma-separated)value。例如,您可以在原始服务器的 log 格式 string 中使用%{X-Forwarded-For}i
来 log 原始客户端 IP 地址,但如果请求通过多个代理,您可能会获得多个地址。
另请参阅ProxyPreserveHost和ProxyVia指令,它们控制其他请求 headers。
注意:如果需要指定要添加到转发请求的自定义请求_header,请使用RequestHeader指令。
BalancerGrowth 指令
描述: | 可添加的其他平衡器数量 Post-configuration |
句法: | BalancerGrowth # |
默认: | BalancerGrowth 5 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | BalancerGrowth 仅在 Apache HTTP Server 2.3.13 及更高版本中可用。 |
除了数字 pre-configured 之外,该指令还允许虚拟主机可用的平衡器数量增长。只有至少有一个 pre-configured 平衡器才会生效。
BalancerInherit 指令
描述: | 从主服务器继承 ProxyPassed Balancers/Workers |
句法: | BalancerInherit On\|Off |
默认: | BalancerInherit On |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | BalancerInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。 |
该指令将导致当前 server/vhost“继承”主服务器中定义的 ProxyPass Balancers 和 Workers。如果使用 Balancer Manager,这可能会导致问题和不一致的行为,因此如果使用该 feature 则应禁用。
global 服务器中的设置定义了所有 vhost 的默认设置。
BalancerMember 指令
描述: | 将成员添加到负载平衡 group |
句法: | BalancerMember[balancerurl] url[key=value[key=value ...]] |
Context: | 目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | BalancerMember 仅在 Apache HTTP Server 2.2 及更高版本中可用。 |
该指令将成员添加到负载平衡 group。它可以在<Proxy balancer://...>
容器指令中使用,并且可以使用ProxyPass指令可用的任何 key value 对参数。
另一个参数仅适用于BalancerMember
指令:loadfactor。这是成员加载因子- 1.0(默认值)和 100.0 之间的 decimal 数,它定义了要应用于相关成员的加权加载。
仅当不在<Proxy balancer://...>
容器指令内时才需要 balancerurl。它对应于ProxyPass指令中定义的平衡器的 url。
任何<Proxy balancer://...>
容器指令中的平衡器 URL 的路径 component 都将被忽略。
通常应从BalancerMember
的 URL 中删除尾部斜杠。
BalancerPersist 指令
描述: | 尝试在重新启动时保持 Balancer Manager 所做的更改。 |
句法: | BalancerPersist On\|Off |
默认: | BalancerPersist Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | BalancerPersist 仅在 Apache HTTP Server 2.4.4 及更高版本中可用。 |
此指令将导致与平衡器和平衡器成员关联的共享 memory 存储在重新启动后保留。这允许在正常的 restart/graceful state 转换期间不会丢失这些本地更改。
NoProxy 指令
描述: | 将直接连接的主机,域或网络 |
句法: | NoProxy host[host]... |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
该指令仅对 Intranet 中的 Apache httpd 代理服务器有用。NoProxy
指令指定由空格分隔的子网,IP 地址,主机 and/or 域的列表。始终直接提供对与其中一个或多个匹配的 host 的请求,而不转发到已配置的ProxyRemote proxy server(s)。
例
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21"
NoProxy
指令的 host arguments 是以下类型列表之一:
- 域
域是部分限定的 DNS 域 name,以句点开头。它表示逻辑上属于同一 DNS 域或 zone 的主机列表(i.e.,主机名的后缀全部以域结尾)。示例.com .example.org。要区分域和主机名(在语法和语义上; DNS 域也可以具有 DNS A record!),域总是以前导句写入。注意在不考虑大小写的情况下完成域 name 比较,并且始终假定域锚定在 DNS 树的根中;因此,两个域.ExAmple.com 和.example.com。(注意尾随期)被认为是平等的。由于域比较不涉及 DNS 查找,因此它比子网比较更有效。 - 子网
SubNet 是数字(点四方)形式的部分限定互联网地址,可选地后跟斜杠和网络掩码,指定为 SubNet 中的有效位数。它用于表示可通过 common 网络接口访问的主机子网。在没有显式网络掩码的情况下,假设省略(或零值)的尾随数字指定掩码。(在这种情况下,网络掩码只能是 8 位的倍数 wide.)示例:192.168 或 192.168.0.0 子网 192.168.0.0,隐含的网络掩码为 16 个有效位(有时用于网络掩码形式 255.255.0.0)192.168.112.0/21 子网 192.168.112.0/21,网络掩码为 21 有效位(也以 255.255.248.0 形式使用)作为退化情况,具有 32 个有效位的 SubNet 相当于 IPAddr,而具有零有效位(e.g.,0.0.0.0/0)的 SubNet 与常量_Default相同,匹配任何 IP 地址。 - IPADDR
IPAddr 表示数字(点分四边形)形式的完全限定的 Internet 地址。通常,此地址表示 host,但不一定需要与该地址连接的 DNS 域 name。 Example 192.168.123.7 注意 IPAddr 不需要由 DNS 系统解析,因此它可以带来更有效的 apache performance。 - 主机名
主机名是完全限定的 DNS 域 name,可以通过 DNS 域 name 服务解析为一个或多个 IPAddrs。它代表一个逻辑 host(与 Domains 相反,见上文),并且必须至少可以解析为一个 IPAddr(或者通常可以解析为具有不同 IPAddrs 的主机列表)。示例 prep.ai.example.edu www.example.org 注意在许多情况下,指定 IPAddr 代替主机名更有效,因为可以避免 DNS 查找。当与 name 服务器的连接使用慢速 PPP 链接时,Apache httpd 中的 Name 解析可能需要大量的 time。完成主机名比较而不考虑大小写,并且始终假定主机名锚定在 DNS 树的根中;因此,两个主机 WWW.ExAmple.com 和 www.example.com。(注意尾随期)被认为是平等的。
参见
- DNS 问题
<Proxy>指令
描述: | 用于代理资源的指令的容器 |
句法: | <Proxy wildcard-url>...</Proxy> |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
<Proxy>
部分中的指令仅适用于匹配的代理内容。允许 Shell-style 通配符。
例如,以下内容仅允许yournetwork.example.com
中的主机通过代理服务器访问内容:
<Proxy "*"> Require host yournetwork.example.com </Proxy>
以下 example 将在通过代理服务器发送过滤器的foo
目录时处理所有 files:
<Proxy "http://example.com/foo/*"> SetOutputFilter INCLUDES </Proxy>
与 Location configuration 部分的差异
如果后端 URL 以 wildcard-url string 开头,则匹配 configuration 部分,即使指令中的最后一个路径段仅匹配后端 URL 的前缀。例如,<Proxy " http://example.com/foo ">匹配 http://example.com/foo,http://example.com/foo/bar 和 http://example.com/foobar 的所有内容。最终 URL 的匹配与<Location>部分的行为不同,为了本说明的目的,将最终路径 component 视为以斜杠结尾。
有关匹配的更多控制,请参阅<ProxyMatch>
。
参见
- <ProxyMatch>
Proxy100Continue 指令
描述: | 将 100-continue 期望转发到源服务器 |
句法: | Proxy100Continue Off\|On |
默认: | Proxy100Continue On |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可在 version 2.4.39 及更高版本中使用 |
该指令确定代理是否应该将 100-continue Expect:ation 转发到源服务器,从而让它决定 when/if 应该读取 HTTP 请求体,或者Off
代理应该在转发请求体之前自己生成 100 Continue 中间响应。
效用
此选项仅用于 HTTP 代理,由mod_proxy_http处理。
ProxyAddHeaders 指令
描述: | 在 X-Forwarded -* headers 中添加代理信息 |
句法: | ProxyAddHeaders Off\|On |
默认: | ProxyAddHeaders On |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可在 version 2.3.10 及更高版本中使用 |
该指令确定是否应通过 X-Forwarded-For,X-Forwarded-Host 和 X-Forwarded-Server HTTP headers 将代理相关信息传递给后端服务器。
效用
此选项仅用于 HTTP 代理,由mod_proxy_http处理。
ProxyBadHeader 指令
描述: | 确定如何处理响应中的错误标题 lines |
句法: | ProxyBadHeader IsError\|Ignore\|StartBody |
默认: | ProxyBadHeader IsError |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
如果ProxyBadHeader
指令从源服务器接收到语法无效的响应头 lines(i.e.不包含冒号),则ProxyBadHeader
指令确定mod_proxy的行为。以下 arguments 是可能的:
IsError
中止请求并最终得到 502(Bad Gateway)响应。这是默认行为。Ignore
对待错误的标题 lines,就好像它们没有被发送一样。StartBody
当收到第一个坏标题 line 时,读完 headers 并将余数视为正文。这有助于解决错误的后端服务器,忘记在 headers 和 body 之间插入一个空的 line。
ProxyBlock 指令
描述: | 禁止被代理的单词,主机或域 |
句法: | ProxyBlock *\|word\|host\|domain[word\|host\|domain]... |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
ProxyBlock
指令指定由空格分隔的单词列表,主机 and/or 域。对名称包含匹配的单词,主机或域的站点的 HTTP,HTTPS 和 FTP 文档请求被代理服务器阻止。代理模块还将尝试确定在启动期间可能是主机名的列表项的 IP 地址,并将它们缓存以进行 match 测试。这可能会减慢服务器的启动时间。
例
ProxyBlock "news.example.com" "auctions.example.com" "friends.example.com"
请注意,example
也足以匹配任何这些网站。
如果通过 IP 地址引用,主机也将匹配。
另请注意
ProxyBlock "*"
阻止与所有站点的连接。
ProxyDomain 指令
描述: | 代理请求的默认域 name |
句法: | ProxyDomain Domain |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
该指令仅对 Intranet 中的 Apache httpd 代理服务器有用。ProxyDomain
指令指定 apache 代理服务器所属的默认域。如果遇到没有域 name 的 host 请求,将生成对附加了已配置域的相同 host 的重定向响应。
例
ProxyRemote "*" "http://firewall.example.com:81" NoProxy ".example.com" "192.168.112.0/21" ProxyDomain ".example.com"
ProxyErrorOverride 指令
描述: | 覆盖代理内容的错误页面 |
句法: | ProxyErrorOverride On\|Off |
默认: | ProxyErrorOverride Off |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
此指令对于 reverse-proxy 设置很有用,您希望在最终用户看到的错误页面上具有 common 外观。这也允许包含 files(通过mod_include的 SSI)来获取错误 code 并相应地采取行动。(默认行为将显示代理服务器的错误页面。启用此选项会显示 SSI 错误 message.)
该指令不影响信息(1xx),正常成功(2xx)或重定向(3xx)响应的处理。
ProxyIOBufferSize 指令
描述: | 确定内部数据吞吐量缓冲区的大小 |
句法: | ProxyIOBufferSize bytes |
默认: | ProxyIOBufferSize 8192 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
ProxyIOBufferSize
指令调整内部缓冲区的大小,该缓冲区用作输入和输出之间数据的暂存器。大小必须至少为512
。
几乎在每种情况下,都没有理由改变那个 value。
如果与 AJP 一起使用,则此指令设置最大 AJP 数据包大小(以字节为单位)。大于 65536 的值设置为 65536.如果从默认值更改它,则还必须更改 Tomcat 端的 AJP 连接器的packetSize
属性!属性packetSize
仅在 Tomcat 5.5.20+
和6.0.2+
中可用
通常,不必更改最大数据包大小。发送证书或证书链时报告了默认 value 的问题。
<ProxyMatch>指令
描述: | 指令的容器应用于 regular-expression-matched 代理资源 |
句法: | <ProxyMatch regex>...</ProxyMatch> |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
<ProxyMatch>
指令与<Proxy>指令相同,只是它使用常用表达匹配 URL。
从 2.4.8 开始,捕获命名组和反向引用并将其写入环境,并使用前缀为“MATCH_”的相应 name 和大写。这允许从表达式和mod_rewrite之类的模块中引用 URL 元素。为了防止混淆,忽略了编号(未命名)的反向引用。请改用命名组。
<ProxyMatch "^http://(?<sitename>[^/]+)"> Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example </ProxyMatch>
参见
- <Proxy>
ProxyMaxForwards 指令
描述: | Maxim 可以转发请求的代理数量 |
句法: | ProxyMaxForwards number |
默认: | ProxyMaxForwards -1 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 2.2.7 中的默认行为已更改 |
ProxyMaxForwards
指令指定如果请求没有提供Max-Forwards
标头,请求可以通过的最大代理数。这可以设置为防止无限代理循环或 DoS 攻击。
例
ProxyMaxForwards 15
请注意,设置ProxyMaxForwards
违反了 HTTP/1.1 协议(RFC2616),如果 Client 未设置,则禁止代理设置Max-Forwards
。早期 Apache httpd 版本总是设置它。负ProxyMaxForwards
value,包括默认的-1,会给你 protocol-compliant 行为,但可能会让你打开循环。
ProxyPass 指令
描述: | Maps remote 服务器进入本地服务器 URL-space |
句法: | ProxyPass[path]!\|url[key=value[key=value ...]][nocanon][interpolate][noquery] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 在 2.4.7 中添加了 Unix 域 Socket(UDS)支持 |
该指令允许将 remote 服务器映射到本地服务器的空间。本地服务器不像传统意义上的代理,但似乎是 remote 服务器的镜像。本地服务器通常称为反向代理或网关。路径是本地虚拟路径的 name; url 是 remote 服务器的部分 URL,不能包含查询 string。
强烈建议在继续本节之前审查工人的概念。
<Directory>,<If>和<Files>容器中不支持该指令。
使用
ProxyPass
时,通常应将将 ProxyRequests指令设置为off。
在 2.4.7 及更高版本中,通过使用前置unix:/path/lis.sock|
的目标,可以支持使用 Unix 域 Socket。例如,要在/home/www.socket 处代理 HTTP 并定位 UDS,您将使用unix:/home/www.socket|http://localhost/whatever/
。
**注意:**与unix:
URL 关联的路径是DefaultRuntimeDir
。
在<Location>部分中使用时,省略第一个参数,并从<Location>获取本地目录。在<LocationMatch>部分内也会发生同样的情况;但是,ProxyPass 不会解释 regexp,因此在这种情况下必须使用ProxyPassMatch
。
假设本地服务器的地址为http://example.com/
;然后
<Location "/mirror/foo/"> ProxyPass "http://backend.example.com/" </Location>
将导致http://example.com/mirror/foo/bar
的本地请求在内部转换为http://backend.example.com/bar
的代理请求。
如果需要更灵活的 reverse-proxy configuration,请参见带有[P]
flag 的重写规则指令。
以下替代语法是可能的;但是,当存在于非常大的_number 中时,它可能会带来 performance 惩罚。以下语法的优点是它允许通过平衡器 Manager接口进行动态控制:
ProxyPass "/mirror/foo/" "http://backend.example.com/"
如果第一个参数_end 以尾随**/,则第二个参数也应以尾随/**结束,反之亦然。否则,对后端的结果请求可能会遗漏一些所需的斜杠,并且不会提供预期的结果。
!
指令在您不希望 reverse-proxy 子目录 e.g 的情况下非常有用。
<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
的请求将被代理,因为将首先评估位置块中的ProxyPass
指令。ProxyPass
支持服务器和目录上下文这一事实并不意味着它们在 configuration 文件中的作用域和位置将保证任何 ordering 或 override。
订购 ProxyPass 指令
在 configuration 的 order 中检查配置的ProxyPass和ProxyPassMatch规则。匹配胜利的第一条规则。因此,通常您应该首先从最长的 URL 开始对冲突的ProxyPass规则进行排序。否则,较长 URLS 的后续规则将被使用 URL 的前导子字符串的任何早期规则隐藏。请注意,worker 共享存在一些关系。
在位置中订购 ProxyPass 指令
只有一个ProxyPass指令可以放在地点块中,并且最具体的位置优先。
排除和 no-proxy 环境变量
排除必须在通用ProxyPass
指令之前。在 2.4.26 及更高版本中,“no-proxy”环境变量是排除项的替代,并且是在地点 context 中配置排除ProxyPass
指令的唯一方法。此变量应使用SetEnvIf 之后设置,因为SETENV未及早评估。
ProxyPass key=value 参数
在 Apache HTTP Server 2.1 及更高版本中,mod_proxy 支持与后端服务器的池连接。按需创建的连接可以保留在池中以供将来使用。可以使用key=value
参数在ProxyPass
指令上对池大小和其他设置的限制进行编码,如下表所述。
与后端的最大连接
默认情况下,mod_proxy 将允许并保留可由 web 服务器子 process 同时使用的最大连接数。使用max
参数减少默认值。连接池是按 web 服务器子 process 维护的,并且max
和其他设置不在所有子进程之间协调,除非 configuration 或 MPM 设计允许只有一个子 process。
使用ttl
参数设置可选的 time 生存;至少ttl
秒未使用的连接将被关闭。ttl
可用于避免使用由于后端服务器的 keep-alive 超时而导致关闭的连接。
例
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
Worker| BalancerMember 参数 |
参数 | 默认 | 描述 |
分 | 0 | 最小连接池条目数,与实际连接数无关。对于应预先分配或保留与后端连接关联的堆 memory 的特殊情况,这只需要从默认值进行修改。 |
最大 | 1...n | 允许后端服务器的最大连接数。此限制的默认值是 active MPM 中每个 process 的线程数。在 Prefork MPM 中,它始终为 1,而对于其他 MPM,它由ThreadsPerChild 指令控制。 |
SMAX | 最大 | 如果由于ttl 参数控制的时间长于 time 而不使用,则在某些操作期间会释放超过此限制的保留连接池条目。如果连接池条目具有关联的连接,则将关闭该连接。对于需要更积极地释放或关闭连接池条目和超过 time 生存的任何关联连接的特殊情况,这只需要从默认值进行修改。 |
获得 | - | 如果设置,这将是等待连接池中的空闲连接的最大 time,以毫秒为单位。如果池中没有空闲连接,Apache httpd 将_ret 状态返回到 client。 |
连接超时 | 超时 | 以秒为单位连接超时。 Apache httpd 等待创建与后端完成连接的秒数。通过添加 ms 的后缀,也可以以毫秒为单位设置超时。 |
disablereuse | 离 | 当您要强制 mod_proxy 在使用后立即关闭与后端的连接时,应使用此参数,从而禁用其后端的持久连接和池。这有助于各种情况,其中 Apache httpd 和后端服务器之间的防火墙(无论协议)是否会以静默方式丢弃连接,或者后端本身可能在循环 DNS 下。启用连接重用后,每个子项 process 仅解析一次后端域(使用 DNS 查询),并为所有其他连接缓存,直到子项被回收。要禁用连接重用,请将此 property value 设置为On 。 |
enablereuse | 上 | 这与上面的'disablereuse'相反,为了方便 scheme 处理程序提供,需要 opt-in 进行连接重用(例如mod_proxy_fcgi)。 2.4.11 以后只。 |
flushpackets | 离 | 确定代理模块在每个“数据块”之后是否 auto-flush 输出队。'off'意味着它只在需要时才会冲洗;'on'表示每个块发送后;'auto'表示 poll/wait 一段时间,如果没有收到'flushwait'毫秒的输入则刷新。目前,这仅对 mod_proxy_ajp 和 mod_proxy_fcgi 有效。 |
flushwait | 10 | 如果'flushpackets'为'auto',则在刷新输出队之前等待额外输入的 time(以毫秒为单位)。 |
iobuffersize | 8192 | 调整内部暂存器 IO 缓冲区的大小。这允许您覆盖特定 worker 的ProxyIOBufferSize 。对于系统默认值 8192,此值必须至少为 512 或设置为 0。 |
responsefieldsize | 8192 | 调整代理响应字段缓冲区的大小。缓冲区大小应至少是代理响应中最大预期标头大小的大小。将 value 设置为 0 将使用系统默认值 8192 字节。 在 Apache HTTP Server 2.4.34 及更高版本中可用。 |
活着 | 离 | 当 Apache httpd 和后端服务器之间有防火墙时,应该使用此参数,这会导致非活动连接断开。此 flag 将告诉操作系统在非活动连接上发送KEEP_ALIVE 消息,从而防止防火墙断开连接。要启用 keepalive,请将此 property value 设置为On 。初始和后续 TCP keepalive 探测的频率取决于 global OS 设置,可能高达 2 小时。为了有用,OS 中配置的频率必须小于防火墙使用的阈值。 |
lbset | 0 | 设置 worker 所属的负载均衡器 cluster 集。在尝试更高编号的 lbset 之前,负载均衡器将尝试编号较低的 lbset 的所有成员。 |
平 | 0 | Ping property 告诉网络服务器在转发请求之前“测试”与后端的连接。对于 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 后端,此 property 无效)。在这两种情况下,参数都是等待回复的延迟(以秒为单位)。添加了此功能以避免挂起和忙碌后端出现问题。这将在正常操作期间增加网络流量,这可能是一个问题,但是如果某些 cluster 节点关闭或忙碌,它将降低流量。通过添加 ms 的后缀,延迟也可以以毫秒为单位进行设置。 |
receivebuffersize | 0 | 调整代理连接的显式(TCP/IP)网络缓冲区大小。这允许您覆盖特定 worker 的ProxyReceiveBufferSize 。对于系统默认值,此值必须至少为 512 或设置为 0。 |
重定向 | - | 重定向 worker 的 Route。通常动态设置此 value 以启用从 cluster 安全删除节点。如果设置,所有没有 session id 的请求将被重定向到具有 route 参数等于此 value 的 BalancerMember。 |
重试 | 60 | 连接池 worker 重试超时(以秒为单位)。如果到后端服务器的连接池 worker 在错误 state 中,Apache httpd 将不会将任何请求转发到该服务器,直到超时到期。这样可以关闭后端服务器以进行维护,并在以后将其重新联机。 value 为 0 表示始终在错误 state 中重试 workers 而没有超时。 |
路线 | - | 在负载均衡器内使用时工作的路径。 route 是附加到 session id 的 value。 |
状态 | - | 单个字母 value 定义此 worker 的初始状态。 D:Worker 已禁用,不接受任何请求。 S:Worker 在管理上被停止了。 I:Worker 处于 ignore-errors 模式,始终被视为可用。 R:Worker 是热门备件。对于给定 lbset 中的每个 worker 都是不可用的(排水,停止,错误,etc.),将使用具有相同 lbset 的可用热备件。热备件可以帮助确保特定数量的_werkers 始终可用于由平衡器使用. H:Worker 处于 hot-standby 模式,只有在平衡器集中没有其他可用的 workers 或备件时才会使用. E:Worker 处于错误 state. N:Worker 处于排水模式并且只接受发往自己的现有粘性会话并忽略所有其他请求。可以设置状态(这是默认值),前缀为''或前缀为'-'清除。因此,设置'S-E'sets 这个 worker 要停止并清除 in-error flag。 |
超时 | ProxyTimeout | 连接超时(秒)。 Apache httpd 等待/后端发送数据的秒数。 |
TTL | - | Time 用于非活动连接和关联的连接池条目,以秒为单位。达到此限制后,将不再使用连接;它会在晚些时候关闭。 |
冲水 | 红晕 | 使用的提供程序的名称。有关更多详细信息,请参阅此模块的文档。 |
秘密 | - | mod_proxy_ajp使用__cret 的 Value。有关更多详细信息,请参阅此模块的文档。 |
升级 | WebSocket | 由mod_proxy_wstunnel在升级标头中接受的协议。有关更多详细信息,请参阅此模块的文档。 |
如果 Proxy 指令 scheme 以balancer://
开头(例如:balancer://cluster
,忽略任何路径信息),则将创建一个不与后端服务器真正通信的虚拟 worker。相反,它负责管理几个“真正的”工作者。在这种情况下,可以将特殊参数集添加到此虚拟 worker 中。有关平衡器如何工作的更多信息,请参见mod_proxy_balancer。
平衡器参数 |
参数 | 默认 | 描述 | |
lbmethod | byrequests | 平衡器 load-balance 方法。选择要使用的 load-balancing 调度程序方法。byrequests ,执行加权请求计数;bytraffic ,执行加权流量字节计数平衡;或bybusyness ,执行待处理的请求平衡。默认值为byrequests 。 | |
maxattempts | 比_werkers 的数量少一个,或者单个 worker 的数量少一个。 | 放弃前的最大故障转移尝试次数。 | |
nofailover | 离 | 如果设置为On ,如果 worker 处于错误 state 或禁用状态,session 将 break。如果后端服务器不支持 session 复制,请将此 value 设置为On 。 | |
stickysession | - | 平衡器粘 session name。 value 通常设置为JSESSIONID 或PHPSESSIONID ,它取决于支持会话的后端 application 服务器。如果后端 application 服务器对 cookies 和 url 编码的 id(如 servlet 容器)使用不同的 name,请使用\ | 分开他们。第一部分是 cookie,第二部分是路径。 Apache HTTP Server 2.4.4 及更高版本中可用。 |
stickysessionsep | "." | 在 session cookie 中设置分隔符号。某些后端 application 服务器不使用'.'作为符号。例如,Oracle Weblogic 服务器使用“!”。可以使用此选项设置正确的符号。“关闭”设置表示没有使用符号。 | |
scolonpathdelim | 离 | 如果设置为On ,semi-colon 字符';'将被用作额外的粘性 session 路径 delimiter/separator。这主要用于在处理_path 等_path 时模拟 mod_jk 的行为 | |
超时 | 0 | 平衡器超时(秒)。如果设置,这将是等待免费 worker 的最大 time。默认是不等待。 | |
failonstatus | - | HTTP 状态代码的单个或 comma-separated 列表。如果设置,当后端返回列表中的任何状态 code 时,这将强制 worker 进入错误 state。 Worker 恢复与其他 worker 错误的行为相同。 | |
failontimeout | 离 | 如果设置,请求发送到后端后的 IO 读取超时将强制 worker 进入错误 state。 Worker 恢复与其他 worker 错误的行为相同。 在 Apache HTTP Server 2.4.5 及更高版本中可用。 | |
现时 | <auto> | balancer-manager application 页面中使用的保护性随机数。默认设置是使用自动确定的 UUID-based nonce,以提供对页面的进一步保护。如果设置,则将 nonce 设置为该 value。设置None 将禁用所有随机数检查。注意 除了现时, balancer-manager 页面应该通过 ACL 保护。 | |
发展 | 0 | 除了在 configuration 中定义的平衡器之外,允许添加到此平衡器的其他 BalancerMembers 的数量。 | |
forcerecovery | 上 | 如果平衡器的所有工作者都处于错误 state 状态,则强制立即恢复所有 workers,而不考虑 workers 的重试参数。如果强制执行所有 workers 的恢复而不考虑每个 worker 的重试参数,则可能存在已经过载的后端可能陷入更深处的麻烦的情况。在这种情况下,设置为Off 。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>
配置热备用可以帮助确保每个负载均衡器集始终可以使用一定数量的 workers:
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>
设置只有在负载均衡器集中没有其他成员(或备用)可用时才会使用的 hot-standby:
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 路径“raw”传递给后端。请注意,此关键字可能会影响后端的安全性,因为它会消除对代理提供的 URL-based 攻击的正常有限保护。
通常,mod_proxy 将在生成 SCRIPT_FILENAME 环境变量时包含查询 string。可选的 noquery 关键字(在 httpd 2.4.1 和更高版本中可用)可以防止这种情况发生。
可选的 interpolate 关键字与ProxyPassInterpolateEnv结合使 ProxyPass 使用语法${来插入环境变量。 622}。请注意,当此插值发生时,许多标准 CGI-derived 环境变量将不存在,因此您可能仍需要求助于复杂规则的mod_rewrite。另请注意,URL 的 scheme/hostname/port 部分仅支持对解析指令时可用的变量(如限定)进行插值。可以使用mod_rewrite完成这些字段的动态确定。以下 example 描述了如何使用mod_rewrite将 scheme 动态设置为 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 指令
描述: | 继承从主服务器定义的 ProxyPass 指令 |
句法: | ProxyPassInherit On\|Off |
默认: | ProxyPassInherit On |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | ProxyPassInherit 仅在 Apache HTTP Server 2.4.5 及更高版本中可用。 |
该指令将导致当前 server/vhost“继承”主服务器中定义的ProxyPass指令。如果使用 Balancer Manager 进行动态更改,这可能会导致问题和不一致的行为,因此如果使用该 feature 则应禁用。
global 服务器中的设置定义了所有 vhost 的默认设置。
禁用 ProxyPassInherit 也会禁用BalancerInherit。
ProxyPassInterpolateEnv 指令
描述: | 在反向代理配置中启用环境变量插值 |
句法: | ProxyPassInterpolateEnv On\|Off |
默认: | ProxyPassInterpolateEnv Off |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可在 httpd 2.2.9 及更高版本中使用 |
该指令与ProxyPass
,ProxyPassReverse
,ProxyPassReverseCookieDomain
和ProxyPassReverseCookiePath
的 interpolate 参数一起使用环境变量动态配置反向代理,环境变量可以由另一个模块(如mod_rewrite)设置。如果设置了 interpolate 选项,它会影响ProxyPass
,ProxyPassReverse
,ProxyPassReverseCookieDomain
和ProxyPassReverseCookiePath
指令,并使它们在 configuration 指令中用 string ${varname}
替换环境变量varname
的 value。
ProxyPass
的 scheme/hostname/port 部分可能包含变量,但只包含解析指令时可用的变量(对于 example,使用限定)。对于所有其他用例,请考虑使用mod_rewrite代替。
性能警告
除非您需要,否则请关闭此功能!将变量添加到ProxyPass
for example 可能会导致使用默认 mod_proxy 的 workers 配置(不允许任何微调,如连接重用,etc..)。
ProxyPassMatch 指令
描述: | Maps remote 服务器使用正则表达式进入本地服务器 URL-space |
句法: | ProxyPassMatch[regex]!\|url[key=value[key=value ...]] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
该指令等同于ProxyPass,但使用正则表达式而不是简单的前缀匹配。提供的正则表达式与 url 匹配,如果匹配,服务器将把任何带括号的匹配替换为给定的 string 并将其用作新的 url。
**注意:**此指令不能在<Directory>
context 中使用。
假设本地服务器的地址为http://example.com/
;然后
ProxyPassMatch "^/(.*.gif)$" "http://backend.example.com/$1"
将导致http://example.com/foo/bar.gif
的本地请求在内部转换为http://backend.example.com/foo/bar.gif
的代理请求。
注意
在 regexp 替换之前(以及之后),URL 参数必须可以解析为 URL。这限制了您可以使用的匹配。例如,如果我们使用过
ProxyPassMatch "^(/.*.gif)$" "http://backend.example.com:8000$1"
在我们之前的示例中,它将在服务器启动时因语法错误而失败。这是一个错误(ASF bugzilla 中的 PR 46665),解决方法是重新配置 match:
ProxyPassMatch "^/(.*.gif)$" "http://backend.example.com:8000/$1"
!
指令在您不希望 reverse-proxy 子目录的情况下很有用。
在<LocationMatch>部分中使用时,省略第一个参数,并从<LocationMatch>获取正则表达式。
如果需要更灵活的 reverse-proxy configuration,请参见带有[P]
flag 的重写规则指令。
默认替换
当 URL 参数未对正则表达式使用任何反向引用时,原始 URL 将附加到 URL 参数。
安全警告
在构建规则的目标 URL 时要小心,考虑到允许 client 影响服务器将充当代理的 URL 集的安全性影响。确保 URL 的 scheme 和 hostname 部分已修复或不允许 client 不当影响。
ProxyPassReverse 指令
描述: | 调整从反向代理服务器发送的 HTTP 响应_header 中的 URL |
句法: | ProxyPassReverse[path] url[interpolate] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
该指令允许 Apache httpd 在 HTTP 重定向响应中调整Location
,Content-Location
和URI
headers 中的 URL。当 Apache httpd 用作反向代理(或网关)以避免绕过反向代理时,这是必不可少的,因为后端服务器上的 HTTP 重定向位于反向代理之后。
只会重写上面具体提到的 HTTP 响应 headers。 Apache httpd 不会 rewrite 其他响应 headers,也不会默认 rewrite URL references 在 HTML 页面内。这意味着如果代理内容包含绝对 URL references,它们将绕过代理。要_skrite HTML 内容以匹配代理,您必须加载并启用mod_proxy_html。
path 是本地虚拟路径的 name; url 是 remote 服务器的部分 URL。这些参数的使用方式与ProxyPass指令的使用方式相同。
对于 example,假设本地服务器具有地址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://example.com/mirror/foo/quux
,然后将 HTTP 重定向响应转发给 client。请注意,根据UseCanonicalName指令的设置选择用于构造 URL 的主机名。
请注意,此ProxyPassReverse
指令也可以与mod_rewrite中的代理 feature(RewriteRule ...[P]
)一起使用,因为它不依赖于相应的ProxyPass指令。
可选的 interpolate 关键字与ProxyPassInterpolateEnv
一起使用,可以插入使用格式${指定的环境变量。 755}。请注意,URL 的 scheme 部分不支持插值。
在<Location>部分中使用时,省略第一个参数,并从<Location>获取本地目录。同样发生在<LocationMatch>部分内,但可能无法按预期工作,因为 ProxyPassReverse 会将 regexp 字面解释为路径;如果在这种情况下需要,请在该部分之外或单独的<Location>部分中指定 ProxyPassReverse。
<Directory>或<Files>部分不支持该指令。
ProxyPassReverseCookieDomain 指令
描述: | 从反向代理服务器调整 Set-Cookie headers 中的域 string |
句法: | ProxyPassReverseCookieDomain internal-domain public-domain[interpolate] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
用法基本上类似于ProxyPassReverse,但不是重写作为 URL 的 headers,而是重写Set-Cookie
headers 中的domain
string。
ProxyPassReverseCookiePath 指令
描述: | 从反向代理服务器调整 Set-Cookie headers 中的 Path string |
句法: | ProxyPassReverseCookiePath internal-path public-path[interpolate] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
在后端 URL paths 映射到反向代理上的 public paths 的情况下,与ProxyPassReverse结合使用。该指令重写Set-Cookie
headers 中的path
string。如果 cookie 路径的开头与 internal-path 匹配,则 cookie 路径将替换为 public-path。
在ProxyPassReverse给出的 example 中,指令:
ProxyPassReverseCookiePath "/" "/mirror/foo/"
将_cheokie 与后端路径/
(或/example
或事实上,任何东西)_写为/mirror/foo/
。
ProxyPreserveHost 指令
描述: | 将传入的 Host HTTP 请求标头用于代理请求 |
句法: | ProxyPreserveHost On\|Off |
默认: | ProxyPreserveHost Off |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可用于 2.3.3 及更高版本的目录 context。 |
启用时,此选项会将 Host:line 从传入请求传递到代理 host,而不是ProxyPass line 中指定的主机名。
通常应该将此选项设为Off
。它主要用于特殊配置,如代理质量 name-based 虚拟主机,其中原始 Host 标头需要由后端服务器进行评估。
ProxyReceiveBufferSize 指令
描述: | 代理 HTTP 和 FTP 连接的网络缓冲区大小 |
句法: | ProxyReceiveBufferSize bytes |
默认: | ProxyReceiveBufferSize 0 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
ProxyReceiveBufferSize
指令为代理的 HTTP 和 FTP 连接指定显式(TCP/IP)网络缓冲区大小,以提高吞吐量。它必须大于512
或设置为0
以指示应使用系统的默认缓冲区大小。
例
ProxyReceiveBufferSize 2048
ProxyRemote 指令
描述: | Remote 代理用于处理某些请求 |
句法: | ProxyRemote match remote-server |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
这定义了此代理的 remote 代理。 match 是 remote 服务器支持的 URL-scheme 的 name,或者应该使用 remote 服务器的部分 URL,或*
表示应该为所有请求联系服务器。 remote-server 是 remote 服务器的部分 URL。句法:
remote-server = scheme://hostname[:port]
scheme 实际上是应该用于与 remote 服务器通信的协议;此模块仅支持http
和https
。使用https
时,使用 HTTP CONNECT 方法通过 remote 代理转发请求。
例
ProxyRemote "http://goodguys.example.com/" "http://mirrorguys.example.com:8000" ProxyRemote "*" "http://cleverproxy.localdomain" ProxyRemote "ftp" "http://ftpproxy.mydomain:8080"
在最后一个示例中,代理将 FTP 请求(作为另一个 HTTP 代理请求封装)转发给另一个可以处理它们的代理。
此选项还支持反向代理 configuration;即使该服务器被另一个转发代理隐藏,也可以将后端 Web 服务器嵌入到虚拟主机 URL 空间中。
ProxyRemoteMatch 指令
描述: | Remote 代理用于处理正则表达式匹配的请求 |
句法: | ProxyRemoteMatch regex remote-server |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
ProxyRemoteMatch
与ProxyRemote指令相同,只是第一个参数是针对请求的 URL 的正则表达式 match。
ProxyRequests 指令
描述: | 启用转发(标准)代理请求 |
句法: | ProxyRequests On\|Off |
默认: | ProxyRequests Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
这允许或阻止 Apache httpd 充当转发代理服务器。(将 ProxyRequests 设置为Off
不会禁用ProxyPass directive.)的使用
在典型的反向代理或网关 configuration 中,此选项应设置为Off
。
在 order 中获取代理 HTTP 或 FTP 站点的功能,您还需要服务器中存在mod_proxy_http或mod_proxy_ftp(或两者)。
在 order 中获取(转发)代理 HTTPS 站点的功能,您需要在服务器中启用mod_proxy_connect。
警告
在有保护你的服务器之前,不要使用将 ProxyRequests启用代理。开放代理服务器对您的网络和整个 Internet 都是危险的。
参见
- 前进和后退 Proxies/Gateways
ProxySet 指令
描述: | 设置各种代理平衡器或成员参数 |
句法: | ProxySet url key=value[key=value ...] |
Context: | server config,virtual host,目录 |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | ProxySet 仅在 Apache HTTP Server 2.2 及更高版本中可用。 |
该指令用作设置通常通过ProxyPass指令完成的代理平衡器和 workers 可用的任何参数的替代方法。如果在<Proxy balancer url|worker url>
container 指令中使用,则不需要 url 参数。作为副作用,会创建相应的平衡器或 worker。当通过重写规则而不是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
警告
请记住,相同的参数 key 可以具有不同的含义,具体取决于它是应用于平衡器还是 worker,如上面关于超时的两个示例所示。
ProxySourceAddress 指令
描述: | 设置传出代理连接的本地 IP 地址 |
句法: | ProxySourceAddress address |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可在 version 2.3.9 及更高版本中使用 |
此指令允许在连接到后端服务器时设置要绑定的特定本地地址。
ProxyStatus 指令
描述: | 在 mod_status 中显示代理 LoadBalancer 状态 |
句法: | ProxyStatus Off\|On\|Full |
默认: | ProxyStatus Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
兼容性: | 可在 version 2.2 及更高版本中使用 |
该指令确定是否通过mod_status server-status 页面显示代理负载均衡器状态数据。
注意
完整是On的同义词
ProxyTimeout 指令
描述: | 代理请求的网络超时 |
句法: | ProxyTimeout seconds |
默认: | 超时的值 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
该指令允许用户指定代理请求的超时。当你有一个挂起的 slow/buggy appserver 时,这很有用,你宁愿只是 return 一个超时并且正常失败而不是等待 long 需要服务器 return。
ProxyVia 指令
描述: | 代理请求的Via HTTP 响应头中提供的信息 |
句法: | ProxyVia On\|Off\|Full\|Block |
默认: | ProxyVia Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_proxy |
该指令控制代理使用Via:
HTTP 头。其预期用途是控制代理服务器链上的代理请求流。有关Via:
标题 lines 的说明,请参阅RFC 2616(HTTP/1.1),第 14.45 节。
- 如果设置为
Off
(默认值),则不执行特殊处理。如果请求或回复包含Via:
标头,则传递不变。 - 如果设置为
On
,则每个请求和回复都将为当前 host 添加Via:
header line。 - 如果设置为
Full
,则每个生成的Via:
header line 将另外将 Apache httpd 服务器 version 显示为Via:
comment 字段。 - 如果设置为
Block
,则每个代理请求都将删除其所有Via:
标题 lines。不会生成新的Via:
标头。