Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2554059
  • 博文数量: 709
  • 博客积分: 12251
  • 博客等级: 上将
  • 技术积分: 7905
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-17 00:00
个人简介

实现有价值的IT服务

文章存档

2012年(7)

2011年(147)

2009年(3)

2008年(5)

2007年(74)

2006年(431)

2005年(42)

分类: 系统运维

2006-06-13 14:00:58

适用对象: 防火墙或系统管理员.                                              
  适用条件: 对 Linux 环境有基础的管理及操作能力.                      
  文章附注: 本篇文章为自由文件,欢迎非商业性质转载,并请注明出处!            
   商业性质转载请来信告知!                                  
  特别注意: 1.本篇文章提供之程序及设定*不一定*符合您的环境,              
   请依您的系统环境适当地修改程序及设定.                
   2.在执行任何具破坏性的动作及行为前,                    
   请确认您已作好完整可用的资料备份工作.                
   3.请把整篇文章看完再发问,谢谢!                        

   本文共分四个单元,
第一单元是简介 R-Proxy 基本
观念,及使用 Apache 架设
  R-Proxy 的方法基本设
定,第二单元是利用 Apache Rew
rite 模块,使用 R-Proxy 设定
  Web 主机的分散负载及
主机容错的功能,第三单元是探
讨 Apache 1.3 上的 mod_proxy
  模块之安全性问题,第四个单元是由
kefore 网友提供的 Apache 2 上的 R-Proxy 架设
  心得.                                                                        

  第一单元: 架设 R-Proxy                                              

   一般的 Proxy 主机,是服务内部的
Client 上网用的,通常都是用 Squid 架设,
  同时为了存取效率及节
称为 Proxy Cache Server
省频宽, Squid 本身也提供 Cac
代理快取服务器.
he 的功能,所以一般 Proxy主机也


   R-Proxy 本身也是一种代理服务器
途是反过来代理,替 Internet 的使用者
,它同样可以提供 File Cache 的功能,简
,那个 R 代表的是 Reverse 反向的意思,最主要的用
代理存取内部受限制的网站,假如有开启 Cache 功能
单来说 R-Proxy
  就像是把 Proxy 的架
最后面的 Netscape Proxy
构及需求,反向过来,使用者角色
Server - Reverse Proxy 图文.
对调的意思.详细的介绍可以参考


   R-Proxy 实际应用上
接存取内部受限制及保护之
路径及设定正确,该 R-Prox
多与防火墙整合在一起,代理存
网站,或是将 Web 依目录结构由
y 可以支持如html,php,asp,jav
取内部的网站,不让外部使用者直
数台主机来分散服务,实测上,只要
a及cgi程序的
  Web 环境.而内部的 We
Internet 使用者不行直接
b 主机可以设限只有 R-Proxy
存取,相当于把 R-Proxy 当成一
的 IP 位置才可来存取,而一般的
台虚的 Web 主机,相对的,
  网站的安全性也提高了.                                                        

   在使用上, Proxy Cache 需要 Cli
成通透式的Cache方式,才可以使用 Proxy
任何设定,只要 Firewall 或 Web 管理员
en t在 IE, Netscape 内设定,或是在 Firewall上设
Cache 的功能,但用 R-Proxy, 使用者是完全不用作
把 R-Proxy 设好就行了.

   R-Proxy 的作法有很多种,使用 Ap
教学是以 TurboLinux 7 Server 及 Apac
修改.还有以下的所说的 Proxy 是指一种
ache 架设是目前最容易的方法,请特别注意,以下的
he 1.3.20 作示范,你实际的环境可能会需要作一些
功能,请不要跟 Squid 这个
  作快取代理的软件弄混了...                                                  

   首先,你要先确认你
的 Apache 有 proxy 这个 modu
les, 通常在httpd.conf内
  会有像下面两行的 modules 设定:                                      

   LoadModule proxy
_module /usr/libexec/apache/
libproxy.so
   AddModule mod_proxy.c                            

   确定 Apache 有 Proxy 这 module
s 后,就可以开始来设定,找到下面这一段:

   在里面加上或把某几行的#拿掉,内容大概会像这样:                          

   ProxyRequests On                                      
                                                                         
   Order deny,allow                                
   Deny from all                                      
   Allow from .your_domain.com          
                                                                         
   把 Allow from 修改
加入:
成你予许的来源位置.接下要设

定你要代理的Web主机位置,把设定


   ProxyPass /

   上面那个 / 是指 Web 根目录,后面的网址是内部的 Web 主机位置.

   Ok!完成,可以用 Bro
wser 连到你架的 R-Proxy 主机
试试,若是 R-Proxy 架在
   Firewall 上,可能要把 httpd por
发现,你连到 R-Proxy 主机的网页内容就
t 作适度的开放,但不再需要作转 port 的动作,你会
是你指定的那台 Web 主机.

   你也可以把网页分散
来分,设定的方法像:
在不同的主机上,因为只有一个

Web 主目录,所以可以依Web 目录


   ProxyPass /
92.168.1.3/
   ProxyPass /webma
il 92.168.1.2/webma
il/

   ProxyPass /sales
92.168.1.7/
   ProxyPass /bbs
92.168.1.10:8888/

   这边有个重点,就是
第 1 跟第 2 行执行应该不
对,特别是该目录有又有次
作,所以可能需要另外搭配
各主机网页的目录结构位置最好
会有问题,不过第 3, 4 行,就不
目录时,因为这 R-Proxy 是作代
ProxyPassReverse 的指令.就像
也是依循Web主目录的结构,像上面
一定可行,因为 Web 路径可能会不
理存取的动作,而不是作转址的动
这样:

   ProxyPass / ht
tp://192.168.1.3/
   ProxyPass /webmail
92.168.1.2/webmail/
   ProxyPassReverse
/webmail 92.168.1
.2/webmail/
   ProxyPass
/sales 92.168.1
.7/
   ProxyPassReverse /sales
92.168.1.7/
   ProxyPass /bbs
92.168.1.10:8888/

   这样像 92.
/images 这个错误路径,不
以"相对位置"的方式撰写,
168.1.2/webmail/images 就会
过还需注意的,就是次目录的指
使用"绝对位置"的方式还是有出
转到 /webmail/images 去,而不是
定在网页程序内的写法,还是必须
错的可能.

   我测试的 Apache pr
oxy module 是不提供轮询的功
能,所以假如你的设定是下:


   ProxyPass /
92.168.1.3/

   ProxyPass /
92.168.1.2/

   基本上,还是只有第
台主机挂了,网页还是连不
Apache的 rewrite 模块或
1 条设定生效,而且也不提供容
到的,因为它不会自动启用第 2
其它具有错误侦测的 r-rproxy
错的功能,所以上面设定指的第 1
条设定,这部份就必须要搭配
模块了.

   假如你想激活 Cache 功能,可以参
考 Apache 设定手册,增加几个有关 Cache 的设定,
  实际使用上因为 R-Pro
不大,
xy 也许只代理存取内部的 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 之
者直接
后,还有一点不同的地方,就是 h

ttpd log 的内容,原本让任何使用

  存取 Web 主机时, httpd log 内纪
后, log
录的是联机 Client 的 IP 位置,但使用了 R-Proxy

  内纪录的都将会是 R-P
R-Proxy 内的
roxy 的 IP 位置,而 Client 的

真实存取纪录则会纪录在

  httpd log 内,所以要
追查联机问题,则需要多检查 R-
Proxy 的 httpd log 内容.

   目前 R-Proxy 主机只有少数中大
Web 存取效能,增加实体 Web 主机的安全
有很多已利用 R-Proxy 的观念作到多线,
服务.而在要作到像那些产品的功能可能
型网站有架设,但实际应用上, R-Proxy 是可以改善
性,我手上的有关 R-Proxy 资料还不完整,商业产品
异地的负载平衡及容错存取,而且可以支持非 httpd
就要考虑以 Squid 来实作 R-Proxy 功能了...

   参考资料:                                                                
                                                                             
   1.Apache - module mod_proxy                
  
pache.org/docs/mod/mod_proxy
.html
                                                                         
   2.Netscape Proxy Server - Re
verse Proxy
   http://developer.netscape.
com/docs/manuals/proxy/adminux/revpxy.htm
                                                                     
   3.IBM HTTP Server                                    
  
ica.edu.tw/manual/ibm/index.
html

  第二单元: R-Proxy 的分散负载及主机容错                              

   在上一个单元内,可以发现基本的
而且一个网页目录只能连结一台主机,当
R-Proxy 只能单纯的依网页目录分散在不同的主机,
某台主机当机,该连结的网页目录便失效了,这种
  单一静态的分散服务及缺乏容错机制的功能,并不是较好的 R-Proxy 功能.  

   在
urltunnel.html 有提供一个 CrulTunnel 模块,它
  提供类似于 ProxyPass 及 ProxyPas
CrulTunnelPassReverse,
sReverse 的指令 CrulTunnelPass 及

  安装 CurlTunnel 模块系统必需要有
发现, CurlTunnel 模块只是使错误连结
所以这也不是我们想要的.
http://curl.haxx.se/ 的 libcurl 函数,但实测后
的 404 错误讯息不再出现,还是不提供容错的功能,


   想要解决网页连结错误的问题,必
误,并导向正确或是错误讯息响应的网址,
换URL 路径的模块 - Rewrite, Apache R
它可以依条件,规则或外部程序,资料来转
须在 URL 路径发生问题时, Apache 就要自动辨识错
在 Apache 中就有一个提供这样可以依条件及规则转
ewrite 模块是一个功能强大的 URL 路径维护模块,
换网页的 URL 路径.

   以下的测试环境,同
样是将 R-Proxy 架设在防火墙
上,而防火墙内有数台 Web 主机.

   首先,你要先确认在
定:
你主机上有 Rewrite 模块,而且

在 httpd.conf 内有类似下面的设


   LoadModule rewrite_module /u
sr/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 内加入 Rewr
ite 模块的设定,像下面:
                                                                             
   # Rewrite                                                    
                                                                         
   RewriteEngine on                            
   RewriteLogLevel 0                              

   RewriteMap server r
nd:/etc/httpd/conf/rproxy-server

   RewriteRule
^/rproxy-status.* -
[L]
   RewriteRule ^(http|ft
p)://.* - [F]

   RewriteRule ^/(.*\.(c
[S=1]
gi|shtml))$ to://${server:dynamic}/$1

   RewriteRule
^/(.*)$ t
o://${server:static}/$1

   RewriteRule ^to://([^
[E=SERVER:$1,P,L]
/]+)/(.*)


  RewriteRule .* - [F]        
                                                                         
  上面的 RewriteMap 后

面是指定一个设定档,设定档内

是所有要当作分散负载的主机群成

  位置,主机的性质有两种,一种是只有
shtml
存有静态资料的 Static 主机,另一种是存有 cgi 及

  (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/

   ProxyPassRever
se /
   ProxyPassReverse / http:
//w4.test.com/

   ProxyPassRever
se /
   ProxyPassReverse / http:
//w6.test.com/
                                                                         
  再来只要重新激活 httpd 就可以了,
再使用
你可以先在这 6 台 Web 主机存放不同的网页内容,

  Browser 联机测试,你
离线,再测试,
可以发现网页的内容,会在一直

不断的轮询,若是将其中一台主机

  你可以发现并不会发生
散负载,
联机错误,也就是说 proxy + re

write 的 R-Proxy 功能,除了会分

  还有主机容错的功能.                                                          

   等要正试上线时,只
上面范例中的
要定时同步这 6 台网页主机的

内容,而 cgi 动态处理部份是由于

  w5,w6 两台主机来处理. httpd log
在于 R-Proxy
部份如同第一单位所说, Client 的真实 IP 只会存

  那台的 httpd log 内,而其它所有的
Web 主机,只会记录 R-Proxy 主机 IP 来存取.

   目前上面这些设定的
站平衡负载,
环境,都是以主机同时存在同一

个地方为主,要作到异地的 Web 网

  就要搭配 DNS Round-Robin 的方式来达成.                      

   利用 R-Proxy 的作
加一些权重的
法是比 Linux LVS 的作法单纯

而且简单多,假如在 Rewrite 内多

  计算及分配, R-Proxy
Linux LVS
所以提供的功能并不会输给 Lin

ux LVS, 功能上主要的差别应该是

  可以提供多台 Cluster 的 Controler, 而且可以自动备援切换.

   参考资料:                                                                
                                                                             
   1.Apache module mod_rewrite                
  
pache.org/docs/mod/mod_rewri
te.html
                                                                     
   2.Apache URL Rewriting Guide              
  
/pw/apache/rewriteguide/

  第三单元: Apache 1.3 mod_proxy 模块安全性问题          

   有许多网友跟我反应
Server 存取,造成网络流量
,架了 R-Proxy Server 后, Web
的突增及管理上的问题.
主机让外人当成 Public Proxy


   我找了很多的文章及
Rewrite Rules 去限制,
讨论,用人说改用 Apache 2 的

ProxyMatch 方式,或是用

  不过似乎都没办法彻底解决这个问题
站上的一段文字:
.有一天,我不小心才看到下面 Apache mod_proxy 网


   Warning: Do not
your server.
enable proxying with ProxyRe

quests until you have secured

   Open proxy ser
Internet at large.
vers are dangerous both to y

our network and to the


   意思是大概说,假如
打开,不然可能会影响你网
你无法保护你的主机的安全性,
络的频宽及安全.
那请不要把 ProxyRequests 功能


   于是我找了一台 FreeBSD 4.7p3
行就可以达到
及 Apache 1.3.27 来测试,发现其实只需要下面这几

  R-Proxy 的功能:                                                      
   ProxyPass /webmail
92.168.1.2/webmail/
   ProxyPassReverse /webmail
92.168.1.2/webmail/

   然后确认下面这几行前面加上 #
以取消 ProxyRequests 的功能:

   #ProxyRequests On                                    
   #                                                                    
   # Order deny,allow                              
   # Deny from all                                    
   # Allow from .your_domain.com        
   #                                                                    

   因为 mod_proxy 还是有加载,所以
ProxyRequests 的功能,
ProxyPass 的功能还是存在,只是没有

  而且也就没有 Cache 的支持,不过,
间的整合性问题,
安全性才是首要考量的,至于 R-Proxy 跟 Firewall

  可以参考下面参考资料中的第二篇文章.                                          

   参考资料:                                                                
                                                                             
   1.Apache - module mod_proxy                
  
pache.org/docs/mod/mod_proxy
.html

   2.A Reverse Proxy Is A Proxy
By Any Other Name
  
/reverse_proxy.php

  第四单元: apache 2.0.43 reverse proxy的安装方式  
   (本单元由 kefore 网友热情提供分享)              
                                                                   
  tall ball的位置:                                                    
  
tpd/httpd-2.0.43.tar.gz
                                                                             
  主要功能:                                                                    
  替 Internet 的使用者代理存取内部受限制的网站                        
   安装步骤:        

  Step 1.                                                                
  wget
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或把某几行的#拿掉                                                  
                                                                               
  ##别忘了这一行,不然您的网页defa
ult charset将会是ISO-8859-1
  AddDefaultCharset Big5                                  
                                                                               
  LoadModule proxy_module /usr/loc
al/apache2/modules/mod_proxy.so
  LoadModule proxy_con
o
nect_module /usr/local/apach

e2/modules/mod_proxy_connect.s

  LoadModule proxy_htt
p_module /usr/local/apache2/
modules/mod_proxy_http.so
                                                                               
  ProxyPass / 92.168.2.5/  
  ProxyPassReverse / 92.168.2.5/  

  Step 7.                                                                
  #激活apache                                                            
  /usr/local/apache2/httpd -f ./co
nf/httpd.conf -k start
阅读(2229) | 评论(0) | 转发(0) |
0

上一篇:菜根潭

下一篇:R-Proxy - 使用Apache架设

给主人留下些什么吧!~~