nginx+tomcat+memcached负载均衡集群搭建(二)

来源:互联网 发布:kubernetes 跨主机网络 编辑:程序博客网 时间:2024/05/17 10:55

Tomcat的安装+配置memcached。
1、安装Tomcat
Tomcat官网:http://tomcat.apache.org/
我使用的版本:apache-tomcat-7.0.42.tar.gz
1.1解压在usr/local/目录下(可以自己选)

1.2重命名为Tomcat(不是必须的,只是这样看着习惯)
1.3编辑/etc/profile加上以下语句

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. CATALINA_BASE=/usr/local/tomcat  
  2. CATALINA_HOME=/usr/local/tomcat  
  3. export CATALINA_BASE CATALINA_HOME  
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. 1.4进入tomcat/bin目录下面,运行<pre class="html" name="code"># ./startup.sh   

1.5然后访问http://localhost:8080看是否访问成功.如果看到了tomcat的欢迎界面,congratulations, you are a good boy/girl.

1.6但是现在我们只有一个tomcat。所以,接下来在我们的机器上要搭建多个tomcat,首先我们先复制一份以前的tomcat(我的tomcat是在/usr/local/下),执行命令

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. cp /usr/local/tomcat /usr/local/tomcat2   

1.7应为要两个不同的tomcat使用不同的环境变量,所以我们需要修改/etc/profile的文件配置信息
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. gedit /etc/profile  

然后修改成这样:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #tomcat  
  2. CATALINA_BASE=/usr/local/tomcat  
  3. CATALINA_HOME=/usr/local/tomcat  
  4. export CATALINA_BASE CATALINA_HOME  
  5. #tomcat2  
  6. CATALINA_2_BASE=/usr/local/tomcat2      
  7. CATALINA_2_HOME=/usr/local/tomcat2      
  8. export CATALINA_2_BASE CATALINA_2_HOME  
  9. TOMCAT_HOME=/usr/local/tomcat  
  10. export TOMCAT_HOME      
  11.       
  12. TOMCAT_2_HOME=/usr/local/tomcat2      
  13. export TOMCAT_2_HOME  

1.8最后一步我们需要修改tomcat2里面的配置文件。首先我们修改tomcat2/bin下面的startup.sh和shutdown.sh 添加以下内容
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. export JAVA_HOME=/usr/local/jdk  
  2. export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin:$JAVA_HOME/bin:$PATH  
  3.   
  4. export CATALINA_HOME=$CATALINA_2_HOME      
  5. export CATALINA_BASE=$CATALINA_2_BASE  

1.9然后进去tomcat2/server.xml中修改以下几个地方
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <Server port="8005" shutdown="SHUTDOWN">      
  2.     <Connector port="8080" protocol="HTTP/1.1"              
  3.                    connectionTimeout="20000"       
  4.                    redirectPort="8443" />     
  5. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />   
  6. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">  

把8005->8006,8080->8081,8009->8010就好了(具体端口由自己定就行了),增加:  jvmRoute="tomcat2",对tomcat/server.xml只需要增加以下jvmRoute="tomcat"

1.10然后进入tomcat1/bin,tomcat2/bin下面执行
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. ./startup.sh   


好了,nice
       1.11用浏览器进去localhost:8080和localhost:8081看看把,两个tomcat就已经搭建成功了


2、为Tomcat配置memcached
NGINX负载的几种方式
nginx 的 upstream目前支持 4 种方式的分配 
1)、轮询(默认) 
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
2)、ip_hash 
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  
3)、fair(第三方) 
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。  
4)、url_hash(第三方)'
       我们使用最简单的ip_hash来实现,而且还可以解决session问题
ip_hash其实上不能够完全解决ip问题,因为有很多用户的ip随时都可能在变动,ip_hash这个名字你就知道,是通过hash散列的原理将用户的ip散列到指定的tomcat上,自然而然的想当然的解决了session问题,最好是用memcached存取来实现session共享,下面看我的nginx.conf的配置:

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. #运行nginx所在的用户名和用户组  
  2.    #user  www www;   
  3.        
  4.    #启动进程数  
  5.    worker_processes 8;  
  6.    #全局错误日志及PID文件  
  7.    error_log  /usr/local/nginx/logs/nginx_error.log  crit;  
  8.        
  9.    pid        /usr/local/nginx/nginx.pid;  
  10.        
  11.    #Specifies the value for maximum file descriptors that can be opened by this process.  
  12.        
  13.    worker_rlimit_nofile 65535;  
  14.    #工作模式及连接数上限  
  15.    events  
  16.    {  
  17.      use epoll;  
  18.      worker_connections 65535;  
  19.    }  
  20.    #设定http服务器,利用它的反向代理功能提供负载均衡支持  
  21.    http  
  22.    {  
  23.      #设定mime类型  
  24.      include       mime.types;  
  25.      default_type  application/octet-stream;  
  26.      include /usr/local/nginx/conf/proxy.conf;  
  27.      #charset  gb2312;  
  28.      #设定请求缓冲      
  29.      server_names_hash_bucket_size 128;  
  30.      client_header_buffer_size 32k;  
  31.      large_client_header_buffers 4 32k;  
  32.      #client_max_body_size 8m;  
  33.              
  34.      sendfile on;  
  35.      tcp_nopush     on;  
  36.        
  37.      keepalive_timeout 60;  
  38.        
  39.      tcp_nodelay on;  
  40.        
  41.    #  fastcgi_connect_timeout 300;  
  42.    #  fastcgi_send_timeout 300;  
  43.    #  fastcgi_read_timeout 300;  
  44.    #  fastcgi_buffer_size 64k;  
  45.    #  fastcgi_buffers 4 64k;  
  46.    #  fastcgi_busy_buffers_size 128k;  
  47.    #  fastcgi_temp_file_write_size 128k;  
  48.        
  49.    #  gzip on;  
  50.    #  gzip_min_length  1k;  
  51.    #  gzip_buffers     4 16k;  
  52.    #  gzip_http_version 1.0;  
  53.    #  gzip_comp_level 2;  
  54.    #  gzip_types       text/plain application/x-javascript text/css application/xml;  
  55.    #  gzip_vary on;  
  56.        
  57.      #limit_zone  crawler  $binary_remote_addr  10m;  
  58.    upstream tomcat{                      # 负载均衡站点的名称为tomcat,可以自己取  
  59.       # ip_hash;                 # 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器  
  60.        server 127.0.0.1:8080;       # web服务器的IP地址及tomcat发布端口  
  61.        server 127.0.0.1:8081;  
  62.         }  
  63.    server {  
  64.         listen       80;                   # 站点侦听端口80  
  65.         server_name  localhost;            # 站点名称  
  66.   
  67.       location / {  
  68.         root   html;  
  69.         index  index.html index.htm;  
  70.         proxy_pass http://tomcat;      # 负载均衡指向的发布服务tomcat  
  71.              }  
  72.    
  73. }  
  74.        
  75.   
  76.    }  

2.1 Tomcat要支持memcached管理Session,需要调用一些jar库文件如下(网上有的文章中可能所说的jar包不全,或者版本不样的会报错,但这里我已经经过验证了,简直nice):
                   1) couchbase-client-1.2.2.jar
                          2) javolution-5.5.1.jar
                          3) kryo-1.03.jar
                          4) kryo-serializers-0.10.jar
                          5) memcached-session-manager-1.6.5.jar
                          6) memcached-session-manager-tc7-1.6.5
                          7) minlog-1.2.jar
                          8) msm-kryo-serializer-1.6.3.jar
                          9) reflectasm-1.01.jar
                         10)spymemcached-2.10.2.jar
特别要注意,这些jar包的版本,要不然你会难受至极:
                         1)msm1.6.5依赖了Couchbase,需要添加couchbase-client的jar包,否则启动会报:java.lang.NoClassDefFoundError:com/couchbase/client/CouchbaseClient。
                                2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可选一,否则启动报错。
                                3)msm源码中的lib包版本太低:spymemcached需要使用2.10.2,否则启动tomcat报错:java.lang.NoSuchMethodError:net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;atde.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)
                                4)kryo-serializers需要使用0.10版本,否则报错:
                                      Caused by:java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
下载后,将这些库文件放到tomcat\lib目录下。
2.2为Tomcat配置memcached
     配置文件目录:tomcat\conf\context.xml,记得两个Tomcat都要配的哦。
            打开配置文件,在<Context>...</Context>节点中添加如下内容:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
  2.     memcachedNodes="n1:127.0.0.1:11211"  
  3.     requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"  
  4.     sessionBackupAsync="false"  
  5.     sessionBackupTimeout="100"  
  6.     copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>  

参数说明:memcachedNodes:memcached服务器信息,多个服务器时,使用空格分开,如:
                              n1:127.0.0.1:11211 n2:127.0.0.1:11211
配置文件如下图:

2.3测试Session共享
    我是在Windows下用myeclipse新建一个web项目,我的项目名是:TOMCAT_SESSION,在index.jsp下写上:

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>Tomcat+memcached共享session测试</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     SessionID:<%=session.getId()%>  
  25. <BR>   
  26. SessionIP:<%=request.getServerName()%>  
  27. <BR>   
  28. SessionPort:<%=request.getServerPort()%>  
  29. <BR>  
  30. <%   
  31. out.println("This is Tomcat Server 8080.");  
  32. %>  
  33.   </body>  
  34. </html>  

然后打包成.war文件,将其弄到centos6.4的tomcat的webapps目录下即可。
再将index.jsp中的out.println("This is Tomcat Server 8080.");改成out.println("This is Tomcat Server 8081.");,打包成.war文件,也将其弄到centos6.4的tomcat2(另一个tomcat)的webapps目录下即可。
好了,启动这些:nginx,memcached,tomcat,tomcat2,这样准备就绪了。
打开你的浏览器输入:http://localhost/TOMCAT_SESSION/index.jsp,会出现如下界面:

   再按F5刷新一次,出现如下界面:

对比一下,两次得到的session是一样的。

0 0
原创粉丝点击