Total Pageviews

Friday, 30 March 2012

用apxs编译apache的mod_proxy等模块

用apxs编译apache的mod_proxy等模块以实现负载均衡

一,查看有没有安装过mod_proxy之类的东西

[zhangy@BlackGhost ~]$ /usr/local/apache2/bin/httpd -l

如果没有发现mod_proxy,我们就到apache安装目录下的modules里面看看有没有mod_proxy.so文件,如果都没有,则说明没有加载负载均衡的模块

二,安装mod_proxy,proxy_balancer_module等

进入apache的解压目录,就是你从网上下载下来的压缩文件,然后解压产生的目录。

cd   apache的解压目录/modules/proxy

[root@BlackGhost proxy]# /usr/local/apache2/bin/apxs -c -i mod_proxy.cproxy_util.c

注意:上面如果不加proxy_util.c的话,LoadModule proxy_module modules/mod_proxy.so会报错的,提示你找不到mod_proxy.so文件

[root@BlackGhost proxy]# /usr/local/apache2/bin/apxs -c -i mod_proxy_balancer.c

[root@BlackGhost proxy]# /usr/local/apache2/bin/apxs -c -i mod_proxy_http.c

出现下面的东西说明装好了。

Libraries have been installed in:
/usr/local/apache2/modules

#要安装的模块装好了
[zhangy@BlackGhost apache2]$ ls ./modules/
httpd.exp     mod_fastcgi.so    mod_proxy.so           mod_rewrite.so
libphp5.so    mod_fcgid.so      mod_proxy_balancer.so
mod_cache.so  mod_mem_cache.so  mod_proxy_http.so

三,配置httpd.conf,测试负载均衡

1,根据请求数(默认),平均分配
LoadModule proxy_module modules/mod_proxy.so   LoadModule proxy_balancer_module modules/mod_proxy_balancer.so   LoadModule proxy_http_module modules/mod_proxy_http.so     ProxyRequests Off   <Proxy balancer://clusterphpinfo>   BalancerMember http://192.168.18.2:10004   BalancerMember http://192.168.18.2:10000   </Proxy>   ProxyPass /test2 balancer://clusterphpinfo stickysession=STICK_PORT_TOKEN nofailover=On   ProxyPassReverse /test2 balancer://clusterphpinfo     <Location /balancer-manager>   SetHandler balancer-manager   Order Deny,Allow   Allow from all   #Allow from 192.168.18.*   </Location> 

LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_http_module modules/mod_proxy_http.soProxyRequests Off <Proxy balancer://clusterphpinfo>BalancerMember http://192.168.18.2:10004 BalancerMember http://192.168.18.2:10000</Proxy> ProxyPass /test2 balancer://clusterphpinfo stickysession=STICK_PORT_TOKEN nofailover=On ProxyPassReverse /test2 balancer://clusterphpinfo <Location /balancer-manager>SetHandler balancer-managerOrder Deny,Allow Allow from all#Allow from 192.168.18.*</Location>

配置说明:在httpd.conf里面添加以上配置

1,为什么我这里要用/test2而不是/,因为在这里用/会和documentroot冲突,因为监听的都是80端口。2,stickysession 从字面上看,严格的session,加上他说明实现严格的session的负载均衡,根据个人需要吧。
3,其实像这样的负载均衡,其实就是反向代理,http://localhost/test2起到了连接池的作用,如果你访问http://localhost/test2/index.php,他其实访问的http://192.168.18.2:10004/index.php或者是http://192.168.18.2:10000/index.php
4,<Location /balancer-manager></Location>中间的内容是用监测负载均衡的情况的,可 以放到正式服务器,也可以不放。

访问http://localhost/test2/balancer-manager看下图:

图片说明:从上图我们可以看出,负载均衡算法是根据请求数(byrequests),平均分配到二个虚拟主机。

2,给节点加权重,根据挂起的请求数进行平衡
LoadModule proxy_module modules/mod_proxy.so   LoadModule proxy_balancer_module modules/mod_proxy_balancer.so   LoadModule proxy_http_module modules/mod_proxy_http.so     ProxyRequests Off   <Proxy balancer://clusterphpinfo>   BalancerMember http://192.168.18.2:10004 loadfactor=5   BalancerMember http://192.168.18.2:10000 loadfactor=1   ProxySet lbmethod=bytraffic   </Proxy>   ProxyPass /test2 balancer://clusterphpinfo stickysession=STICK_PORT_TOKEN nofailover=On   ProxyPassReverse /test2 balancer://clusterphpinfo     <Location /balancer-manager>   SetHandler balancer-manager   Order Deny,Allow   Allow from all   #Allow from 192.168.18.*   </Location> 

LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_http_module modules/mod_proxy_http.soProxyRequests Off <Proxy balancer://clusterphpinfo> BalancerMember http://192.168.18.2:10004 loadfactor=5 BalancerMember http://192.168.18.2:10000 loadfactor=1ProxySet lbmethod=bytraffic </Proxy> ProxyPass /test2 balancer://clusterphpinfo stickysession=STICK_PORT_TOKEN nofailover=On ProxyPassReverse /test2 balancer://clusterphpinfo <Location /balancer-manager>SetHandler balancer-managerOrder Deny,Allow Allow from all#Allow from 192.168.18.*</Location>

配置说明:说一下不同的

1,平衡算法,由byrequests变成bytraffic

2,由平均分配变成非平均分配
---------------------------------------------------
在apache中单独编译mod_proxy等模块

假设apache源代码目录:/home/src/httpd-2.2.6,已安装的apache路径为:/usr/local/apache
一、安装
#cd /home/src/httpd-2.2.6/modules/mod_proxy   (我测试需要进入mod_proxy目录才可以 版本2.2.11)
#/usr/local/apache/bin/apxs -c -i -a mod_proxy.c proxy_util.c
这将自动编译、安装和修改httpd.conf文件,激活mod_proxy模块。二、测试
#/usr/local/apache/bin/httpd -t     #测试httpd.conf配置文件语法和模块是否能正确加载
#/usr/local/apache/bin/apachectl restart
#/usr/local/apache/bin/httpd -M   #是否mod_proxy被加载附:apxs命令的安装和配置选项
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-A 与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
-e 表示需要执行编辑操作,它可以与 -a 和 -A 选项配合使用,与 -i 操作类似,修改Apache的httpd.conf文件,但是并不安装此模块。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
最近想把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>
 Order deny,allow
Allow from all
</IfModule>
 4、然后配置代理
(具体代理配置,请查看apache2中文手册 http://kajaa.bbs.us/ApacheManual/mod/mod_proxy.html)
5、        配置完后,重新启动apache
# /usr/local/etc/rc.d/apache restart

如果要设置http正向代理,还需编译mod_proxy_http
/usr/local/apache/bin/apxs -c -i -a mod_proxy_http.c proxy_util.c

在httpd.conf中添加
<VirtualHost *:8080>
ProxyRequests On
</VirtualHost>
默认所有https请求也将转为http请求,若要https请求也能正常访问,必须编译mod_proxy_connect
/usr/local/apache/bin/apxs -c -i -a mod_proxy_connect.c  proxy_util.c

(/usr/local/apache/bin/apxs -c -i mod_proxy.c proxy_util.c
/usr/local/apache/bin/apxs -c -i mod_proxy_http.c proxy_util.c
 必须2个c一起编译,不然会报错。
apache提供了mod_proxy模块用于提供代理服务,能够支持包括正向代理、反向代理、透明代理、缓存、负载均衡,HTTP代理、FTP代理、SSL代理等若干强大的功能。)


from http://www.huomo.cn/sysapp/article-392.html
 使用apxs为Apache编译模块

apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用LoadModule指令在运行时加载到Apache服务器中。
1. 进入apache源代码的modules目录
2. 运行如下命令自动编译、安装和修改httpd.conf文件,激活mod_proxy模块:
apache path/bin/apxs -c -i -a mod_proxy.c proxy_util.c
选项说明:
-c 执行编译操作
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#)
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块
3. 如果还需要其他proxy模块如mod_proxy_http、mod_proxy_ftp,则单独
apxs -c -i proxy_http.c
apxs -c -i proxy_ftp.c