Apache 2.0手册中文版翻译项目 [本文译者: biAji + ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版

 


mod_proxy - Apache HTTP服务器
<-
Apache主站 > HTTP服务器 > 文档 > 2.0版本 > 模块索引

Apache模块 mod_proxy


现有的语种:  en 

说明:HTTP/1.1 代理/网关服务器
状态:Extension
模块名:proxy_module
源文件:mod_proxy.c

概要

警告: 该文档没有完全包含在Apache HTTP服务器2.0中已经更新的内容,有些内容可能仍然有效,使用中请注意。

此模块实现了Apache的代理/网关。它实现了以下规范的代理 FTPCONNECT(用于SSL), HTTP/0.9HTTP/1.0,和 HTTP/1.1。 此模块经配置后可用上述或其它协议连接其它代理模块。

此模块在Apache 1.1.x中处于试验阶段,而在Apache v1.2.x和Apache v1.3.x中进行了改良并去除了一些bug。然后在Apache v2.0中进行了大的修整。现在协议的支持已经升级到HTTP/1.1,并支持了过滤器。

请注意:截止至Apache v1.3.x的mod_proxy的缓冲功能已经从mod_proxy中移除并入了一个新模块——mod_cache。换句话说:Apache 2.0.x的Proxy不再支持缓冲了——所有的缓冲功能已经移入了mod_cache。mod_cache现在已经能支持任何内容的缓冲了,而不仅是通过代理的内容。

如果您需要使用SSL来联系远端服务器,您最好查阅一下mod_ssl中的SSLProxy*指令。

在您没有对您的服务器采取安全措施之前,请不要用ProxyRequests启用您的代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。

指令索引

主题

top

普通配置

正向和反向代理

Apache可以配置成为正向反向代理。

正向代理是一个能使您的浏览器连接一个平时无法访问的远端网络的媒介。一个正向代理也能用于缓冲数据,以降低正向代理和远端web服务器之间的负载。

Apache的mod_proxy在使用ProxyRemote指令时,可以看作是一个正向代理。另外,数据缓冲的功能可以靠配置mod_cache来完成。其它提供正向代理的软件还包括Squid

反向代理是一个web服务器系统。除了为客户端提供位于本地磁盘上的页面或是由CGI动态生成的页面之外,它还能为客户端提供位于其它web服务器上的web页面,从而使这些页面看起来像是存在于这个代理服务器上一样。

当使用了mod_cache配置一个反向代理后,它可以作为一个比较慢的web服务器的缓冲来使用。反向代理也可以启用高级URL策略和管理技术,从而使处于不同web服务器系统或是体系的web页面同时存在于同一个URL空间下。反向代理对于实现具有很多或不同的web站点后端的集中管理非常理想。复杂的多层服务器系统可以使用一个Apache的mod_proxy前端和任意数量的后端web服务器来进行架构。

反向代理使用ProxyPassProxyPassReverse指令进行配置。可以使用mod_cache和正向代理结合启用缓冲功能。

控制您代理服务器的访问

您可以通过<Proxy>的阻止功能来控制谁能访问您的代理。示例如下:

<Proxy *>
Order Deny,Allow
Deny from all
Allow from 192.168.0
</Proxy>

当配置为反向代理时,访问控制由普通服务器的<directory>配置实现。

为什么xxx类型的文件不能从FTP下载?

您可能没有在您的代理mime类型配置文件中定义特定的文件类型 application/octet-stream。有用的一行可以是这样的:

application/octet-stream bin dms lha lzh exe class tgz taz

如何强制文件xxx使用FTP的ASCII形式下载?

在很罕见的情况下,也许您想要用FTP的ASCII传输方法来下载某个特定文件(默认的传输是binary模式),您可以用在请求前面加上;type=a前缀的方式覆盖mod_proxy的默认值来强制进行ASCII模式的传输。(不论如何,FTP目录列表将始终以ASCII模式执行。)

我如何能访问我自己home目录以外的FTP文件?

一个FTP URI一般被当成登录用户home目录的相对路径处理。唉,但您不能使用/../来到达更上层的目录层次,因为点(.)由浏览器解释而不会真正发送给FTP服务器。为搞定这个问题,在Apache FTP代理中实现了一个"Squid %2f hack"。这是一个也被其它流行的类似Squid Proxy Cache的代理服务器使用的解决方法。使用预先将/%2f加入您请求路径的方法,您能使代理将FTP起始目录改为 / (而不是home目录)。

举例说:为了取得文件/etc/motd,您应当使用下面这样的URL:

ftp://user@host/%2f/etc/motd

我如何才能在浏览器的URL框中隐藏FTP的明文密码?

使用用户名和密码登入一个FTP服务器时,Apache使用了不同的策略。当URL中不存在用户名和密码时,Apache会向FTP服务器发出一个匿名用户的登录,比如说:

user: anonymous
password: apache_proxy@

这对于配置了匿名访问的大多数FTP服务器来说是很有效的。

为了以特定的用户名登录,您可以将用户名嵌入URL里面,就好像下面这样:ftp://username@host/myfile。如果在给出了这个用户名后,FTP服务器要求提供一个密码(这是它应该做的),这时Apache会回应一个[401 Authorization required]。这将会使浏览器弹出一个username/password对话框。当输入了密码后,将会再次尝试连接,如果成功,则请求的资源就会下载下来。这种方法的好处在于您的浏览器不会以明码的形式显示密码(当您使用ftp://username:password@host/myfile的时候就无法做到这一点)。

注意

这种方法提交的密码在传输的时候没有进行加密。它在您的浏览器到Apache代理服务器之间传输时为base64格式的明文字串,而在Apache代理服务器和FTP服务器之间的传输为普通文本。所以,在通过HTTP访问您的FTP服务器之前(或通过FTP访问您的私人文件之前)您应该慎重考虑一下。当使用这种不安全的手段时,一个侦听者可能会用这种方法截取您的密码。

为什么使用了proxy模块后Apache启动明显变慢了?

如果您使用了ProxyBlock指令,将会在启动时查找并缓存主机名的IP地址以备后继的匹配测试使用。这将会花费几秒(或更长)的时间,这主要取决于主机名查找的速度。

对于局域网代理服务器来说还有什么有用的功能?

一个位于局域网内的Apache代理服务器需要经由公司的防火墙转发对外部的请求.但当它访问局域网内的资源时,它能越过防火墙直接访问目的主机。在访问一个属于局域网的服务器从而进行直接连接时,NoProxy指令就会很有用。

局域网内的用户习惯于不在他们的WWW请求中加入本地域的名称,于是会使用"http://somehost/"来取代"http://somehost.my.dom.ain/"。一些商业代理服务器会不管这些,只是采用本地域的配置来简单的伺服这个请求。当使用了ProxyDomain指令来为服务器配置了一个代理服务时,Apache会发出一个重定向回应,以使客户端请求到达正确的、能满足要求的服务器地址。因为这样一来,用户的书签文件就会随之包含完整的主机名,所以这是首选的方法。

如何使代理服务器使用HTTP/1.0而禁用持续连接?

在您有一个应用服务器没有正常实现连接保持或HTTP/1.1的情况下,您可以设置两个环境变量来发送一个不带连接保持的HTTP/1.0。这两个变量是通过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>

top

AllowCONNECT 指令

说明:通过代理允许CONNECT的端口号
语法:AllowCONNECT 端口号 [端口号] ...
默认值:AllowCONNECT 443 563
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

AllowCONNECT指令指定了此代理的CONNECT方法可以连接的端口号列表。当今的浏览器在进行https连接请求时使用这种方法,而代理默认会将其转为http。在默认情况下,只启用了默认的https端口(443)和默认的snews端口(563)。使用AllowCONNECT指令来覆盖默认设置而改为仅允许连接列出的端口。

top

NoProxy 指令

说明:将直接进行连接的主机、域或网络
语法:NoProxy 主机 [主机] ...
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令仅适用于局域网内的Apache代理服务器。NoProxy指令指定了一个中间以空格分隔的子网、IP地址、主机和/或域的列表。对某个匹配上述一个或多个列表项的主机的请求将直接被其伺服而不会前转到配置好的ProxyRemote代理服务器。

示例

ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21

NoProxy指令的主机参数可以为以下选项之一:

是一个DNS域名的一部分,preceded by a period. It represents a list of hosts which logically belong to the same DNS domain or zone (i.e., the suffixes of the hostnames are all ending in Domain).
Examples: .com .apache.org.
To distinguish Domains from Hostnames (both syntactically and semantically; a DNS domain can have a DNS A record, too!), Domains are always written with a leading period.
Note: Domain name comparisons are done without regard to the case, and Domains are always assumed to be anchored in the root of the DNS tree, therefore two domains .MyDomain.com and .mydomain.com. (note the trailing period) are considered equal. Since a domain comparison does not involve a DNS lookup, it is much more efficient than subnet comparison.
子网
子网以数字(点号分隔的四个部分)的形式表示了一个因特 网地址的一部分,有时会跟着一个斜杠和子网掩码, numeric (dotted quad) form, optionally followed by a slash and the netmask, specified as the number of significant bits in the SubNet. It is used to represent a subnet of hosts which can be reached over a common network interface. In the absence of the explicit net mask it is assumed that omitted (or zero valued) trailing digits specify the mask. (In this case, the netmask can only be multiples of 8 bits wide.)
示例:
192.168192.168.0.0
the subnet 192.168.0.0 with an implied netmask of 16 valid bits (sometimes used in the netmask form 255.255.0.0)
192.168.112.0/21
the subnet 192.168.112.0/21 with a netmask of 21 valid bits (also used in the form 255.255.248.0)
As a degenerate case, a SubNet with 32 valid bits is the equivalent to an IPAddr, while a SubNet with zero valid bits (e.g., 0.0.0.0/0) is the same as the constant _Default_, matching any IP address.
IP地址
IP地址以数字(点号分隔的四个部分)的形式表示了一个完整的因特网地址。一般来说,此地址代表一个主机,但这里不需要一个DNS域名与这个地址对应。
比如说: 192.168.123.7
注意:一个IP地址不需要为一个DNS系统所解析,所以它能使apache获取更高性能。
主机名
主机名是一个完整的DNS域名,可以通过DNS域名服务解析为一个或多个 IP地址。它代表了一个逻辑主机(与相反,见上)而且必须解析成至少一个IP地址(或经常解析成具有不同IP地址的主机列表)。
示例:prep.ai.mit.edu www.apache.org.
注意:在很多情况下,指定一个IP地址 代替主机名会更有效率。因为可以避免一次DNS查询。 当使用一个低速的PPP与域名服务器连接时,Apache的域名解析会花费相当 可观的时间。
注意:主机名 comparisons are done without regard to the case, and Hostnames are always assumed to be anchored in the root of the DNS tree, therefore two hosts WWW.MyDomain.com and www.mydomain.com. (note the trailing period) are considered equal.

参见

top

<Proxy> 指令

说明:施用于代理资源的指令的容器
语法:<Proxy 包含通配符的URL> ...</Proxy>
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

位于<Proxy>配置段中的指令仅施用于匹配的代理内容。语句中可以使用shell风格的通配符。

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

<Proxy *>
  Order Deny,Allow
  Deny from all
  Allow from yournetwork.example.com
</Proxy>

下例将在所有example.comfoo目录下的文件通过代理服务器发送之前用INCLUDES过滤器进行处理:

<Proxy http://example.com/foo/*>
  SetOutputFilter INCLUDES
</Proxy>

top

ProxyBlock 指令

说明:设置被代理屏蔽的语句、主机、和域
语法:ProxyBlock *|语句|主机|域 [语句|主机|域] ...
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

ProxyBlock指令指定了一个由空格分隔的语句、主机和/或域的列表。所有对匹配这些语句、主机和/或域的站点的HTTP、HTTPS和FTP文档的请求都将被代理服务器阻断。代理模块亦会在启动时尝试确定列表中可能是主机名的项目对应的IP地址,并将其缓冲用于匹配测试。比如说:

ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu

“rocky.wotsamattau.edu”将由于IP地址同样被匹配。

请注意“wotsamattau”已经足够匹配“wotsamattau.edu”了。

请注意

ProxyBlock *

将屏蔽所有站点的连接。

top

ProxyDomain 指令

说明:代理请求的默认域名
语法:ProxyDomain
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令仅对位于局域网内的Apache代理服务器有用。ProxyDomain指令指定了apache代理服务器归属的默认域。如果遇到了一个对没有域名的主机的请求,就会自动生成一个对根据配置加上了的同一主机的重定向回应。

示例

ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
ProxyDomain .mycompany.com

top

ProxyErrorOverride 指令

说明:覆盖代理内容的错误页
语法:ProxyErrorOverride On|Off
默认值:ProxyErrorOverride Off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:存在于Apache 2.0及其后继版本

此指令用于反向代理设置中您想为最终用户提供观感一致的错误页面时。它也同样允许包含文件(通过 mod_include 的SSI)获取错误号并作出相应行动。(默认行为是显示被代理的服务器的错误页面,将此项目设为on将显示SSI错误信息)。

top

ProxyIOBufferSize 指令

说明:用于外向HTTP和FTP连接的IO缓冲大小
语法:ProxyIOBufferSize 字节数
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
top

<ProxyMatch> 指令

说明:施用于匹配正则表达式的代理资源的指令
语法:<ProxyMatch regex> ...</ProxyMatch>
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

<ProxyMatch><Proxy>指令基本相同,只是匹配字串可以为正则表达式。

top

ProxyMaxForwards 指令

说明:能够同时进行前转的代理请求的最大数目
语法:ProxyMaxForwards 数值
默认值:ProxyMaxForwards 10
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:存在于Apache 2.0及其后继版本

ProxyMaxForwards指令指定了同时进行前转的代理请求的最大数目。这个设置是为了避免无限代理循环或DoS攻击的发生。

示例

ProxyMaxForwards 10

top

ProxyPass 指令

说明:将一个远端服务器映射到本地服务器的URL空间中
语法:ProxyPass [路径] !|url
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

指令对于您不想对某个子目录进行反向代理时很有用。比如说:

ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://foo.com

将会代理除对/mirror/foo/i请求之外的所有对 foo.com 的/mirror/foo请求。

注意:顺序很重要,您需要把特例情况放在一般代理通过指令

当在<Location>配置段中使用时,第一个参数会被忽略而是采用由<Location>指令指定的本地目录。

如果您需要一个更加灵活的反向代理配置,请参见使用[P]标记的RewriteRule指令。

top

ProxyPassReverse 指令

说明:调整由反向代理服务器发送的HTTP回应头中的URL
语法:ProxyPassReverse [路径] url
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令使 Apache 调整HTTP重定向回应中LocationContent-LocationURI头里的URL。这就是Apache在作为反向代理使用时,避免以因为位于反向代理之后的后端服务器的HTTP重定向造成的绕过反向代理的实质。

路径是本地虚拟路径的名称。
url远端服务器的部分URL。与ProxyPass指令中的使用方法相同。

示例:
假定本地服务器拥有地址http://wibble.org/;那么

ProxyPass /mirror/foo/ http://foo.com/
ProxyPassReverse /mirror/foo/ http://foo.com/

不仅会把所有对<http://wibble.org/mirror/foo/bar>的请求直接转为对 <http://foo.com/bar> 的代理请求,(由ProxyPass提供的功能)。它还会改变服务器foo.com的发送:当http://foo.com/bar被它重定向到http://foo.com/quux时,Apache会在前转HTTP重定向回应到客户端之前调整它为http://wibble.org/mirror/foo/quux。请注意:被选做用于构建URL的主机名与UseCanonicalName指令的设置有关。

请注意,此ProxyPassReverse指令亦可与mod_rewrite的代理穿透特性("RewriteRule ...[P]")联用。因为它不依赖于相应的ProxyPass指令。

当在<Location>配置段中使用时,第一个参数会被忽略而是采用由<Location>指令指定的本地目录。

top

ProxyPreserveHost 指令

说明:使用发来的HTTP请求头来发送代理请求
语法:ProxyPreserveHost on|off
默认值:ProxyPreserveHost Off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:存在于Apache 2.0.31及其后继版本中

当启用时,此选项将把传入请求的Host:行传递给被代理的主机,而不是传递在proxypass行中指定的主机名。

此选项一般为禁用状态。

top

ProxyReceiveBufferSize 指令

说明:对向外的HTTP和FTP连接使用的网络缓冲大小
语法:ProxyReceiveBufferSize 字节数
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

ProxyReceiveBufferSize指令为增加的吞吐量指定了一个明确的向外的HTTP和FTP连接的网络缓冲大小。这个值必须大于512,或设置为0代表使用系统默认的缓冲大小。

示例

ProxyReceiveBufferSize 2048

top

ProxyRemote 指令

说明:用户处理某些特定请求的远端代理
语法:ProxyRemote match remote-server
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令定义了此代理的远端代理。match可以是远端服务器支持的URL形式的名称,或是远端服务器使用的部分URL,或是'*'以代表服务器可以接受所有的请求。remote-server是远端服务器的部分URL。语法为:

  remote-server = protocol://hostname[:port]

protocol是与远端服务器交换信息时使用的协议;本模块暂时只支持"http"。

举例如下:

ProxyRemote http://goodguys.com/ http://mirrorguys.com:8000
ProxyRemote * http://cleversite.com
ProxyRemote ftp http://ftpproxy.mydomain.com:8080

在最后一个例子中,代理会将封装到另外一个HTTP代理请求中的FTP请求前转到另外一个能处理它们的代理去。

此选项也支持反向代理配置 - 一个后端web服务器可以被嵌入到一个虚拟主机的URL空间中,哪怕它是由另一个代理前转过来的。

top

ProxyRemoteMatch 指令

说明:处理匹配正则表达式的远端代理
语法:ProxyRemoteMatch regex remote-server
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

ProxyRemoteMatchProxyRemote指令基本相同。除了第一个参数是由一个请求的URL变成了匹配的正则表达式。

top

ProxyRequests 指令

说明:启用前转(基本)代理请求
语法:ProxyRequests on|off
默认值:ProxyRequests Off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令将允许或禁止Apache作为前转代理服务器的功能。(将ProxyRequests设置为'off'并不会禁用ProxyPass指令。)

在一个典型的反向代理配置中,此可选项一般设置为'off'。

在没能确保您服务器的安全之前不要启用代理。开放代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。

top

ProxyTimeout 指令

说明:对代理请求的网络超时设置
语法:ProxyTimeout seconds
默认值:ProxyTimeout 300
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:存在于Apache 2.0及其后继版本

此指令允许用户对代理请求指定一个超时值。当你有一个很慢/错误多多的应用服务器经常挂起,而您宁愿返回一个超时的失败信息也不愿意继续等待不知道多久的时候,这个功能是很有用的。

top

ProxyVia 指令

说明:对被代理请求的ViaHTTP回应头中提供的信息
语法:ProxyVia on|off|full|block
默认值:ProxyVia off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

此指令控制了代理对于Via:HTTP头的使用。它的使用目的是控制位于一个代理服务器链中的代理请求的流向。参阅 RFC2068 (HTTP/1.1)获得关于Via:头部分的解释。

现有的语种:  en 

 


项目维护者: kajaa [本文译者: biAji + ]

项目说明 | 项目进度 | 项目讨论区 | Apache手册中文版