利用apache和tomcat做集群,有好幾種方式我們來介紹一種方法。
一:查看是否有mod_proxy模塊功能
- [i5a6]# /usr/local/apache/bin/httpd -l
可以看到是否有mod_proxy的模塊,直接去 /usr/local/apache/modules/ 去查看是否有對應的mod_proxy.so,mod_proxy_balancer.so,mod_proxy_http.so,mod_proxy_ajp.so的模塊包
二:本人的是vps已經安裝好的apache不過沒有編譯此模塊要自己動手編譯
- [i5a6]# find / -name mod_proxy.c
注釋:我是不知道它的安裝目錄,直接根目錄下檢索吧,主要是找對應的模塊文件夾;執行結果:
- :/home/cpeasyapache/src/httpd-2.2.17/modules/proxy/mod_proxy.c
- [i5a6]# cd /home/cpeasyapache/src/httpd-2.2.17/modules/proxy/
- [i5a6]# /usr/local/apache/bin/apxs -c -i mod_proxy.c proxy_util.c
- [i5a6]# /usr/local/apache/bin/apxs -c -i mod_proxy_balancer.c
- [i5a6]# /usr/local/apache/bin/apxs -c -i mod_proxy_http.c
- # 安裝proxy_ajp模塊
- [i5a6]# /usr/local/apache/bin/apxs -c -i mod_proxy_ajp.c ajp_header.c ajp_utils.c ajp_msg.c ajp_link.c
可以去 /usr/local/apache/modules/ 看下生成了對應mod_proxy.so,mod_proxy_balancer.so,mod_proxy_http.so,mod_proxy_ajp.so的包。
三:配置httpd.conf,設置權重和session嚴格復制等。
- 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.1.101:8080 loadfactor=5
- BalancerMember http://192.168.1.100:8080 loadfactor=1
- ProxySet lbmethod=bytraffic
- </Proxy>
- ProxyPass /t2 balancer://clusterphpinfo stickysession=STICK_PORT_TOKEN nofailover=On
- ProxyPassReverse /t2 balancer://clusterphpinfo
- <Location /balancer-manager>
- SetHandler balancer-manager
- Order Deny,Allow
- Allow from all
- </Location>
配置說明:
1,平衡算法,由byrequests變成bytraffic
2,由平均分配變成非平均分配
另一個虛擬主機配置:
- <VirtualHost *:80>
- ServerName hs.i5a6.com
- ServerAlias i5a6.com
- DocumentRoot "/usr/local/apache/htdocs/hs"
- ProxyPass /hs ajp://127.0.0.1:8009/hs
- ProxyPassReverse /hs ajp://127.0.0.1:8009/hs
- </VirtualHost>
- <Proxy balancer://mycluster>
- BalancerMember http://127.0.0.1:8181/hs loadfactor=40
- BalancerMember http://127.0.0.1:8282/hs loadfactor=40
- BalancerMemberhttp://127.0.0.1:8080/hs loadfactor=10
- BalancerMember http://127.0.0.1:8081/hs loadfactor=10
- #熱備,如果8181服務掛掉,apache會自動把請求發送到8282,如果8181恢復服務,apache會把請求發送到8181
- #BalancerMember http://127.0.0.1:8282 status=+H
- </Proxy>
- <VirtualHost *:80>
- ServerName hs.i5a6.com
- DocumentRoot "/usr/local/apache/htdocs/hs"
- #內部的請求 /hs/ 代理 balancer://mycluster/ 模塊的請求
- #ProxyPass /hs/ balancer://mycluster/
- #stickysession session的性質,是否具有粘性
- #nofailover=On不支持會話復制
- #lbmethod 負載均衡的算法,lbmethod可能的取值有:
- #lbmethod=byrequests 按照請求次數均衡(默認)
- #lbmethod=bytraffic 按照流量均衡
- #lbmethod=bybusyness 按照繁忙程度均衡(總是分配給活躍請求數最少的服務器)
- #maxattempts=1 apache在放棄服務前,嘗試的次數
- ProxyPass /hs/ balancer://mycluster/ stickysession=STICK_PORT_TOKEN nofailover=On lbmethod=byrequests maxattempts=1
- ProxyPassReverse /hs balancer://mycluster/
- #調整由反向代理服務器發送的HTTP應答頭中的URL.
- #根據代理打開 balancer://mycluster/ 模塊的a.html
- #如果點擊a.html頁面的內部鏈接(絕對路徑另論),需要這個設置將路徑修改為代理的路徑.
- </VirtualHost>
apache 反向代理出現內網ip解決方法
apache中設置如下反向代理后端的tomcat出現request.getServerName();獲取到的主機名稱就會是localhost,解決這個
- <VirtualHost *:80>
- ServerAdmin service@i5a6.com
- DocumentRoot /usr/local/apache/htdocs
- ServerName i5a6.com
- ServerAlias *.i5a6.com
- DirectoryIndex index.html index.html.var index.jsp
- ProxyPass / http://localhost:8080/
- ProxyPassReverse / http://localhost:8080/
- ErrorLog "logs/hscode-error.log"
- CustomLog "logs/hscode-access.log" common
- </VirtualHost>
在httpd.conf 文件中增加:ProxyPreserveHost On 即可,對應的nginx 也有此問題解決之法:
- proxy_set_header Host $host;
- upstream mytomcat{
- #server 127.0.0.1:8000 weight=3;
- #server 127.0.0.1:8001;
- #server 127.0.0.1:8002;
- server 127.0.0.1:8080;
- }
- server
- {
- listen 80;
- server_name i5a6.com *.i5a6.com;
- index index.html index.htm ;
- root /usr/local/data/htdocs/www;
- location / {
- # proxy_set_header Host %host;
- # proxy_set_header X-Forwarded-For $remote_addr;
- proxy_pass http://www.49028c.com;
- proxy_set_header Host $host;
- }
新聞熱點
疑難解答