此模块实现了Apache的代理/网关。它实现了以下规范的代理:AJP13
(Apache JServe Protocol v1.3), FTP
, CONNECT
(用于SSL), HTTP/0.9
, HTTP/1.0
, HTTP/1.1
。此模块经配置后可用上述或其它协议连接其它代理模块。
Apache的代理功能(除mod_proxy
以外)被划分到了几个不同的模块中:mod_proxy_http
, mod_proxy_ftp
, mod_proxy_ajp
, mod_proxy_balancer
, mod_proxy_connect
。这样,如果想使用一个或多个代理功能,就必须将mod_proxy
和对应的模块同时加载到服务器中(静态连接或用LoadModule
动态加载)。
另外,其它模块还提供了扩展特性。mod_cache
及其相关模块提供了缓冲特性。mod_ssl
提供的SSLProxy*
系列指令可以使用SSL/TLS连接远程服务器。这些提供扩展特性的模块必须在被正确加载和配置以后才能提供这些扩展功能。
Apache可以被配置为正向(forward)和反向(reverse)代理。
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache
提供)减少网络使用率。
使用ProxyRequests
指令即可激活正向代理。因为正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
可以使用ProxyPass
指令激活反向代理(在RewriteRule
指令中使用[P]
标记也可以)。配置反向代理并不需要打开ProxyRequests
指令。
ProxyRequests On
ProxyVia On
Order deny,allow
Deny from all
Allow from internal.example.com
ProxyRequests Off
Order deny,allow
Allow from all
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar
严格控制访问权限
您可以通过
的阻止功能来控制谁能访问您的代理。示例如下:
Order Deny,Allow
Deny from all
Allow from 192.168.0
要了解更多访问控制信息,请参见
mod_authz_host
文档。
使用正向代理时严格控制访问权限(使用
ProxyRequests
指令)是非常重要的。否则你的代理会被客户端利用来访问其它服务器并且隐藏客户端的真实身份。这不仅对您的网络有威胁,对整个因特网来说也同样如此。当使用反向代理(在"ProxyRequests Off
"条件下使用ProxyPass
指令)的时候访问控制要相对宽松,因为客户端只能连接你配置的特定主机
局域网内代理
位于局域网内的Apache代理服务器需要经由公司的防火墙转发对外部的请求(使用
ProxyRemote
指令来配置)。但当它访问局域网内的资源时,它能越过防火墙直接访问目的主机。在访问一个属于局域网的服务器从而进行直接连接时,NoProxy
指令就会很有用。
局域网内的用户习惯于不在他们的WWW请求中加入本地域的名称,于是会使用"http://somehost/"来取代
http://somehost.example.com/
。一些商业代理服务器会不管这些,只是采用本地域的配置来简单的伺服这个请求。当使用了ProxyDomain
指令来为服务器配置了一个代理服务时,Apache会发出一个重定向应答,以使客户端请求到达正确的、能满足要求的服务器地址。因为这样一来,用户的书签文件就会随之包含完整的主机名,所以这是首选的方法。
协议调整 1.1 变成 1.0
当
mod_proxy
向一个没有正确实现持久连接(KeepAlive)或HTTP/1.1的原始服务器发送请求的时候,可以通过设置两个环境变量来发送不带持久连接(KeepAlive)的HTTP/1.0请求。这两个变量是通过SetEnv
指令设置的。
以下是
force-proxy-request-1.0
和proxy-nokeepalive
的例子:
ProxyPass http://buggyappserver:7001/foo/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
说明 通过代理允许CONNECT
的端口号 语法 AllowCONNECT port [port] ...
默认值 AllowCONNECT 443 563
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
AllowCONNECT
指令指定了此代理的CONNECT
方法可以连接的端口号列表。当今的浏览器在进行https
连接请求时使用这种方法,而代理默认会将其转为http
。
默认只启用了默认的https端口(
443
)和默认的snews端口(563
)。使用AllowCONNECT
指令可以覆盖默认设置而改为仅允许连接列出的端口。
注意,必须确保
mod_proxy_connect
也同时存在于服务器中,这样才能支持CONNECT
说明 直接进行连接的主机/域/网络 语法 NoProxy host [host] ...
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
此指令仅适用于局域网内的Apache代理服务器。
NoProxy
指令指定了一个中间以空格分隔的子网、IP地址、主机和/或域的列表。对某个匹配上述一个或多个列表项的主机的请求将直接被其伺服而不会转交到配置好的ProxyRemote
代理服务器。
示例
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
说明 应用于所代理资源的容器 语法 ...
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
位于
配置段中的指令仅作用于匹配的代理内容。语句中可以使用shell风格的通配符。
比如说:下例仅允许
yournetwork.example.com
中的主机通过您的代理服务器访问代理内容:
Order Deny,Allow
Deny from all
Allow from yournetwork.example.com
下例将在所有
example.com
的foo
目录下的文件通过代理服务器发送之前用INCLUDES
过滤器进行处理:
SetOutputFilter INCLUDES
说明 设置被代理屏蔽的语句、主机、域 语法 ProxyBlock *|word|host|domain [word|host|domain] ...
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
ProxyBlock
指令指定了一个由空格分隔的语句、主机和/或域的列表。对所有匹配这些语句、主机和/或域的HTTP、HTTPS、FTP文档的请求都将被代理服务器阻断。代理模块亦会在启动时尝试确定列表中可能是主机名的项目对应的IP地址,并将其缓冲用于匹配测试。比如说:
示例
ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu
通过IP地址,
rocky.wotsamattau.edu
将可能同样被匹配。
请注意,
wotsamattau
已经足够匹配wotsamattau.edu
了。
请注意
ProxyBlock *
将屏蔽对所有站点的连接。
说明 代理请求的默认域名 语法 ProxyDomain Domain
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
此指令仅对位于局域网内的Apache代理服务器有用。
ProxyDomain
指令指定了apache代理服务器归属的默认域。如果遇到了一个对没有域名的主机的请求,就会根据配置自动生成一个加上了Domain的重定向应答。
示例
ProxyRemote * http://firewall.mycompany.com:81
NoProxy .mycompany.com 192.168.112.0/21
ProxyDomain .mycompany.com
说明 覆盖代理内容的错误页 语法 ProxyErrorOverride On|Off
默认值 ProxyErrorOverride Off
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy 兼容性 仅在 Apache 2.0 及以后的版本中可用
此指令用于反向代理设置中您想为最终用户提供观感一致的错误页面时。它也同样允许包含文件(通过
mod_include
的SSI)获取错误号并作出相应的动作。(默认行为是显示被代理的服务器的错误页面,将此项目设为"On"将显示SSI错误信息。)
说明 将一个远端服务器映射到本地服务器的URL空间中 语法 ProxyPass [path] !|url [key=value key=value ...]]
作用域 server config, virtual host, directory 状态 扩展(E) 模块 mod_proxy
该指令允许你将一个远端服务器映射到本地服务器的URL空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。path是一个本地虚拟路径名,url是一个指向远程服务器的部分URL,并且不允许包含查询字符串。
当使用ProxyPass
指令时,ProxyRequests
指令通常应当被设为 off 。
假设本地服务器地址是:
http://example.com/
,那么,
ProxyPass /mirror/foo/ http://backend.example.com/
将会导致对
http://example.com/mirror/foo/bar
的本地请求将会在内部转换为一个代理请求:http://backend.example.com/bar
。
"
!
"指令对于您不想对某个子目录进行反向代理时很有用。比如说:
ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.example.com
将会代理除
/mirror/foo/i
之外的所有对backend.example.com
下/mirror/foo
的请求。
注意
顺序很重要,您需要把拒绝指令放置在普通
ProxyPass
指令之前。
ProxyPassReverse 指令
说明 调整由反向代理服务器发送的HTTP应答头中的URL 语法 ProxyPassReverse [path] url
作用域 server config, virtual host, directory 状态 扩展(E) 模块 mod_proxy
此指令使Apache调整HTTP重定向应答中
Location
, Content-Location
, URI
头里的URL。这样可以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题。
只有明确指定的应答头会被重写,其它应答头保持不变,并且HTML页面中的URL也不会被修改。如果被代理的内容包含绝对URL引用,那么将会绕过代理。有一个第三方模块可以检查并改写HTML中的URL引用,该模块就是Nick Kew编写的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/bar
被它重定向到http://backend.example.com/quux
时,Apache会在转交HTTP重定向应答到客户端之前调整它为http://example.com/mirror/foo/quux
。注意:被用于构建URL的主机名与UseCanonicalName
指令的设置有关。
注意,此
ProxyPassReverse
指令亦可与mod_rewrite
的代理穿透特性(RewriteRule ... [P]
)联用。因为它不依赖于相应的ProxyPass
指令。
当在
配置段中使用时,第一个参数会被忽略而采用由
指令指定的本地目录。
ProxyPassReverseCookieDomain 指令
说明 Adjusts the Domain string in Set-Cookie headers from a reverse- proxied server 语法 ProxyPassReverseCookieDomain internal-domain public-domain
作用域 server config, virtual host, directory 状态 扩展(E) 模块 mod_proxy
Usage is basically similar to
ProxyPassReverse
, but instead of rewriting headers that are a URL, this rewrites the domain
string in Set-Cookie
headers.
ProxyPassReverseCookiePath 指令
说明 Adjusts the Path string in Set-Cookie headers from a reverse- proxied server 语法 ProxyPassReverseCookiePath internal-path public-path
作用域 server config, virtual host, directory 状态 扩展(E) 模块 mod_proxy
Usage is basically similar to
ProxyPassReverse
, but instead of rewriting headers that are a URL, this rewrites the path
string in Set-Cookie
headers.
ProxyPreserveHost 指令
说明 使用进入的HTTP请求头来发送代理请求 语法 ProxyPreserveHost On|Off
默认值 ProxyPreserveHost Off
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy 兼容性 仅在 Apache 2.0.31 及以后的版本中可用
当启用时,此选项将把传入请求的"Host:"行传递给被代理的主机,而不是传递在
ProxyPass
中指定的主机名。
此选项一般为
Off
状态。It is mostly useful in special configurations like proxied mass name-based virtual hosting, where the original Host header needs to be evaluated by the backend server.
ProxyReceiveBufferSize 指令
说明 代理HTTP和FTP连接的接收缓冲区大小(字节) 语法 ProxyReceiveBufferSize bytes
默认值 ProxyReceiveBufferSize 0
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
ProxyReceiveBufferSize
指令为增加的吞吐量指定了代理HTTP和FTP连接的(TCP/IP)网络接收缓冲区。这个值必须大于512
,或设置为"0
"表示使用系统默认的缓冲大小。
示例
ProxyReceiveBufferSize 2048
ProxyRemote 指令
说明 用于处理某些特定请求的远端代理 语法 ProxyRemote match remote-server
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
此指令定义了此代理的远端代理。match可以是远端服务器支持的URL形式的名称、或是远端服务器使用的部分URL、或是代表服务器可以接受所有请求的"
*
"。remote-server是远端服务器的部分URL。语法为:
remote-server = scheme://hostname[:port]
scheme是与远端服务器交换信息时使用的协议;本模块暂时只支持
http
协议。
示例
ProxyRemote http://goodguys.com/ http://mirrorguys.com:8000
ProxyRemote * http://cleversite.com
ProxyRemote ftp http://ftpproxy.mydomain.com:8080
在最后一个例子中,代理会将封装到另外一个HTTP代理请求中的FTP请求转交到另外一个能处理它们的代理去。
此选项也支持反向代理配置:一个后端web服务器可以被嵌入到一个虚拟主机的URL空间中,哪怕它是由另一个代理转交过来的。
ProxyRemoteMatch 指令
说明 处理匹配正则表达式的请求的远端代理 语法 ProxyRemoteMatch regex remote-server
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
ProxyRemoteMatch
与ProxyRemote
令基本相同。除了第一个参数是由一个请求的URL变成了匹配的正则表达式。
ProxyRequests 指令
说明 启用正向(标准)代理请求 语法 ProxyRequests On|Off
默认值 ProxyRequests Off
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
此指令将允许或禁止Apache作为正向代理服务器的功能(设置为
Off
并不会禁用ProxyPass
指令)。
在一个典型的反向代理配置中,此可选项一般设置为
Off
。
为了能够代理HTTP或FTP站点,
mod_proxy_http
或mod_proxy_ftp
必须同时存在于服务器中。
警告
在您没有对服务器采取安全措施之前,请不要用
ProxyRequests
启用您的代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。
ProxyTimeout 指令
说明 代理请求的网络超时 语法 ProxyTimeout seconds
默认值 ProxyTimeout 300
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy 兼容性 仅在 Apache 2.0.31 及以后的版本中可用
此指令允许用户对代理请求指定一个超时值。当你有一个很慢/错误多多的应用服务器经常挂起,而您宁愿返回一个超时的失败信息也不愿意继续等待不知道多久的时候,这个功能是很有用的。
ProxyVia 指令
说明 控制代理对Via
应答头的使用 语法 ProxyVia On|Off|Full|Block
默认值 ProxyVia Off
作用域 server config, virtual host 状态 扩展(E) 模块 mod_proxy
此指令控制代理对"
Via:
"头的使用。它的目的是控制位于代理服务器链中的代理请求的流向。参阅RFC 2616(HTTP/1.1)14.45小节以获得关于"Via:
"头的解释。
如果设置为默认值Off
,将不会采取特殊的处理。如果一个请求或应答包含"Via:
"头,将不进行任何修改而直接通过。 如果设置为On
每个请求和应答都会对应当前主机得到一个"Via:
"头。 如果设置为Full
,每个产生的"Via:
"头中都会额外加入Apache服务器的版本,以"Via:
"注释域出现。 如果设置为Block
,每个代理请求中的所有"Via:
"头行都将被删除。且不会产生新的"Via:
"头。