Nginx+Tomcat+Session 高性能群集搭建

来源:互联网 发布:name域名隐私 编辑:程序博客网 时间:2024/05/17 15:42
标签:Nginx+Tomcat+Sessionmemcached高性能群集搭建
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wgkgood.blog.51cto.com/1192594/518953

【Nginx+Tomcat+Session 高性能群集搭建】

随着IT行业的发展,linux服务器在企业中应用广泛,人们对linux上的应用服务要求也越来越高,早先的apache服务器、apache有优点也 有不足,apache渐渐不能满足人们的要求,目前nginx被大量采用做高性能web服务器,无论是个人网站还是大型门户网站都在使用nginx作为 web搭建web服务器的首选。
接下来我们亲自来搭建一个属于自己的高性能web服务器,并且带故障自动转移的群集、和负载均衡服务器。

一、Nginx+Tomcat+Session 高性能群集服务搭建

  1. 本文采用目前主流版本搭建,搭建环境及版本如下列表:  
  2. 系统版本:Centos 5.3 64位系统  
  3. Nginx版本为:nginx-1.2.6.tar.gz  
  4. Jdk版本为:1.6.0_18_64  
  5. Tomcat版本为:Apache Tomcat/6.0.30  
  6. 其他相似版本也可以!安装服务所需的包如下下载路径:本网站集成部分下载:  
  7.  
  8. jdk请到以下网站下载:请选择自己系统版本的jdk。  
  9.  
  10. https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter  
  11.  
  12. 其他版本请到官网下载 

二、首先安装Nginx:安装nginx之前需要安装pcre包和zlib以支持重写,正则以及网页压缩等等】
把所需的包下载到/usr/src下【根据自己的习惯,路径可以改变】
1、首先安装pcre:

  1. cd /usr/src &&tar xzf pcre-8.32.tar.gz &&cd pcre-8.32 && ./configure --prefix=/usr/local/pcre &&make &&make install

2、然后再安装nginx :【给nginx安装jvmroute模块】

  1. cd /usr/src &&useradd www &&wget http://friendly.sinaapp.com//LinuxSoft/nginx-upstream-jvm-route-0.1.tar.gz && tar xzf nginx-upstream-jvm-route-0.1.tar.gz &&cd nginx-1.2.6&& patch -p0 <../nginx_upstream_jvm_route/jvm_route.patch && ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/home/soft/pcre-8.32 --add-module=../nginx_upstream_jvm_route/  --user=www --group=www &&make &&make install  
  2. 【nginx注意* –with-pcre=/home/soft/pcre-8.32指向的是源码包解压的路径,而不是安装的路径,否则会报  
  3.  
  4. make[1]: *** [/usr/local/pcre/Makefile] Error 127 错误

在安装过程中可能会出现如下错误:

./configure: error: SSL modules require the OpenSSL library.You can either do not enable the modules, or install the OpenSSL libraryinto the system, or build the OpenSSL library statically from the sourcewith nginx by using --with-openssl=<path> option.

此时可先进行 openssl的安装。

[root@localhost nginx-1.2.6]# yum install opensslopenssl-devel

Nginx 安装完毕!我们先不着急nginx配置文件的配置,先来修改tomcat配置文件:

三、Tomcat安装配置:

1、将所需的包下载至/usr/src 目录;首先安装jdk:

  1. chmod o+x jdk* && ./jdk* ;程序包会提示按回车键,我们根据提示安装即可,解压完毕,会在当前目录生成 jdk1.6.0_18 这个文件夹,  
  2. mkdir -p /usr/java && mv jdk1.6.0_18 /usr/java/下  
  3.  
  4. vi /etc/profile 最后面加入以下语句:  
  5. export JAVA_HOME=/usr/java/jdk1.6.0_18  
  6. export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib  
  7. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin  
  8. source /etc/profile //使环境变量马上生效  
  9. java –version //查看java版本,显示版本是1.6.0_18,并且是64位的证明安装成功!  
  10. 【 Java HotSpot(TM) 64-Bit Server VM (build 16.0-b10, mixed mode) 】  
  11.  
  12. cd /usr/src && tar xzf apache-tomcat-6.0.30.tar.gz  
  13. 解压完成执行:  
  14. mv apache-tomcat-6.0.30 /usr/local/tomcat_1 && cp /usr/local/tomcat_1 /usr/local/tomcat_2 -r  
  15. 【移动到/usr/local下并重命名为tomcat_1文件夹,并cp一个tomcat_2】  
  16. 部署两个Tomcat群集做负载均衡用

2、设置tomcat的java变量
 

  1. cd /usr/local/tomcat_1/bin/ && vi setenv.sh 创建一个setenv.sh脚本文件,添加如下语句即可  
  2. JAVA_HOME=/usr/java/jdk1.6.0_18  
  3. JAVA_JRE=/usr/java/jdk1.6.0_18/jre  
  4. 并且拷贝setenv.sh文件到tomcat_2/bin/下 :  
  5.  
  6. cp -p /usr/local/tomcat_1/bin/setenv.sh /usr/local/tomcat_2/bin 下即可!  
  7. 保存退出  
  8. 检查两个tomcat下bin目录的*.sh 文件是否有可执行权限,如果没有则进入到相应的目录执行 chmod o+x *.sh 即可!  
  9.  
  10. 给两个tomcat分别创建不同的目录如下:mkdir -p /usr/webapps/{www_1,www_2}

3、设置Tomcat的 server.xml文件:
【以下是我的tomcat配置文件具体内容,本想已附件的形式发的,本博客目前还不支持附件功能,重要修改的地方供大家参考,如果把所有配置都粘贴在这里,显示有问题,所有用了两个web链接!这样一来部分解释就产生了影响。不明白的欢迎留言】
这个是完整的server.xml文件下载地址:
http://chinaapp.sinaapp.com/download/server.xml.tgz

  1. 两个Tomcat配置的cluster里面的端口分别为4000、4001 ,必须设置成不同的端口;而且得分别设置两个jvmroute名称,一会在nginx中会用到!  
  2.  
  3.  配置Tomcat session会话复制:  
  4. 分别在两个tomcat的conf下web.xml文件里面加入如下一行即可:   
  5.  
  6.  <distributable/> 
  7.  这个是加入tomcat的session复制的,做tomcat集群必须需要这一步,否则用户的session就无法正常使用 <distributable/>直接加在</web-app>之前就可以了   
  8.  
  9. 配置完毕后,我们测试一下广播  
  10. java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1  
  11. java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2  
  12.  
  13. 如果不报错则能正常广播  
  14. tomcat-replication.jar 下载:http://cvs.apache.org/~fhanik/tomcat-replication.jar  
  15. 如果是两台机器的话,可以用tcpdump 抓包看看! 

Tomcat配置完毕,启动两个tomcat,先启动tomcat1,tomcat_1启动日志如下:

  1. 信息: Initializing Coyote HTTP/1.1 on http-8080  
  2. 2011-3-18 19:56:21 org.apache.catalina.startup.Catalina load  
  3. 信息: Initialization processed in 1088 ms  
  4. 2011-3-18 19:56:21 org.apache.catalina.core.StandardService start  
  5. 信息: Starting service Catalina  
  6. 2011-3-18 19:56:21 org.apache.catalina.core.StandardEngine start  
  7. 信息: Starting Servlet Engine: Apache Tomcat/6.0.18  
  8. 2011-3-18 19:56:21 org.apache.catalina.ha.tcp.SimpleTcpCluster start  
  9. 信息: Cluster is about to start  
  10. 2011-3-18 19:56:21 org.apache.catalina.tribes.transport.ReceiverBase bind  
  11. 信息: Receiver Server Socket bound to:/192.168.2.79:4000  
  12. 2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket  
  13. 信息: Setting cluster mcast soTimeout to 500  
  14. 2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers  
  15. 信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:4  
  16. 2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers  
  17. 信息: Done sleeping, membership established, start level:4  
  18. 2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers  
  19. 信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:8  
  20. 2011-3-18 19:56:23 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers  
  21. 信息: Done sleeping, membership established, start level:8  
  22. 2011-3-18 19:56:23 org.apache.catalina.ha.deploy.FarmWarDeployer start  
  23. 严重: FarmWarDeployer can only work as host cluster subelement!  
  24. 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start  
  25. 信息: Register manager to cluster element Engine with name Catalina  
  26. 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start  
  27. 信息: Starting clustering manager at  
  28. 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager getAllClusterSessions  
  29. 信息: Manager [localhost#]: skipping state transfer. No members active in cluster group.  
  30. 2011-3-18 19:56:23 org.apache.catalina.ha.session.JvmRouteBinderValve start  
  31. 信息: JvmRouteBinderValve started  
  32. 2011-3-18 19:56:23 org.apache.coyote.http11.Http11Protocol start  
  33. 信息: Starting Coyote HTTP/1.1 on http-8080  
  34. 2011-3-18 19:56:24 org.apache.jk.common.ChannelSocket init  
  35. 信息: JK: ajp13 listening on /0.0.0.0:8411  
  36. 2011-3-18 19:56:24 org.apache.jk.server.JkMain start  
  37. 信息: Jk running ID=0 time=0/42 config=null 
  38. 2011-3-18 19:56:24 org.apache.catalina.startup.Catalina start  
  39. 信息: Server startup in 2676 ms 

Tomcat_2的日志如下:

  1. 000,{-64, -88, 2, 79},4000, alive=86901,id={78 42 25 -19 -102 3 64 10 -76 93 69 -43 45 76 95 -112 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.  
  2. 2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report  
  3. 信息: ThroughputInterceptor Report[  
  4. Tx Msg:1 messages  
  5. Sent:0.00 MB (total)  
  6. Sent:0.00 MB (application)  
  7. Time:0.01 seconds  
  8. Tx Speed:0.04 MB/sec (total)  
  9. TxSpeed:0.04 MB/sec (application)  
  10. Error Msg:0  
  11. Rx Msg:1 messages  
  12. Rx Speed:0.00 MB/sec (since 1st msg)  
  13. Received:0.00 MB]  
  14.  
  15. 2011-3-18 19:57:48 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions  
  16. 信息: Manager [localhost#]; session state send at 11-3-18 下午7:57 received in 125 ms.  
  17. 2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report  
  18. 信息: ThroughputInterceptor Report[  
  19. Tx Msg:2 messages  
  20. Sent:0.00 MB (total)  
  21. Sent:0.00 MB (application)  
  22. Time:0.05 seconds  
  23. Tx Speed:0.02 MB/sec (total)  
  24. TxSpeed:0.02 MB/sec (application)  
  25. Error Msg:0  
  26. Rx Msg:2 messages  
  27. Rx Speed:0.00 MB/sec (since 1st msg)  
  28. Received:0.00 MB]  
  29.  
  30. 2011-3-18 19:57:49 org.apache.catalina.ha.session.JvmRouteBinderValve start  
  31. 信息: JvmRouteBinderValve started  
  32. 2011-3-18 19:57:49 org.apache.coyote.http11.Http11Protocol start  
  33. 信息: Starting Coyote HTTP/1.1 on http-8081  
  34. 2011-3-18 19:57:49 org.apache.jk.common.ChannelSocket init  
  35. 信息: JK: ajp13 listening on /0.0.0.0:8412  
  36. 2011-3-18 19:57:49 org.apache.jk.server.JkMain start  
  37. 信息: Jk running ID=0 time=0/34 config=null 
  38. 2011-3-18 19:57:49 org.apache.catalina.startup.Catalina start  
  39. 信息: Server startup in 2962 ms 

 果有报错或者请查看原因!

  1. 如  
  2. skipping state transfer. No members active in cluster group.”  
  3. mcastBindAddress 没有添加或添加得不对   
  4.  
  5. 【如上报错,如果启动其中一个报的错,而且已经修改了mcastBindAddress,此时还是有报错,我们可以不用管,在启动另一个 tomcat看看,第二个tomcat没有No members active in cluster group,则表示两个tomcat通信正常。】  
  6.  
  7. 四、最后配置Nginx:【贴出nginx.conf配置文件的内容,下载地址如下:】  
  8. http://friendly.sinaapp.com/LinuxSoft/nginx.conf.tgz   
  9.  
  10. 配置文件需要注意的地方:  
  11. http  
  12. {  
  13. upstream backend {  
  14. server 192.168.2.79:8080 srun_id=tomcat1;  
  15. #【tomcat1是我tomcat_1 server.xml里面配置的jvmroute=tomcat1】  
  16. server 192.168.2.79:8081 srun_id=tomcat2;  
  17. #【tomcat2是我tomcat_2 server.xml里面配置的jvmroute=tomcat2】  
  18. jvm_route $cookie_JSESSIONID|sessionid reverse;  
  19. #【配置jvmroute 、session会话】  
  20. }  
  21. 配置完毕后,新建/usr/webapps/www_1/index.jsp测试页面  
  22. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  23. <%  
  24. %> 
  25. http://blog.mgcrazy.com  
  26.  
  27. <%out.print(request.getSession()) ;%> 
  28.  
  29. <%out.println(request.getHeader("Cookie")); %> 
  30.  
  31. tomcat_2的发布目录index.jsp内容为:  
  32.  
  33. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
  34. <%  
  35. %> 
  36. http://wgkgood.gicp.net  
  37.  
  38. <%out.print(request.getSession()) ;%> 
  39.  
  40. <%out.println(request.getHeader("Cookie")); %> 
  41.  
  42. 启动nginx即可!  
  43.  
  44. 最后测试!在同一个浏览器窗口下 ctrl+f5刷新,都是同一个tomcat内容,它不会跳转到另一tomcat  
  45.  
  46. http://192.168.2.79:81 结果如下:  
  47. http://wgkgood.gicp.net  
  48. org.apache.catalina.session.StandardSessionFacade@2d7aece8  
  49. JSESSIONID=FEB19E24719ED666D1C9C50A7A09A2BA.tomcat2  
  50.  
  51. 另一个浏览器窗口为:  
  52. http://blog.mgcrazy.com  
  53. org.apache.catalina.session.StandardSessionFacade@259e215b  
  54. rtime=0ltime=1298014951125cnzz_eid=85744900-1298010049-; Hm_lvt_0e74098a87be059a433e5a74f1b5fecf=1298014951312Hm_lvt_b7c035fd79b2c378053e06c86493de76=1300439158373JSESSIONID=B2574ABB491F50F37162479BD3FE761C.tomcat1 

无论你怎么刷新同一个窗口下都不会变!而且当你down掉一个tomcat后,会自动转移会话到另一个tomcat上!用户是感觉不到服务挂掉的!当两个服务正常的时候,可以负载均衡、当一个服务down掉时,可以自动剔除它,并复制它的会话!

本文出自 “烟雨楼台” 博客,请务必保留此出处http://wgkgood.blog.51cto.com/1192594/518953