此模块实现了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
<Proxy *>
Order deny,allow
Deny from all
Allow from internal.example.com
</Proxy>
反向代理
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar
严格控制访问权限
您可以通过<Proxy>
的阻止功能来控制谁能访问您的代理。示例如下:
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 192.168.0
</Proxy>
要了解更多访问控制信息,请参见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
的例子:
<Location /buggyappserver/>
ProxyPass http://buggyappserver:7001/foo/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
</Location>
说明
通过代理允许CONNECT
的端口号
语法
AllowCONNECT port [port] ...
默认值
AllowCONNECT 443 563
作用域
server config, virtual host
状态
扩展(E)
模块
mod_proxy
AllowCONNECT
指令指定了此代理的CONNECT
方法可以连接的端口号列表。当今的浏览器在进行https
连接请求时使用这种方法,而代理默认会将其转为http
。
默认只启用了默认的https端口(443
)和默认的snews端口(563
)。使用Allow