使用apache+tomcat集群多个方案,以前我是用的mod_jk。这种集群虽然性能好,但是较复杂。apache自带的负载均衡模块proxy_balancer简单又正好满足需求。所以选用这种方案。
我查资料有个习惯,就是首先从官网获取信息。因为官网的文档不仅是最新,相信也是最准确的。可是这一次我错了,如果按官网的文档操作没有问题就不会写这篇日志了。
首先打开需要的功能模块,在这里,我打开了和proxy相关的所有模块:
LoadModule proxy_module modules/mod_proxy.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_express_module modules/mod_proxy_express.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_scgi_module modules/mod_proxy_scgi.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
按照以下官网的配置方法:
于是就报500,打开error_log发现:
No protocol handler was valid for the URL /auth/real. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
以下是我的配置:
<Proxy "balancer://auth"> BalancerMember http://127.0.0.1:30007 route=1 ProxySet stickysession=ROUTEID </Proxy> <VirtualHost *:80> ServerName auth2.prping.com ProxyPass / balancer://auth stickysession=JSESSIONID|jsessionid scolonpathdelim=On ProxyPassReverse / balancer://auth </VirtualHost>
stickysession是为解决cookies的问题,同一会话的用主呢始终分配在一台机器上。具体balancer的其他参数可以参考官网。
http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html
按错误提示,好像是协议不支持。可是http和ajp都试过了,还是不行。如果不集群,单独使用代理又是正常的:
ProxyPass / http://127.0.0.1:30007/ ProxyPassReverse / http://127.0.0.1:30007/
所以排除了模块没加载或者协议不支持的原因。
突然,我看到了映射地址最后一个 “/” 符号。
以前配置http代理时,最后不加上 “/” ,访问时就会把代理的url直接拼在后面。我把之前的配置加上 “/” ,重启后没问题了,访问正常。
以下是正确的配置文件,考虑到获得更好的性能,使用了ajp协议。
<Proxy "balancer://auth"> BalancerMember ajp://127.0.0.1:20007 route=1 ProxySet stickysession=ROUTEID </Proxy> <VirtualHost *:80> ServerName auth2.prping.com ProxyPass / balancer://auth/ stickysession=JSESSIONID|jsessionid scolonpathdelim=On ProxyPassReverse / balancer://auth/ </VirtualHost>
所以,如果有些事没有真正做过得出结论,还是保持中立的好。