R-Proxy-使用Apache架设

ZDNet软件频道 时间:2008-08-15 作者: | LUPA开源社区 我要评论()
本文关键词:架设 Apache R-Proxy- Linux
适用对象: 防火墙或系统管理员.   适用条件: 对 Linux 环境有基础的管理及操作能力.
本文共分四个单元,第一单元是简介 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
   AddModule mod_rewrite.c
  
   首先,启用 Apache Server Status 功能,找到下面这一段,把前的 # 号拿掉,并适当的修改
  Allow from 的位置:
  
   SetHandler server-status
   Order deny,allow
   Deny from all
   Allow from .yourdomain.com
  
   再来,在 httpd.conf 内加入 Rewrite 模块的设定,像下面:
  
   # Rewrite
  
   RewriteEngine on
   RewriteLogLevel 0
  
   RewriteMap server rnd:/etc/httpd/conf/rproxy-server
  
   RewriteRule ^/rproxy-status.* - [L]
   RewriteRule ^(http|ftp)://.* - [F]
  
   RewriteRule ^/(.*.(cgi|shtml))$ to://$/ [S=1]
   RewriteRule ^/(.*)$ to://$/
  
   RewriteRule ^to://([^/]+)/(.*) http:/// [E=SERVER:,P,L]
  
  RewriteRule .* - [F]
  
  上面的 RewriteMap 后面是指定一个设定档,设定档内是所有要当作分散负载的主机群成员
  位置,主机的性质有两种,一种是只有存有静态资料的 Static 主机,另一种是存有 cgi 及 shtml
  (Server Side Include )的动态处理,假如有数台 Web 主机,就可以将它们的位置设定在上面
  所指定的 rproxy-server 内,内容像下面:
  
   static w1.test.com|w2.test.com|w3.test.com|w4.test.com
   dynamic w5.test.com|w6.test.com
  
   然后在 httpd.conf 内把 proxy 模块的设定加入,像下面:
  
   ProxyRequests On
   NoCache *
   ProxyPassReverse / http://w1.test.com/
   ProxyPassReverse / http://w2.test.com/
   ProxyPassReverse / http://w3.test.com/
   ProxyPassReverse / http://w4.test.com/
   ProxyPassReverse / http://w5.test.com/
   ProxyPassReverse / http://w6.test.com/
  
  再来只要重新激活 httpd 就可以了,你可以先在这 6 台 Web 主机存放不同的网页内容,再使用
  Browser 联机测试,你可以发现网页的内容,会在一直不断的轮询,若是将其中一台主机离线,再测试,
  你可以发现并不会发生联机错误,也就是说 proxy + rewrite 的 R-Proxy 功能,除了会分散负载,
  还有主机容错的功能.
  
   等要正试上线时,只要定时同步这 6 台网页主机的内容,而 cgi 动态处理部份是由于上面范例中的
  w5,w6 两台主机来处理. httpd log 部份如同第一单位所说, Client 的真实 IP 只会存在于 R-Proxy
  那台的 httpd log 内,而其它所有的 Web 主机,只会记录 R-Proxy 主机 IP 来存取.
  
   目前上面这些设定的环境,都是以主机同时存在同一个地方为主,要作到异地的 Web 网站平衡负载,
  就要搭配 DNS Round-Robin 的方式来达成.
  
   利用 R-Proxy 的作法是比 Linux LVS 的作法单纯而且简单多,假如在 Rewrite 内多加一些权重的
  计算及分配, R-Proxy 所以提供的功能并不会输给 Linux LVS, 功能上主要的差别应该是 Linux LVS
  可以提供多台 Cluster 的 Controler, 而且可以自动备援切换.
  
   参考资料:
  
   1.Apache module mod_rewrite
   http://httpd.Apache.org/docs/mod/mod_rewrite.html
  
   2.Apache URL Rewriting Guide
   http://www.engelschall.com/pw/Apache/rewriteguide/
  
  第三单元: Apache 1.3 mod_proxy 模块安全性问题
  
   有许多网友跟我反应,架了 R-Proxy Server 后, Web 主机让外人当成 Public Proxy Server 存取,造成网络流量的突增及管理上的问题.
  
   我找了很多的文章及讨论,用人说改用 Apache 2 的 ProxyMatch 方式,或是用 Rewrite Rules 去限制,
  不过似乎都没办法彻底解决这个问题.有一天,我不小心才看到下面 Apache mod_proxy 网站上的一段文字:
  
   Warning: Do not enable proxying with ProxyRequests until you have secured your server.
   Open proxy servers are dangerous both to your network and to the Internet at large.
  
   意思是大概说,假如你无法保护你的主机的安全性,那请不要把 ProxyRequests 功能打开,不然可能会影响你网络的频宽及安全.
  
   于是我找了一台 FreeBSD 4.7p3 及 Apache 1.3.27 来测试,发现其实只需要下面这几行就可以达到
  R-Proxy 的功能:
   ProxyPass /webmail http://192.168.1.2/webmail/
   ProxyPassReverse /webmail http://192.168.1.2/webmail/
  
   然后确认下面这几行前面加上 # 以取消 ProxyRequests 的功能:
  
   #ProxyRequests On
   #
   # Order deny,allow
   # Deny from all
   # Allow from .your_domain.com
   #
  
   因为 mod_proxy 还是有加载,所以 ProxyPass 的功能还是存在,只是没有 ProxyRequests 的功能,
  而且也就没有 Cache 的支持,不过,安全性才是首要考量的,至于 R-Proxy 跟 Firewall 间的整合性问题,
  可以参考下面参考资料中的第二篇文章.
  
   参考资料:
  
   1.Apache - module mod_proxy
   http://httpd.Apache.org/docs/mod/mod_proxy.html
  
   2.A Reverse Proxy Is A Proxy By Any Other Name
   http://www.sans.org/rr/web/reverse_proxy.php
  
  第四单元: Apache 2.0.43 reverse proxy的安装方式
   (本单元由 kefore 网友热情提供分享)
  
  tall ball的位置:
  http://Apache.oregonstate.edu/httpd/httpd-2.0.43.tar.gz
  
  主要功能:
  替 Internet 的使用者代理存取内部受限制的网站
   安装步骤:
  
  Step 1.
  wget http://Apache.oregonstate.edu/httpd/httpd-2.0.43.tar.gz
  
  Step 2.
  tar -zvxf httpd-2.0.43.tar.gz
  
  Step 3.
  cd httpd-2.0.43
  
  Step 4.
  ##激活proxy模块及安装于/usr/local/Apache2
  ./configure --prefix="/usr/local/Apache2" --enable-proxy=shared
  
  Step 5.
  make;make install
  
  Step 6.
  ##修改httpd.conf檔
  vi /usr/local/Apache2/httpd/httpd.conf
  在里面加W或把某几行的#拿掉
  
  ##别忘了这一行,不然您的网页default charset将会是ISO-8859-1
  AddDefaultCharset Big5
  
  LoadModule proxy_module /usr/local/Apache2/modules/mod_proxy.so
  LoadModule proxy_connect_module /usr/local/Apache2/modules/mod_proxy_connect.so
  LoadModule proxy_http_module /usr/local/Apache2/modules/mod_proxy_http.so
  
  ProxyPass / http://192.168.2.5/
  ProxyPassReverse / http://192.168.2.5/
  
  Step 7.
  #激活Apache
  /usr/local/Apache2/httpd -f ./conf/httpd.conf -k start

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134