作者: Duncan Lo
适用对象: 防火墙或系统管理员.
适用条件: 对 Linux 环境有基础的管理及操作能力.
文章附注: 本篇文章为自由文件,欢迎非商业性质转载,并请注明出处!
商业性质转载请来信告知!
特别注意: 1.本篇文章提供之程序及设定*不一定*符合您的环境,
请依您的系统环境适当地修改程序及设定.
2.在执行任何具破坏性的动作及行为前,
请确认您已作好完整可用的资料备份工作.
3.请把整篇文章看完再发问,谢谢!
本文共分四个单元,第一单元是简介 R-Proxy 基本观念,及使用 Apache 架设
R-Proxy 的方法基本设定,第二单元是利用 Apache Rewrite 模块,使用 R-Proxy 设定
Web 主机的分散负载及主机容错的功能,第三单元是探讨 Apache 1.3 上的 mod_proxy
模块之安全性问题,第四个单元是由 kefore 网友提供的 Apache 2 上的 R-Proxy 架设
心得.
第一单元: 架设 R-Proxy
一般的 Proxy 主机,是服务内部的 Client 上网用的,通常都是用 Squid 架设,
同时为了存取效率及节省频宽, Squid 本身也提供 Cache 的功能,所以一般 Proxy主机也称为 Proxy Cache Server 代理快取服务器.
R-Proxy 本身也是一种代理服务器,那个 R 代表的是 Reverse 反向的意思,最主要的用途是反过来代理,替 Internet 的使用者代理存取内部受限制的网站,假如有开启 Cache 功能,它同样可以提供 File Cache 的功能,简单来说 R-Proxy
就像是把 Proxy 的架构及需求,反向过来,使用者角色对调的意思.详细的介绍可以参考最后面的 Netscape Proxy Server - Reverse Proxy 图文.
R-Proxy 实际应用上多与防火墙整合在一起,代理存取内部的网站,不让外部使用者直接存取内部受限制及保护之网站,或是将 Web 依目录结构由数台主机来分散服务,实测上,只要路径及设定正确,该 R-Proxy 可以支持如html,php,asp,java及cgi程序的
Web 环境.而内部的 Web 主机可以设限只有 R-Proxy 的 IP 位置才可来存取,而一般的Internet 使用者不行直接存取,相当于把 R-Proxy 当成一台虚的 Web 主机,相对的,
网站的安全性也提高了.
在使用上, Proxy Cache 需要 Clien t在 IE, Netscape 内设定,或是在 Firewall上设成通透式的Cache方式,才可以使用 Proxy Cache 的功能,但用 R-Proxy, 使用者是完全不用作任何设定,只要 Firewall 或 Web 管理员把 R-Proxy 设好就行了.
R-Proxy 的作法有很多种,使用 Apache 架设是目前最容易的方法,请特别注意,以下的教学是以 TurboLinux 7 Server 及 Apache 1.3.20 作示范,你实际的环境可能会需要作一些修改.还有以下的所说的 Proxy 是指一种功能,请不要跟 Squid 这个
作快取代理的软件弄混了...
首先,你要先确认你的 Apache 有 proxy 这个 modules, 通常在httpd.conf内
会有像下面两行的 modules 设定:
LoadModule proxy_module /usr/libexec/apache/libproxy.so
AddModule mod_proxy.c
确定 Apache 有 Proxy 这 modules 后,就可以开始来设定,找到下面这一段:
在里面加上或把某几行的#拿掉,内容大概会像这样:
ProxyRequests On
Order deny,allow
Deny from all
Allow from .your_domain.com
把 Allow from 修改成你予许的来源位置.接下要设定你要代理的Web主机位置,把设定加入:
ProxyPass / http://192.168.1.7/
上面那个 / 是指 Web 根目录,后面的网址是内部的 Web 主机位置.
Ok!完成,可以用 Browser 连到你架的 R-Proxy 主机试试,若是 R-Proxy 架在
Firewall 上,可能要把 httpd port 作适度的开放,但不再需要作转 port 的动作,你会发现,你连到 R-Proxy 主机的网页内容就是你指定的那台 Web 主机.
你也可以把网页分散在不同的主机上,因为只有一个 Web 主目录,所以可以依Web 目录来分,设定的方法像:
ProxyPass / http://192.168.1.3/
ProxyPass /webmail http://192.168.1.2/webmail/
ProxyPass /sales http://192.168.1.7/
ProxyPass /bbs http://192.168.1.10:8888/
这边有个重点,就是各主机网页的目录结构位置最好也是依循Web主目录的结构,像上面第 1 跟第 2 行执行应该不会有问题,不过第 3, 4 行,就不一定可行,因为 Web 路径可能会不对,特别是该目录有又有次目录时,因为这 R-Proxy 是作代理存取的动作,而不是作转址的动作,所以可能需要另外搭配 ProxyPassReverse 的指令.就像这样:
ProxyPass / http://192.168.1.3/
ProxyPass /webmail http://192.168.1.2/webmail/
ProxyPassReverse /webmail http://192.168.1.2/webmail/
ProxyPass /sales http://192.168.1.7/
ProxyPassReverse /sales http://192.168.1.7/
ProxyPass /bbs http://192.168.1.10:8888/
这样像 http://192.168.1.2/webmail/images 就会转到 /webmail/images 去,而不是 /images 这个错误路径,不过还需注意的,就是次目录的指定在网页程序内的写法,还是必须以"相对位置"的方式撰写,使用"绝对位置"的方式还是有出错的可能.
我测试的 Apache proxy module 是不提供轮询的功能,所以假如你的设定是下:
ProxyPass / http://192.168.1.3/
ProxyPass / http://192.168.1.2/
基本上,还是只有第 1 条设定生效,而且也不提供容错的功能,所以上面设定指的第 1 台主机挂了,网页还是连不到的,因为它不会自动启用第 2 条设定,这部份就必须要搭配 Apache的 rewrite 模块或其它具有错误侦测的 r-rproxy 模块了.
假如你想激活 Cache 功能,可以参考 Apache 设定手册,增加几个有关 Cache 的设定,
实际使用上因为 R-Proxy 也许只代理存取内部的 Web 主机, File Cache 的异动及数量不大,
在一些较复杂及中大型的 Web 网站比较适合,你可以自己斟酌要不要使用 Cache 的功能.
相关的设定参数如下:
CacheRoot "/var/proxy"
CacheSize 5
CacheGcInterval 4
CacheMaxExpire 24
CacheLastModifiedFactor 0.1
CacheDefaultExpire 1
NoCache a_domain.com another_domain.edu joes.garage_sale.com
使用了 R-Proxy 之后,还有一点不同的地方,就是 httpd log 的内容,原本让任何使用者直接
存取 Web 主机时, httpd log 内纪录的是联机 Client 的 IP 位置,但使用了 R-Proxy 后, log
内纪录的都将会是 R-Proxy 的 IP 位置,而 Client 的真实存取纪录则会纪录在 R-Proxy 内的
httpd log 内,所以要追查联机问题,则需要多检查 R-Proxy 的 httpd log 内容.
目前 R-Proxy 主机只有少数中大型网站有架设,但实际应用上, R-Proxy 是可以改善Web 存取效能,增加实体 Web 主机的安全性,我手上的有关 R-Proxy 资料还不完整,商业产品有很多已利用 R-Proxy 的观念作到多线,异地的负载平衡及容错存取,而且可以支持非 httpd服务.而在要作到像那些产品的功能可能就要考虑以 Squid 来实作 R-Proxy 功能了...
参考资料:
1.Apache - module mod_proxy
http://httpd.apache.org/docs/mod/mod_proxy.html
2.Netscape Proxy Server - Reverse Proxy
http://developer.netscape.com/docs/manuals/proxy/adminux/revpxy.htm
3.IBM HTTP Server
http://tst.sinica.edu.tw/manual/ibm/index.html
第二单元: R-Proxy 的分散负载及主机容错
在上一个单元内,可以发现基本的 R-Proxy 只能单纯的依网页目录分散在不同的主机,而且一个网页目录只能连结一台主机,当某台主机当机,该连结的网页目录便失效了,这种
单一静态的分散服务及缺乏容错机制的功能,并不是较好的 R-Proxy 功能.
在 http://pihl.kumpu.org/mod_curltunnel.html 有提供一个 CrulTunnel 模块,它
提供类似于 ProxyPass 及 ProxyPassReverse 的指令 CrulTunnelPass 及 CrulTunnelPassReverse,
安装 CurlTunnel 模块系统必需要有 http://curl.haxx.se/ 的 libcurl 函数,但实测后发现, CurlTunnel 模块只是使错误连结的 404 错误讯息不再出现,还是不提供容错的功能,所以这也不是我们想要的.
想要解决网页连结错误的问题,必须在 URL 路径发生问题时, Apache 就要自动辨识错误,并导向正确或是错误讯息响应的网址,在 Apache 中就有一个提供这样可以依条件及规则转换URL 路径的模块 - Rewrite, Apache Rewrite 模块是一个功能强大的 URL 路径维护模块,它可以依条件,规则或外部程序,资料来转换网页的 URL 路径.
以下的测试环境,同样是将 R-Proxy 架设在防火墙上,而防火墙内有数台 Web 主机.
首先,你要先确认在你主机上有 Rewrite 模块,而且在 httpd.conf 内有类似下面的设定:
LoadModule rewrite_module /usr/libexec/apache/mod_rewrite.so