转载时请务必以超链接形式标明文章 原始出处和作者信息及本版权声明。
链接:http://www.dbasky.net/archives/2009/02/apachemod-proxy.html
由于项目需要实现一个域名代理的功能
比如:
a.com/a.html=>b.com/b.html也就是用a.com代理了所用b.com网站的请求,可以用apache的反向代理(mod_proxy)可以实现其目的.
把apache2的proxy代理模加添加进去,但ports树下面无法找到mod_proxy的ports,到官方网站了解才知道mod_proxy是本身在apache2源码中自带的,默认安装的时候没有编译进去,需要重新编译和安装整个apache2,并且编译的时候要打开WITH_PROXY_MODULES选项,但我又不想重新安装apache,所以使用以下步骤达到此目的。
1、
重新编译带有proxy模块的apache,但不安装。
#cd /usr/port/www/apache2
#make
WITH_PROXY_MODULES=yes
2、 复制编译好的mod_proxy模块到apache2的存放模块的目录下
#cd
/usr/ports/www/apache2/work/httpd-2.0.53/modules/proxy/.libs/
#cp *.so
/usr/local/libexec/apache2/
3、 在http.conf中添加以下代码来加载模块
LoadModule
proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_connect_module
libexec/apache2/mod_proxy_connect.so
LoadModule proxy_http_module
libexec/apache2/mod_proxy_http.so
LoadModule proxy_ftp_module
libexec/apache2/mod_proxy_ftp.so
<IfModule
mod_proxy.c>;
ProxyRequests On
<roxy *>;
Order
deny,allow
Allow from
all
</Proxy>;
</IfModule>;
编译mod_proxy模块的注意事项
在Linux系统下,需要给已经运行的Apache增加mod_proxy模块,编译的时候应该这样:
apxs -c -i mod_proxy.c proxy_util.c
否则你可能会收到这样的错误信息
[root@server1 proxy]# /apache/httpd/bin/apachectl configtest
httpd: Syntax
error on line 58 of /apache/httpd-2.2.3/conf/httpd.conf: Cannot load
/apache/httpd-2.2.3/modules/mod_proxy.so into server:
/apache/httpd-2.2.3/modules/mod_proxy.so: undefined symbol: proxy_lb_workers
如果你还加载了mod_proxy_ajp.so那应该
apxs -c -i mod_proxy_ajp.c ajp*.c
[root@server1 proxy]#
/apache/httpd/bin/apachectl configtest
httpd: Syntax error on line 58 of
/apache/httpd-2.2.3/conf/httpd.conf: Cannot load
/apache/httpd-2.2.3/modules/mod_proxy_ajp.so into server:
/apache/httpd-2.2.3/modules/mod_proxy_ajp.so: undefined symbol:
ajp_msg_reset
4、配置代理
1.启动apache的mod_proxy模块.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module
modules/mod_proxy_http.so
注意mod_proxy_http.so.我测试的时候没有添加这个模块怎么测试都会代理失败,后来添加了这个模块后问题消失
2.实现代理语句
ProxyPass /mirror/foo/ http://backend.example.com/
实现把当前host
/mirror/foo/目录下面的请求全都分发到backend.example.com上面去.
根据我的要求:
在a.com的文件夹目录里面加上一条
ProxyPass
/ http://b.com/
一切ok
3.进行域名代理后要注意:
3.1:网站中的url最好都用相对路径.如果用绝对路径的话容易绕过代理,这后代理服务器后面的主机就容易暴露.
3.2:注意在引用$__Server['server_name']全局变量的时候取到的是当前server_name的域名.如果想取到代理的域名则要通过$__Server['HTTP_X_FORWARDED_FOR']取得代理域名.注:一般用于写cookie之类的操作.
mod_proxy官方文档(http://httpd.apache.org/docs/2.0/mod/mod_proxy.html)
发表评论