📄 mod_proxy.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="../style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>mod_proxy - Apache 2.2 中文版参考手册</title>
</head>
<body><div id="page-header">
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="../index.html">版本2.2</a> > <a href="./index.html">模块</a></div>
<div id="translation-info"> <a href="../translator_announcement.html#thanks">致谢</a> | <a href="../translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:?年?月?日 | <a href="../translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>Apache模块 mod_proxy</h1>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="module">
<tr><th><a href="module-dict.html#Description">说明</a></th><td>提供HTTP/1.1的代理/网关功能支持</td></tr>
<tr><th><a href="module-dict.html#Status">状态</a></th><td>扩展(E)</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">模块名</a></th><td>proxy_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">源文件</a></th><td>mod_proxy.c</td></tr>
</table>
<h3>概述</h3>
<div class="warning"><h3>警告</h3>
<p>在您没有对服务器<a href="#access">采取安全措施</a>之前,请不要用<code class="directive"><a href="#proxyrequests">ProxyRequests</a></code>启用代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。</p>
</div>
<p>此模块实现了Apache的代理/网关。它实现了以下规范的代理:<code>AJP13</code>(Apache JServe Protocol v1.3), <code>FTP</code>, <code>CONNECT</code>(用于SSL), <code>HTTP/0.9</code>, <code>HTTP/1.0</code>, <code>HTTP/1.1</code> 。此模块经配置后可用上述或其它协议连接其它代理模块。</p>
<p>Apache的代理功能(除<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>以外)被划分到了几个不同的模块中:<code class="module"><a href="../mod/mod_proxy_http.html">mod_proxy_http</a></code>, <code class="module"><a href="../mod/mod_proxy_ftp.html">mod_proxy_ftp</a></code>, <code class="module"><a href="../mod/mod_proxy_ajp.html">mod_proxy_ajp</a></code>, <code class="module"><a href="../mod/mod_proxy_balancer.html">mod_proxy_balancer</a></code>, <code class="module"><a href="../mod/mod_proxy_connect.html">mod_proxy_connect</a></code> 。这样,如果想使用一个或多个代理功能,就必须将<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code><em>和</em>对应的模块同时加载到服务器中(静态连接或用<code class="directive"><a href="../mod/mod_so.html#loadmodule">LoadModule</a></code>动态加载)。</p>
<p>另外,其它模块还提供了扩展特性。<code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>及其相关模块提供了缓冲特性。<code class="module"><a href="../mod/mod_ssl.html">mod_ssl</a></code>提供的<code>SSLProxy*</code>系列指令可以使用SSL/TLS连接远程服务器。这些提供扩展特性的模块必须在被正确加载和配置以后才能提供这些扩展功能。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="forwardreverse" id="forwardreverse">正向和反向代理</a></h2>
<p>Apache可以被配置为<dfn>正向(forward)</dfn>和<dfn>反向(reverse)</dfn>代理。</p>
<p><dfn>正向代理</dfn>是一个位于客户端和<em>原始服务器(origin server)</em>之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。</p>
<p>正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由<code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>提供)减少网络使用率。</p>
<p>使用<code class="directive"><a href="#proxyrequests">ProxyRequests</a></code>指令即可激活正向代理。因为正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须<a href="#access">采取安全措施</a>以确保仅为经过授权的客户端提供服务。</p>
<p><dfn>反向代理</dfn>正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的名字空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。</p>
<p>反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。</p>
<p>可以使用<code class="directive"><a href="#proxypass">ProxyPass</a></code>指令激活反向代理(在<code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>指令中使用<code>[P]</code>标记也可以)。配置反向代理并<strong>不需要</strong>打开<code class="directive"><a href="#proxyrequests">ProxyRequests</a></code>指令。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="examples" id="examples">简单示例</a></h2>
<p>下面的例子仅仅是为了给你一个基本概念而帮助入门而已,请仔细阅读每个指令的文档。</p>
<p>另外,如果想使用缓冲特性,请查看<code class="module"><a href="../mod/mod_cache.html">mod_cache</a></code>文档。</p>
<div class="example"><h3>正向代理</h3><p><code>
ProxyRequests On<br />
ProxyVia On<br />
<br />
<Proxy *><br />
<span class="indent">
Order deny,allow<br />
Deny from all<br />
Allow from internal.example.com<br />
</span>
</Proxy>
</code></p></div>
<div class="example"><h3>反向代理</h3><p><code>
ProxyRequests Off<br />
<br />
<Proxy *><br />
<span class="indent">
Order deny,allow<br />
Allow from all<br />
</span>
</Proxy><br />
<br />
ProxyPass /foo http://foo.example.com/bar<br />
ProxyPassReverse /foo http://foo.example.com/bar
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="access" id="access">控制对代理服务器的访问</a></h2>
<p>您可以通过<code class="directive"><a href="#proxy"><Proxy></a></code>的阻止功能来控制谁能访问您的代理。示例如下:</p>
<div class="example"><p><code>
<Proxy *><br />
<span class="indent">
Order Deny,Allow<br />
Deny from all<br />
Allow from 192.168.0<br />
</span>
</Proxy>
</code></p></div>
<p>要了解更多访问控制信息,请参见<code class="module"><a href="../mod/mod_authz_host.html">mod_authz_host</a></code>文档。</p>
<p>使用正向代理时严格控制访问权限(使用<code class="directive"><a href="#proxyrequests">ProxyRequests</a></code>指令)是非常重要的。否则你的代理会被客户端利用来访问其它服务器并且隐藏客户端的真实身份。这不仅对您的网络有威胁,对整个因特网来说也同样如此。当使用反向代理(在"<code>ProxyRequests Off</code>"条件下使用<code class="directive"><a href="#proxypass">ProxyPass</a></code>指令)的时候访问控制要相对宽松,因为客户端只能连接你配置的特定主机。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="startup" id="startup">缓慢启动</a></h2>
<p>如果您使用了<code class="directive"><a href="#proxyblock">ProxyBlock</a></code>指令,将会在启动时查找并缓存主机名的IP地址以备后继的匹配测试使用。这将会花费几秒或更长的时间,这主要取决于主机名查找的速度。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="intranet" id="intranet">局域网代理</a></h2>
<p>位于局域网内的Apache代理服务器需要经由公司的防火墙转发对外部的请求(使用<code class="directive"><a href="#proxyremote">ProxyRemote</a></code>指令来配置)。但当它访问局域网内的资源时,它能越过防火墙直接访问目的主机。在访问一个属于局域网的服务器从而进行直接连接时,<code class="directive"><a href="#noproxy">NoProxy</a></code>指令就会很有用。</p>
<p>局域网内的用户习惯于不在他们的WWW请求中加入本地域的名称,于是会使用"http://somehost/"来取代<code>http://somehost.example.com/</code> 。一些商业代理服务器会不管这些,只是采用本地域的配置来简单的伺服这个请求。当使用了<code class="directive"><a href="#proxydomain">ProxyDomain</a></code>指令来为服务器<a href="#proxyrequests">配置了一个代理服务</a>时,Apache会发出一个重定向应答,以使客户端请求到达正确的、能满足要求的服务器地址。因为这样一来,用户的书签文件就会随之包含完整的主机名,所以这是首选的方法。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="envsettings" id="envsettings">协议调整</a></h2>
<p>当<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>向一个没有正确实现持久连接(KeepAlive)或HTTP/1.1的原始服务器发送请求的时候,可以通过设置两个<a href="../env.html">环境变量</a>来发送不带持久连接(KeepAlive)的HTTP/1.0请求。这两个变量是通过<code class="directive"><a href="../mod/mod_env.html#setenv">SetEnv</a></code>指令设置的。</p>
<p>以下是<code>force-proxy-request-1.0</code>和<code>proxy-nokeepalive</code>的例子:</p>
<div class="example"><p><code>
<Location /buggyappserver/><br />
<span class="indent">
ProxyPass http://buggyappserver:7001/foo/<br />
SetEnv force-proxy-request-1.0 1<br />
SetEnv proxy-nokeepalive 1<br />
</span>
</Location>
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="request-bodies" id="request-bodies">请求体</a></h2>
<p>一些请求方法(如POST)包含一个请求体。HTTP协议要求包含请求体的请求或者使用块传输编码(chunked transfer encoding)或者包含一个<code>Content-Length</code>请求头。当将这种请求传递给原始服务器的时候,<code class="module"><a href="../mod/mod_proxy_http.html">mod_proxy_http</a></code>会始终尝试使用<code>Content-Length</code>请求头。但如果原始请求使用的是块编码,那么块编码也同样可以用于上行请求。可以使用<a href="../env.html">环境变量</a>控制这种选择。设置<code>proxy-sendcl</code>可以确保始终发送<code>Content-Length</code>头以与上游服务器保持最大程度的兼容性,而设置<code>proxy-sendchunked</code>可以通过继续使用块编码以尽可能最小化资源占用率。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="AllowCONNECT" id="AllowCONNECT">AllowCONNECT</a> <a name="allowconnect" id="allowconnect">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>通过代理允许<code>CONNECT</code>的端口号</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>AllowCONNECT <var>port</var> [<var>port</var>] ...</code></td></tr>
<tr><th><a href="directive-dict.html#Default">默认值</a></th><td><code>AllowCONNECT 443 563</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>扩展(E)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_proxy</td></tr>
</table>
<p><code class="directive">AllowCONNECT</code>指令指定了此代理的<code>CONNECT</code>方法可以连接的端口号列表。当今的浏览器在进行<code>https</code>连接请求时使用这种方法,而代理默认会将其转为<code>http</code>。</p>
<p>默认只启用了默认的https端口(<code>443</code>)和默认的snews端口(<code>563</code>)。使用<code class="directive">AllowCONNECT</code>指令可以覆盖默认设置而改为仅允许连接列出的端口。</p>
<p>注意,必须确保<code class="module"><a href="../mod/mod_proxy_connect.html">mod_proxy_connect</a></code>也同时存在于服务器中,这样才能支持<code>CONNECT</code> 。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="NoProxy" id="NoProxy">NoProxy</a> <a name="noproxy" id="noproxy">指令</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="directive">
<tr><th><a href="directive-dict.html#Description">说明</a></th><td>直接进行连接的主机/域/网络</td></tr>
<tr><th><a href="directive-dict.html#Syntax">语法</a></th><td><code>NoProxy <var>host</var> [<var>host</var>] ...</code></td></tr>
<tr><th><a href="directive-dict.html#Context">作用域</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">状态</a></th><td>扩展(E)</td></tr>
<tr><th><a href="directive-dict.html#Module">模块</a></th><td>mod_proxy</td></tr>
</table>
<p>此指令仅适用于局域网内的Apache代理服务器。<code class="directive">NoProxy</code>指令指定了一个中间以空格分隔的子网、IP地址、主机和/或域的列表。对某个匹配上述一个或多个列表项的主机的请求将直接被其伺服而不会转交到配置好的<code class="directive"><a href="#proxyremote">ProxyRemote</a></code>代理服务器。</p>
<div class="example"><h3>示例</h3><p><code>
ProxyRemote * http://firewall.mycompany.com:81<br />
NoProxy .mycompany.com 192.168.112.0/21
</code></p></div>
<p><code class="directive">NoProxy</code>指令的<var>host</var>参数可以是以下选项之一:</p>
<dl>
<dt><var><a name="domain" id="domain">域</a></var></dt>
<dd>
<p><dfn>域</dfn>是一个DNS域名的一部分,并在前面加上点号。它表示一批逻辑上属于同一个DNS区域的主机,也就是所有这些主机名具有相同的后缀,而这个"后缀"就是<dfn>域</dfn>。</p>
<div class="example"><h3>例子</h3><p><code>
.com<br />.apache.org.
</code></p></div>
<p><var>域</var>和<var><a href="#hostname">主机名</a></var>(一个DNS域甚至也可能有一条DNS"A记录"!)的不同之处在于<var>域</var>始终有一个前导点。</p>
<div class="note"><h3>注意</h3>
<p>域名不区分大小写并且始终认为是锚定在DNS树根上的,因此<code>.MyDomain.com</code>和<code>.mydomain.com.</code>(注意结尾点号)是完全等同的。因为域的比较不需要进行DNS查询,因此它比子网比较更加高效。</p>
</div></dd>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -