<-
Apache HTTP 服务器 2.4 > Apache模块mod_proxy

Apache模块mod_proxy

描述:多协议代理/网关服务器
状态:延期
模块标识符:proxy_module
源文件:mod_proxy.c

摘要

警告

ProxyRequests确保服务器安全之前,请勿启用代理。开放式代理服务器对您的网络和整个Internet都是危险的。

mod_proxy及其相关模块为Apache HTTP Server实现代理/网关,支持许多流行的协议以及几种不同的负载平衡算法。第三方模块可以添加对其他协议和负载平衡算法的支持。

必须将一组模块加载到服务器中以提供必要的功能。这些模块可以在构建时静态包含,也可以通过LoadModule指令动态包含 。该集合必须包括:

另外,其他模块提供了扩展功能。缓存由mod_cache和相关模块提供。的SSLProxy*指令 提供了使用SSL / TLS协议联系远程服务器的能力mod_ssl。这些附加模块将需要加载和配置以利用这些功能。

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

正向代理和反向代理/网关

可以在正向反向代理(也称为网关)模式下配置Apache HTTP Server 。

普通转发代理是位于客户端和原始服务器之间的中间服务器。为了从原始服务器获取内容,客户端向代理发送请求,将原始服务器命名为目标。然后,代理从源服务器请求内容,并将其返回给客户端。必须将客户端特别配置为使用正向代理访问其他站点。

转发代理的典型用法是为内部客户端提供Internet访问,否则这些客户端会受到防火墙的限制。前向代理还可以使用缓存(由提供mod_cache)来减少网络使用量。

使用ProxyRequests指令激活转发代理。由于转发代理允许客户端通过您的服务器访问任意站点并隐藏其真实来源,因此必须保护服务器安全,以便只有授权的客户端才能在激活转发代理之前访问代理。

一个反向代理(或网关),相比之下,似乎客户端就像是一个普通的Web服务器。客户端上不需要特殊配置。客户端向反向代理的名称空间中的内容发出普通请求。然后,反向代理决定将这些请求发送到哪里,并像返回内容本身一样返回内容。

反向代理的典型用法是为Internet用户提供对位于防火墙后面的服务器的访问。反向代理还可以用于平衡多个后端服务器之间的负载,或为较慢的后端服务器提供缓存。此外,反向代理可以简单地用于将多个服务器带入相同的URL空间。

使用ProxyPass伪指令或伪指令的 [P]标志激活反向代理RewriteRule。这是 不是有必要把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>
最佳

通过处理程序访问

您还可以通过创建合适的处理程序传递来强制将请求作为反向代理请求进行处理。下面的示例配置将使用反向代理将对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和更高版本中提供了此功能。

最佳

工人

代理在称为worker的对象中管理原始服务器的配置及其通信参数。有两个内置工作器:默认的正向代理工作器和默认的反向代理工作器。可以明确配置其他工作程序。

这两个默认工作程序具有固定的配置,如果没有其他工作程序匹配该请求,则将使用它们。他们不使用HTTP Keep-Alive或连接重用。相反,将针对每个请求打开和关闭与原始服务器的TCP连接。

明确配置的工作程序由其URL标识。它们通常使用ProxyPassProxyPassMatch用于反向代理来创建和配置 :

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

或者使用ProxyProxySet

<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的最终超时值/examples60代替10

如果要避免共享工作程序,请按最长的工作程序URL开头的URL长度对工作程序定义进行排序。如果要最大程度地共享工作人员,请使用相反的排序顺序。另请参阅有关订购ProxyPass指令的相关警告。

明确配置的工作程序分为两种: 直接工作程序(负载)平衡程序工作程序。它们支持许多重要的配置属性,这些属性将在以下ProxyPass 指令中进行描述。也可以使用设置相同的属性 ProxySet

直接工作者可用的选项集取决于原始服务器URL中指定的协议。可用的协议包括ajpfcgiftphttpscgi

平衡器工人是虚拟工人,他们使用直接工人(称为成员)来实际处理请求。每个平衡器可以有多个成员。处理请求时,它将根据配置的负载平衡算法选择一个成员。

如果平衡器工作程序的URL balancer用作协议方案,则会创建一个平衡器工作程序 。平衡器URL唯一标识平衡器工作程序。使用将成员添加到平衡器 BalancerMember

原始域的DNS解析

首次创建到原始域的套接字时,会发生DNS解析。启用连接重用后,每个后端域在每个子进程中仅解析一次,并为所有其他连接进行缓存,直到子级被回收为止。在计划涉及后端域的DNS维护任务时,应考虑此信息。另请检查ProxyPass 参数以获取有关连接重用的更多详细信息。

最佳

控制对代理的访问

您可以控制谁通过<Proxy>控制块访问您的代理,如以下示例所示:

<Proxy "*">
  Require ip 192.168.0
</Proxy>

有关访问控制指令的更多信息,请参见 mod_authz_host

如果使用正向代理(使用ProxyRequests伪指令),则严格限制访问权限至关重要。否则,任何客户端都可以使用您的服务器来访问任意主机,同时隐藏其真实身份。这对于您的网络和整个Internet都是危险的。使用反向代理时(将ProxyPass指令与一起使用 ProxyRequests Off),访问控制的重要性较低,因为客户端只能联系您专门配置的主机。

另请参阅代理链验证环境变量。

最佳

启动缓慢

如果您使用ProxyBlock指令,则会在启动期间查找并缓存主机名的IP地址,以供以后进行匹配测试。这可能需要几秒钟(或更长时间),具体取决于主机名查找发生的速度。

最佳

内网代理

内联网中的Apache httpd代理服务器需要通过公司的防火墙转发外部请求(为此,配置ProxyRemote指令以将相应的方案转发到防火墙代理)。但是,当它必须访问Intranet中的资源时,可以在访问主机时绕过防火墙。该NoProxy 指令对于指定哪些主机属于Intranet有用,应直接访问。

Intranet内的用户倾向于从其WWW请求中省略本地域名,从而请求使用“ http:// somehost /”而不是 http://somehost.example.com/。一些商业代理服务器允许他们摆脱这种情况,而只是为请求提供服务,这意味着已配置了本地域。使用该ProxyDomain指令并将服务器配置为使用代理服务时,Apache httpd可以返回重定向响应,并将客户端发送到正确的标准服务器地址。这是首选方法,因为用户的书签文件将包含完全合格的主机。

最佳

协议调整

对于mod_proxy将请求发送到不能正确实现keepalive或HTTP / 1.1的原始服务器的情况,有两个环境变量可以强制请求使用不具有keepalive的HTTP / 1.0。这些是通过SetEnv指令设置的 。

这些是force-proxy-request-1.0proxy-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 仅适用于服务器将后台处理到磁盘的请求正文

最佳

反向代理请求标头

当在反向代理模式下操作时(ProxyPass例如,使用指令), mod_proxy_http添加几个请求标头以将信息传递到原始服务器。这些头是:

X-Forwarded-For
客户端的IP地址。
X-Forwarded-Host
客户端在Host HTTP请求标头中请求的原始主机。
X-Forwarded-Server
代理服务器的主机名。

在原始服务器上使用这些标头时要小心,因为如果原始请求中已经包含这些标头之一,则它们将包含多个(以逗号分隔)的值。例如,您可以使用%{X-Forwarded-For}i原始服务器的日志格式字符串来记录原始客户端的IP地址,但是如果请求通过多个代理,则可能会获得多个地址。

另请参见ProxyPreserveHostProxyVia指令,它们控制其他请求标头。

注意:如果需要指定要添加到转发请求中的自定义请求标头,请使用 RequestHeader 指令。

最佳

平衡器增长 指令

描述:配置后可以添加的其他均衡器数量
句法:BalancerGrowth #
默认:BalancerGrowth 5
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy
兼容性:BalancerGrowth仅在Apache HTTP Server 2.3.13和更高版本中可用。

除了预配置的数量外,该指令还可以增加虚拟主机可用的均衡器数量的增长潜力。仅在至少有一个预配置的Balancer时才生效。

最佳

平衡器继承 指令

描述:从主服务器继承ProxyPassed Balancer / Workers
句法:BalancerInherit On|Off
默认:BalancerInherit On
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy
兼容性:BalancerInherit仅在Apache HTTP Server 2.4.5和更高版本中可用。

该指令将导致当前服务器/虚拟主机“继承”主服务器中定义的ProxyPass平衡器和工作器。如果使用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之间,它定义了要施加到相关成员的加权负载。

balancerurl只需要当不在 容器指令。它对应于指令中定义的平衡器的url 。<Proxy balancer://...>ProxyPass

任何容器指令中的平衡器URL的路径部分都将 被忽略。<Proxy balancer://...>

通常应从的网址中删除斜杠 BalancerMember

最佳

平衡器持久性 指令

描述:尝试在重新启动期间持久保存Balancer Manager所做的更改。
句法:BalancerPersist On|Off
默认:BalancerPersist Off
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy
兼容性:BalancerPersist仅在Apache HTTP Server 2.4.4和更高版本中可用。

该指令将导致与平衡器和平衡器成员相关联的共享内存存储在重新启动后得以保留。这样,在正常的重新启动/正常状态转换期间,这些本地更改不会丢失。

最佳

NoProxy 指令

描述:将直接连接的主机,域或网络
句法: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是以下类型列表之一:

是部分限定的DNS域名,由一个周期之前。它表示逻辑上属于同一DNS域或区域的主机的列表(,主机名的后缀均以Domain结尾)。

例子

.com .example.org.

为了区分DomainHostname(在语法和语义上; DNS域也可以有DNS A记录!),Domain始终以前置句号编写。

注意

进行域名比较时不考虑大小写,并且 始终假定Domain锚定在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个有效位是相当于一个IPADDR,而子网具有零个有效位(例如,0.0.0.0/0)是一样的恒定 _Default_,匹配的任何IP地址。

IP地址

一个IPADDR代表的数字(点分四组)形式的完全合格的互联网地址。通常,此地址代表一台主机,但不一定需要将DNS域名与该地址连接。

192.168.123.7

注意

一个IPADDR并不需要由DNS系统来解决,所以它可能会导致更有效的apache性能。

主机名

一个主机名是一个完全合格的DNS域名,可以被解析为一个或多个IPAddrs通过DNS域名服务。它代表一个逻辑主机(与Domain相比 ,请参见上文),并且必须至少可解析为一个IPAddr(或通常可解析为具有不同IPAddr的主机列表)。

例子

prep.ai.example.edu
www.example.org

注意

在许多情况下,指定IPAddr代替主机名更为有效,因为可以避免DNS查找。当与名称服务器的连接使用慢速PPP链接时,Apache httpd中的名称解析可能会花费大量时间。

主机名比较是在不考虑大小写的情况下进行的,并且始终假定主机名锚定在DNS树的根中。因此,两个主机WWW.ExAmple.comwww.example.com.(请注意尾随时间段)被视为相等。

也可以看看

最佳

<Proxy> 指令

描述:适用于代理资源的指令的容器
句法:<Proxy wildcard-url> ...</Proxy>
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy

放在<Proxy> 各节中的指令仅适用于匹配的代理内容。允许使用壳式通配符。

例如,以下内容将仅允许主机中的主机 yournetwork.example.com通过您的代理服务器访问内容:

<Proxy "*">
  Require host yournetwork.example.com
</Proxy>

以下示例将 通过代理服务器发送文件时,处理通过过滤器foo 目录中的所有文件:example.comINCLUDES

<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>

也可以看看

最佳

Proxy100Continue 指令

描述:将100个继续的期望转发到原始服务器
句法:Proxy100Continue Off|On
默认:Proxy100Continue On
内容:服务器配置,虚拟主机,目录
状态:延期
模块:mod_proxy
兼容性:在2.4.40和更高版本中可用

该指令确定代理是否应将100-continue Expect:代理转发 给原始服务器,从而让它决定何时/是否应读取HTTP请求正文,或者Off代理何时应在转发请求之前自行生成100继续中间响应。身体。

实效

该选项仅用于HTTP代理,由进行处理mod_proxy_http

最佳

ProxyAddHeaders 指令

描述:在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 指令

描述:确定如何处理响应中的错误标题行
句法:ProxyBadHeader IsError|Ignore|StartBody
默认:ProxyBadHeader IsError
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy

ProxyBadHeader指令确定mod_proxy是否从源服务器接收到语法上无效的响应头行(,不包含冒号)的行为。以下参数是可能的:

IsError
中止该请求并以502(错误网关)响应结束。这是默认行为。
Ignore
将错误的标题行视为未发送。
StartBody
当收到第一行错误的标题行时,请完成读取标题并将其余部分视为正文。这有助于解决有问题的后端服务器,这些服务器忘记在标头和正文之间插入空行。
最佳

ProxyBlock 指令

描述:禁止代理的单词,主机或域
句法: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 指令

描述:代理请求的默认域名
句法:ProxyDomain Domain
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy

该指令仅对内部网中的Apache httpd代理服务器有用。该ProxyDomain指令指定apache代理服务器将属于的默认域。如果遇到对没有域名的主机的请求,将生成对附加了配置的的同一主机的重定向响应。

ProxyRemote  "*"  "http://firewall.example.com:81"
NoProxy         ".example.com" "192.168.112.0/21"
ProxyDomain     ".example.com"
最佳

ProxyErrorOverride 指令

描述:覆盖代理内容的错误页面
句法:ProxyErrorOverride On|Off
默认:ProxyErrorOverride Off
内容:服务器配置,虚拟主机,目录
状态:延期
模块:mod_proxy

该指令对于要在最终用户看到的错误页面上具有通用外观的反向代理设置很有用。这还允许包含的文件(通过 mod_includeSSI)获取错误代码并采取相应措施。(默认行为将显示代理服务器的错误页面。将其打开会显示SSI错误消息。)

该指令不影响信息性(1xx),正常成功(2xx)或重定向(3xx)响应的处理。

最佳

ProxyIOBufferSize 指令

描述:确定内部数据吞吐量缓冲区的大小
句法:ProxyIOBufferSize bytes
默认:ProxyIOBufferSize 8192
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy

ProxyIOBufferSize指令调整内部缓冲区的大小,该缓冲区用作输入和输出之间数据的暂存器。大小必须至少为512

在几乎每种情况下,都没有理由更改该值。

如果与AJP一起使用,则此伪指令设置最大AJP数据包大小(以字节为单位)。大于65536的值将设置为65536。如果将其更改为默认值,则还必须packetSize在Tomcat端更改AJP连接器的属性!该属性 packetSize仅在Tomcat 5.5.20+6.0.2+

通常,没有必要更改最大数据包大小。发送证书或证书链时,已报告默认值问题。

最佳

<ProxyMatch> 指令

描述:适用于正则表达式匹配的代理资源的指令的容器
句法:<ProxyMatch regex> ...</ProxyMatch>
内容:服务器配置,虚拟主机
状态:延期
模块:mod_proxy

<ProxyMatch>指令与指令相同<Proxy>,除了它使用正则表达式匹配URL 。

从2.4.8开始,将捕获命名的组和反向引用,并将其以大写的前缀“ MATCH_”的相应名称写入环境。这样可以从表达式和模块(如)中 引用URL的元素mod_rewrite。为了避免混淆,将忽略编号(未命名)的反向引用。请改用命名组。

<ProxyMatch "^http://(?<sitename>[^/]+)">
    Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</ProxyMatch>

也可以看看

最佳

ProxyMaxForwards 指令

描述:可以转发请求的最大代理数量
句法: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)可为您提供符合协议的行为,但可能会导致循环。

最佳

ProxyPass 指令

描述:将远程服务器映射到本地服务器URL空间
句法:ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] [noquery]
内容:服务器配置,虚拟主机,目录
状态:延期
模块:mod_proxy
兼容性:2.4.7中添加了Unix域套接字(UDS)支持

该指令允许将远程服务器映射到本地服务器的空间。本地服务器在常规意义上不充当代理,而似乎是远程服务器的镜像。本地服务器通常称为反向代理网关。该路径是本地虚拟路径的名称; url是远程服务器的部分URL,不能包含查询字符串。

强烈建议在继续执行本节之前,先回顾一下“ 工人”的概念 。
这个指令不支持的范围内 <Directory><If><Files>容器。
使用时, ProxyRequests通常应将该指令设置为offProxyPass

在2.4.7及更高版本中,可以通过使用prepens目标来支持使用Unix域套接字unix:/path/lis.sock|。例如,要代理HTTP并将UDS定位于/home/www.socket,可以使用 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

如果您需要更灵活的反向代理配置,请参阅RewriteRule带有[P]标志的 指令 。

以下替代语法是可能的;但是,当数量很大时,它可能会降低性能。以下语法的优点是它允许通过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将对请求进行代理,因为ProxyPassLocation块中的指令将首先被评估。这一事实ProxyPass同时支持服务器和目录上下文并不意味着他们的配置文件中的规模和地位将保证任何顺序或覆盖。

订购ProxyPass指令

按照配置 顺序检查已配置ProxyPassProxyPassMatch规则。匹配的第一个规则获胜。因此,通常您应该ProxyPass首先从最长的URL开始对冲突的规则进行排序 。否则,任何使用URL前导子串的早期规则将隐藏更长URL的以后规则。请注意,与工人共享有一些关系。

在位置订购ProxyPass指令

块中ProxyPass只能放置一个指令Location,并且最具体的位置优先。

排除项和无代理环境变量

排除项必须位于通用指令之前ProxyPass。在2.4.26及更高版本中,“ no-proxy”环境变量是排除的替代方法,并且是ProxyPassLocation上下文中配置指令的排除的唯一方法。此变量应设置为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
Worker | BalancerMember参数
参数 默认 描述
0 连接池条目的最小数量,与实际的连接数量无关。仅在特殊情况下才需要将其修改为默认值,在特殊情况下,应预先分配或保留与后端连接关联的堆内存。
最高 1 ... n 后端服务器允许的最大连接数。此限制的默认值为活动MPM中每个进程的线程数。在Prefork MPM中,该值始终为1,而对于其他MPM,则由ThreadsPerChild指令控制 。
最大 最高 如果保留连接池条目的使用时间超过生存时间(由ttl参数控制),则超过此限制的保留连接池条