R-Proxy - 使用Apache架设
时间:2006-06-13 来源:softiger
适用对象: 防火墙或系统管理员.
适用条件: 对 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 / http://192.168.1.7/ |
上面那个 / 是指 Web 根目录,后面的网址是内部的 Web 主机位置. |
Ok!完成,可以用 Bro |
wser 连到你架的 R-Proxy 主机 |
试试,若是 R-Proxy 架在 |
Firewall 上,可能要把 httpd por 发现,你连到 R-Proxy 主机的网页内容就 |
t 作适度的开放,但不再需要作转 port 的动作,你会 是你指定的那台 Web 主机. |
你也可以把网页分散 来分,设定的方法像: |
在不同的主机上,因为只有一个 |
Web 主目录,所以可以依Web 目录 |
ProxyPass / http://1 |
92.168.1.3/ |
ProxyPass /webma |
il http://192.168.1.2/webma |
il/ |
ProxyPass /sales |
http://192.168.1.7/ |
ProxyPass /bbs http://1 |
92.168.1.10:8888/ |
这边有个重点,就是 第 1 跟第 2 行执行应该不 对,特别是该目录有又有次 作,所以可能需要另外搭配 |
各主机网页的目录结构位置最好 会有问题,不过第 3, 4 行,就不 目录时,因为这 R-Proxy 是作代 ProxyPassReverse 的指令.就像 |
也是依循Web主目录的结构,像上面 一定可行,因为 Web 路径可能会不 理存取的动作,而不是作转址的动 这样: |
ProxyPass / ht |
tp://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. /images 这个错误路径,不 以"相对位置"的方式撰写, |
168.1.2/webmail/images 就会 过还需注意的,就是次目录的指 使用"绝对位置"的方式还是有出 |
转到 /webmail/images 去,而不是 定在网页程序内的写法,还是必须 错的可能. |
我测试的 Apache pr |
oxy module 是不提供轮询的功 |
能,所以假如你的设定是下: |
ProxyPass / |
http://192.168.1.3/ |
ProxyPass / |
http://192.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 |
http://httpd.a |
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 |
http://tst.sin |
ica.edu.tw/manual/ibm/index. |
html |
第二单元: R-Proxy 的分散负载及主机容错 |
在上一个单元内,可以发现基本的 而且一个网页目录只能连结一台主机,当 |
R-Proxy 只能单纯的依网页目录分散在不同的主机, 某台主机当机,该连结的网页目录便失效了,这种 |
单一静态的分散服务及缺乏容错机制的功能,并不是较好的 R-Proxy 功能. |
在 http://pihl.kumpu.org/mod_c |
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] |
/]+)/(.*) http://$1/$2 |
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 / http://w3.test.com/ |
ProxyPassReverse / http: |
//w4.test.com/ |
ProxyPassRever |
se / http://w5.test.com/ |
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 |
http://httpd.a |
pache.org/docs/mod/mod_rewri |
te.html |
2.Apache URL Rewriting Guide |
http://www.engelschall.com |
/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 |
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 还是有加载,所以 ProxyRequests 的功能, |
ProxyPass 的功能还是存在,只是没有 |
而且也就没有 Cache 的支持,不过, 间的整合性问题, |
安全性才是首要考量的,至于 R-Proxy 跟 Firewall |
可以参考下面参考资料中的第二篇文章. |
参考资料: |
1.Apache - module mod_proxy |
http://httpd.a |
pache.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/ht |
tpd/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或把某几行的#拿掉 |
##别忘了这一行,不然您的网页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 / http://192.168.2.5/ |
ProxyPassReverse / http://192.168.2.5/ |
Step 7. |
#激活apache |
/usr/local/apache2/httpd -f ./co |
nf/httpd.conf -k start |
相关阅读 更多 +