apache用mod_proxy实现反向代理


转载时请务必以超链接形式标明文章 原始出处和作者信息及本版权声明
链接: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)

发表评论

Close