1、本次試驗主要是通過nginx代理到tomcat處理動態響應;
2、通過httpd代理到tomcat做動態請求的處理;
3、通過httpd和tomcat實現session會話的綁定;
4、通過httpd和tomcat實現session會話的保持;
5、通過httpd實現tomcat負載均衡效果;
一、LNMT的試驗配置
LNMT:
主機 | IP |
haproxy | 192.168.0.111 node1.soul.com |
varnish | 192.168.0.112 node2.soul.com |
nginx+tomcat | 192.168.0.113 node3.soul.com |
httpd | 192.168.0.114 node4.soul.com |
1)配置haproxy
#直接yum安裝haproxy即可; [root@node1 ~]# vim /etc/haproxy/haproxy.cfg frontend main *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html .htm acl url_dynamic path_end -i .jsp .do use_backend static if url_static use_backend dynamic if url_dynamic default_backend static #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static balance roundrobin server static 192.168.0.112:80 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend dynamic balance roundrobin server node3 192.168.0.113:80 check [root@node1 ~]# service haproxy start Starting haproxy: [ OK ] [root@node1 ~]# ss -tunl | grep 80 tcp LISTEN 0 128 *:80 *:* #測試啓動正常
2)配置varnish:
#安裝就不介紹;前面有介紹 [root@node2 ~]# vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80 更改監聽端口 # # # Telnet admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 VARNISH_ADMIN_LISTEN_PORT=6082 # # # Shared secret file for admin interface VARNISH_SECRET_FILE=/etc/varnish/secret # # # The minimum number of worker threads to start VARNISH_MIN_THREADS=50 # # # The Maximum number of worker threads to start VARNISH_MAX_THREADS=1000 # # # Idle timeout for worker threads VARNISH_THREAD_TIMEOUT=120 # # # Cache file location VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin # # # Cache file size: in bytes, optionally using k / M / G / T suffix, # # or in percentage of available disk space using the % suffix. VARNISH_STORAGE_SIZE=1G # # # Backend storage specification #VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" VARNISH_STORAGE="malloc,100M" 更改存儲類型
3)配置vcl文件:
[root@node2 ~]# vim /etc/varnish/test.vcl backend static { .host = "192.168.0.114"; .port = "80"; } acl purgers { "127.0.0.1"; "192.168.0.0"/24; } sub vcl_recv { if(req.request == "PURGE") { if(!client.ip ~ purgers) { error 405 "Method not allowd."; } } if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } return(lookup); } sub vcl_hit { if(req.request == "PURGE") { purge; error 200 "Purged Success."; } } sub vcl_miss { if(req.request == "PURGE") { purge; error 404 "Not in cache."; } } sub vcl_pass { if(req.request == "PURGE") { error 502 "Purged on a passed object."; } } sub vcl_fetch { if(req.url ~ "\.(jpg|png|gif|jpeg)$") { set beresp.ttl = 7200s; } if(req.url ~ "\.(html|htm|css|js)$") { set beresp.ttl = 1200s; } } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT from " + server.ip; }else { set resp.http.X-Cache = "MISS"; } }
4)編譯啓用:
[root@node2 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 varnish> vcl.load test2 test.vcl 200 VCL compiled. varnish> vcl.use test2 200 varnish>
提供靜態頁面:
[root@node4 ~]# service httpd start Starting httpd: [ OK ] [root@node4 ~]# vim /var/www/html/index.html <h1>This is static page!IP:192.168.0.114</h1>
5)配置nginx和tomcat:
#安裝不做說明;配置nginx [root@node3 ~]# vim /etc/nginx/conf.d/default.conf #在location中定義proxy_pass即可 location / { # root /usr/share/nginx/html; # index index.html index.htm; proxy_pass http://192.168.0.113:8080; #全部代理到後端8080端口 }
配置tomcat
#安裝不做說明;也無需做配置;安裝完成後啓動即可 [root@node3 conf]# ll /etc/rc.d/init.d/tomcat -rwxr-xr-x 1 root root 1288 May 11 18:28 /etc/rc.d/init.d/tomcat [root@node3 conf]# [root@node3 conf]# service tomcat start Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar [root@node3 ~]# ss -tunl | grep 8080 tcp LISTEN 0 100 :::8080 :::*
提供jsp頁面文件
[root@node3 ROOT]# pwd /usr/local/tomcat/webapps/ROOT [root@node3 ROOT]# vim dynamic.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>JSP test page.</title> </head> <body> <% out.println("This is dynamic page!"); %> </body> </html>
6)測試訪問:
測試訪問正常;動靜分離正常。到此LNMT配置完成。mysql可以安裝測試與LAMP大致相同。
二、LAMT的配置:
大致規劃:
主機 | IP |
haproxy | 192.168.0.111 node1.soul.com |
varnish | 192.168.0.112 node2.soul.com |
httpd | 192.168.0.113 node3.soul.com |
httpd+tomcat | 192.168.0.114 node4.soul.com |
tomcat | 192.168.0.115 node5.soul.com |
這裏是接着上面的配置來的;所以關於haproxy和varnish的配置不做說明了;重點來看httpd和tomcat的整合和負載均衡;其中對應的IP需要更改下:
haproxy:
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend dynamic balance roundrobin server node4 192.168.0.114:80 check #這裏的後端更改爲114主機
node2上的varnish:
[root@node2 ~]# vim /etc/varnish/test.vcl backend static { .host = "192.168.0.113"; .port = "80"; }
重新編譯後測試即可.
基於Apache做爲Tomcat前端的架構來講,Apache通過mod_jk、mod_jk2或mod_proxy模塊與後端的Tomcat進行數據交換。而對Tomcat來說,每個Web容器實例都有一個Java語言開發的連接器模塊組件,在Tomcat6中,這個連接器是org.apache.catalina.Connector類。這個類的構造器可以構造兩種類別的連接器:HTTP/1.1負責響應基於HTTP/HTTPS協議的請求,AJP/1.3負責響應基於AJP的請求。但可以簡單地通過在server.xml配置文件中實現連接器的創建,但創建時所使用的類根據系統是支持APR(Apache Portable Runtime)而有所不同。
APR是附加在提供了通用和標準API的操作系統之上一個通訊層的本地庫的集合,它能夠爲使用了APR的應用程序在與Apache通信時提供較好伸縮能力時帶去平衡效用。
同時,需要說明的是,mod_jk2模塊目前已經不再被支持了,mod_jk模塊目前還apache被支持,但其項目活躍度已經大大降低。因此,目前更常用 的方式是使用mod_proxy模塊。
本次以mod_proxy模塊做實驗:
1)配置node4上的httpd和tomcat:
#配置httpd;基於mod_proxy模塊與後端tomcat聯繫;這裏直接爲mod_proxy模塊寫一個單獨的配置文件: [root@node4 conf.d]# pwd /etc/httpd/conf.d [root@node4 conf.d]# vim mod_proxy.conf ProxyVia on ProxyRequests off ProxyPreserveHost on <proxy balancer://lb> #定義一個組 BalancerMember ajp://192.168.0.114:8009 loadfactor=1 route=TomcatA BalancerMember ajp://192.168.0.115:8009 loadfactor=1 route=TomcatB </proxy> #組內使用ajp協議進行後端代理 ProxyPass / balancer://lb/ #代理到後端的組 ProxyPa***everse / balancer://lb/ #tomcat的安裝就不再贅述;提供node4和node5上的頁面文件: [root@node4 ~]# vim /usr/local/tomcat/webapps/ROOT/dynamic.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA </font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> ------------------------------------------------------------------ [root@node5 ~]# vim /usr/local/tomcat/webapps/ROOT/dynamic.jsp <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB </font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> #完成後重啓httpd測試。
測試haproxy的地址192.168.0.111同樣生效:
2)綁定session會話和開啓負載均衡管理界面:
#更改httpd代理的配置文件 [root@node4 ~]# vim /etc/httpd/conf.d/mod_proxy.conf ProxyVia on ProxyRequests off ProxyPreserveHost on <proxy balancer://lb> BalancerMember ajp://192.168.0.114:8009 loadfactor=1 route=TomcatA BalancerMember ajp://192.168.0.115:8009 loadfactor=1 route=TomcatB </proxy> <Location /lbmanager> #定義負載均衡管理界面 SetHandler balancer-manager </Location> ProxyPass /lbmanager ! #該界面是不做代理 ProxyPass / balancer://lb/ stickysession=JSESSIONID #開啓session綁定 ProxyPa***everse / balancer://lb/ #除了httpd配置文件;還需要更改tomcat的配置文件;後端兩個節點都需要對應的更改: [root@node4 ~]# vim /usr/local/tomcat/conf/server.xml <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> #在該行添加jvmRoute="TomcatA"這條信息;node5對應添加爲TomcatB
重啓httpd和tomcat測試:
可以發現後面已有session信息;且刷新頁面不會在調度到TomcatA主機上。
測試管理界面也是正常的。可以在此處做簡單的管理操作。
3)下面配置tomcat的session會話集羣:
由於各版本可能有差異;可以參考官方文檔:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
#更改tomcat的配置文件;在engine段添加如下: [root@node4 ~]# vim /usr/local/tomcat/conf/server.xml <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService" address="228.0.40.4" #廣播地址 port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> </Channel> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster> #完成後複製一份到node5上;對應的jvmRoute更改即可;
還需在web.xml中添加:
[root@node4 ~]# cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/ROOT/WEB-INF/ #因爲本次使用的就是默認目錄;所以拷貝到默認目錄下;具體情況以自己的爲準 [root@node4 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml <distributable/> #在正文空白中添加上面一行即可;同複製一份到node5; #註釋掉調度器的黏性 [root@node4 ~]# vim /etc/httpd/conf.d/mod_proxy.conf # stickysession=JSESSIONID 註釋掉或刪掉即可。 #重啓httpd和tomcat測試。
可以看見上述雖然節點改變了;但是sessionID還是相同的;到此實現了session會話保持。
如有錯誤;懇請糾正。