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

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

 


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

Apache模块 mod_proxy

说明: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 指令

说明:Ports that are allowed to CONNECT through the proxy
语法:AllowCONNECT port [port] ...
默认值:AllowCONNECT 443 563
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

The AllowCONNECT directive specifies a list of port numbers to which the proxy CONNECT method may connect. Today's browsers use this method when a https connection is requested and proxy tunneling over http is in effect.
By default, only the default https port (443) and the default snews port (563) are enabled. Use the AllowCONNECT directive to overrride this default and allow connections to the listed ports only.

top

NoProxy 指令

说明:Hosts, domains, or networks that will be connected to directly
语法:NoProxy host [host] ...
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

This directive is only useful for Apache proxy servers within intranets. The NoProxy directive specifies a list of subnets, IP addresses, hosts and/or domains, separated by spaces. A request to a host which matches one or more of these is always served directly, without forwarding to the configured ProxyRemote proxy server(s).

Example

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

The host arguments to the NoProxy directive are one of the following type list:

Domain
A Domain is a partially qualified DNS domain name, 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.
SubNet
A SubNet is a partially qualified internet address in 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.)
Examples:
192.168 or 192.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.
IPAddr
A IPAddr represents a fully qualified internet address in numeric (dotted quad) form. Usually, this address represents a host, but there need not necessarily be a DNS domain name connected with the address.
Example: 192.168.123.7
Note: An IPAddr does not need to be resolved by the DNS system, so it can result in more effective apache performance.
Hostname
A Hostname is a fully qualified DNS domain name which can be resolved to one or more IPAddrs via the DNS domain name service. It represents a logical host (in contrast to Domains, see above) and must be resolvable to at least one IPAddr (or often to a list of hosts with different IPAddr's).
Examples: prep.ai.mit.edu www.apache.org.
Note: In many situations, it is more effective to specify an IPAddr in place of a Hostname since a DNS lookup can be avoided. Name resolution in Apache can take a remarkable deal of time when the connection to the name server uses a slow PPP link.
Note: Hostname 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 指令

说明:Words, hosts, or domains that are banned from being proxied
语法:ProxyBlock *|word|host|domain [word|host|domain] ...
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

The ProxyBlock directive specifies a list of words, hosts and/or domains, separated by spaces. HTTP, HTTPS, and FTP document requests to sites whose names contain matched words, hosts or domains are blocked by the proxy server. The proxy module will also attempt to determine IP addresses of list items which may be hostnames during startup, and cache them for match test as well. Example:

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

'rocky.wotsamattau.edu' would also be matched if referenced by IP address.

Note that 'wotsamattau' would also be sufficient to match 'wotsamattau.edu'.

Note also that

ProxyBlock *

blocks connections to all sites.

top

ProxyDomain 指令

说明:Default domain name for proxied requests
语法:ProxyDomain Domain
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

This directive is only useful for Apache proxy servers within intranets. The ProxyDomain directive specifies the default domain which the apache proxy server will belong to. If a request to a host without a domain name is encountered, a redirection response to the same host with the configured Domain appended will be generated.

Example

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

top

ProxyErrorOverride 指令

说明:Override error pages for proxied content
语法:ProxyErrorOverride On|Off
默认值:ProxyErrorOverride Off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:Available in version 2.0 and later

This directive is useful for reverse-proxy setups, where you want to have a common look and feel on the error pages seen by the end user. This also allows for included files (via mod_include's SSI) to get the error code and act accordingly (default behavior would display the error page of the proxied server, turning this on shows the SSI Error message).

top

ProxyIOBufferSize 指令

说明:IO buffer size for outgoing HTTP and FTP connections
语法:ProxyIOBufferSize bytes
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
top

<ProxyMatch> 指令

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

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

top

ProxyMaxForwards 指令

说明:Maximium number of proxies that a request can be forwarded through
语法:ProxyMaxForwards number
默认值:ProxyMaxForwards 10
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:Available in Apache 2.0 and later

The ProxyMaxForwards directive specifies the maximum number of proxies through which a request may pass. This is set to prevent infinite proxy loops, or a DoS attack.

Example

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。 HTTP redirect responses. This is essential when Apache is used as a reverse proxy to avoid by-passing the reverse proxy because of HTTP redirects on the backend servers which stay behind the reverse proxy.

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

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

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

will not only cause a local request for the <http://wibble.org/mirror/foo/bar> to be internally converted into a proxy request to <http://foo.com/bar> (the functionality ProxyPass provides here). It also takes care of redirects the server foo.com sends: when http://foo.com/bar is redirected by him to http://foo.com/quux Apache adjusts this to http://wibble.org/mirror/foo/quux before forwarding the HTTP redirect response to the client. Note that the hostname used for constructing the URL is chosen in respect to the setting of the UseCanonicalName directive.

Note that this ProxyPassReverse directive can also be used in conjunction with the proxy pass-through feature ("RewriteRule ... [P]") from mod_rewrite because its doesn't depend on a corresponding ProxyPass directive.

When used inside a <Location> section, the first argument is ommitted and the local directory is obtained from the <Location>.

top

ProxyPreserveHost 指令

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

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

此选项一般为禁用状态。

top

ProxyReceiveBufferSize 指令

说明:Network buffer size for outgoing HTTP and FTP connections
语法:ProxyReceiveBufferSize bytes
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

The ProxyReceiveBufferSize directive specifies an explicit network buffer size for outgoing HTTP and FTP connections, for increased throughput. It has to be greater than 512 or set to 0 to indicate that the system's default buffer size should be used.

Example

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

说明:Network timeout for proxied requests
语法:ProxyTimeout seconds
默认值:ProxyTimeout 300
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy
兼容性:Available in Apache 2.0.31 and later

This directive allows a user to specifiy a timeout on proxy requests. This is usefull when you have a slow/buggy appserver which hangs, and you would rather just return a timeout and fail gracefully instead of waiting however long it takes the server to return

top

ProxyVia 指令

说明:Information provided in the Via HTTP response header for proxied requests
语法:ProxyVia on|off|full|block
默认值:ProxyVia off
上下文:服务器配置, 虚拟主机
状态:Extension
模块:mod_proxy

This directive controls the use of the Via: HTTP header by the proxy. Its intended use is to control the flow of of proxy requests along a chain of proxy servers. See RFC2068 (HTTP/1.1) for an explanation of Via: header lines.

 


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

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