Nginx+Tomcat+MemCached集群配置

一、Nginx是一款高性能的 HTTP 和 反向代理 

二、tomcat是apache web应用服务器

三、Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。


四、实验环境:物理机:192.168.126.1  win7
          虚拟机: 192.168.126.15 CentOS
          在物理主机上安装Nginx服务,memcached服务,配置Tomcat-台端口8080
          在虚拟机上配置一台Tomcat 端口8080

五、准备一个java web小项目测试。将些项目发布到物理机Tomcat 192.168.126.1:8080 和虚拟机Tomcat 192.168.126.15:8080 注意端口不能是80,80端口由nginx服务器代理。

项目核心代码如下

static {
            users.put("tom", new User("1001", "tom", "123456"));
            users.put("king", new User("1002", "king", "123456"));
            users.put("sam", new User("1003", "sam", "123456"));
            users.put("jack", new User("1004", "jack", "123456"));
        }


        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
             String userName = request.getParameter("userName");  
             String password = request.getParameter("password");  
             LOG.info("Raw input:userName=" + userName + ",password=" + password);  
             String url = request.getContextPath();
             LOG.info("URL------>>" + url);
             if(userName!=null && password!=null  
                       && users.containsKey(userName)  
                       && users.get(userName).getPassword().equals(password)) {  
                  LOG.info("Login;status=SUCCESS");  
                  HttpSession session = request.getSession();
                  session.setAttribute("SESSION_USER", users.get(userName));
                  LOG.info("SessionID----->>" + session.getId());
                  response.sendRedirect(url + "/success.jsp");
             } else {  
                  LOG.info("Login;status=FAIL");  
                  request.getRequestDispatcher("login.jsp").forward(request, response);  
             }  
        }
    }


<%  
        User user = (User) session.getAttribute("SESSION_USER");  
        String ip = request.getLocalAddr();
        String id = session.getId();
        String username = "";
        if (user != null) {
            username = user.getUserId() + "------->>" + user.getUsername() + "----->>" + user.getPassword();
        }
    %>  
    <body>    
         <h2 class="title"><%=ip %> 服务器处理结果 SESSIONID = <%=id %> </h2> 
         <h2 class="title">当前登录用户:<%=username %> <a href="index.html">主页</a></h2>      
    </body>  


六、下载Nginx: http://nginx.org/download/nginx-1.6.0.zip 
并解压到E:\nginx-1.6.0目录中,在命令提示窗口中进入到E:\nginx-1.6.0目录
nginx.exe        #启动nginx服务
nginx -s stop    #停止nginx服务
nginx -s reload  #重新启动nginx
nginx -s quit    #退出nginx
nginx -t         #检测配置文件的正确性   
启动Nginx后输入http://127.0.0.1/ 可以看到nginx的欢迎页面了,非常友好


接下来配置配置Nginx负载均衡,我的目录在E:\nginx-1.6.0\conf\nginx.conf以下是我简单配置
#是注释内容,配置文件修改完成后启动两台Tomcat服务,然后重新启动Nginx服务。
输入:http://127.0.0.1/Session/login.jsp 
响应结果:
192.168.126.1 用户登录
再次刷新:
192.168.126.15 用户登录
证明Nginx反向代理和负载均衡配置成功了。


#user  nobody;       #用户
worker_processes  1; #工作进程,根据硬件调整,大于等于CPU核数


#error_log  logs/error.log;  #错误日志配置
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;


#pid        logs/nginx.pid; #pid放置位置


events {
    #use epoll;  
    #使用epoll的I/O 模型
    # 补充说明:
    #与apache相类,nginx针对不同的操作系统,有不同的事件模型
#A)标准事件模型
#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS #X系统使用kqueue可能会造成内核崩溃。
#Epoll:使用于Linux内核2.6版本及以后的系统。
#/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
#Eventport:使用于Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装安全补丁 

    worker_connections  1024;


    #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行


    #每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections


    keepalive_timeout 60; 
}


#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    include       mime.types;
    default_type  application/octet-stream;  

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    #配置两台Tomcat真实服务器
upstream  B2C_WEB {      
 #ip_hash;     #目的保证客户端的ip地址不变,请求就只送到固定的一个Tomcat处理

      server 192.168.126.1:8080 weight=1 max_fails=3 fail_timeout=30s;    
      server 192.168.126.15:8080 weight=1 max_fails=3 fail_timeout=30s;

      #weight=1表示
      #这表示,如果服务器192.168.126.1 | 15在30秒内出现了3次错误,
 #那么就认为这个服务器工作不正常,从而在接下来的30秒内nginx不再去访问这个服务器。
    }  

    server {
        listen       80; #监听端口
        server_name  localhost;
charset UTF-8;
index index.html index.htm index.jsp index.do;
root E:\\JavaEE\\Apache-Tomcat-7.0.41\\wtpwebapps; #WEB服务的主目录


location ~ ^/(WEB-INF)/ { 
          deny all; #禁止访问WEB-INF目录
        }
        
        # 动态数据由代理服务器Tomcat处理
location ~ .*\.(jsp|jspx|do)?$ { 
          proxy_pass http://B2C;# 反向代理         
 proxy_set_header  X-Real-IP $remote_addr;
 proxy_next_upstream http_502 http_504 error timeout invalid_header;
       }

       # 静态数据直接读取不经过Tomcat服务器
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  {    
expires      30d; #在客户端保存时间
  }
  location ~ .*\.(js|css)?$
  {    
expires      1h;
  }
  
       # 监控Nginx服务状态
  location /Nginxstatus {
stub_status on;
access_log   off;
  }

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
  
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     
    }

}


七、下载Memcached: 官方并未提供memcached windows版本 自己到网上找memcached-1.2.6-win32-bin.zip或
    memcached-win32-1.4.4-14.zip下载

八、memcached安装步骤:
①.解压到指定目录,如E:\memcached\
②.打开 开始 --->> 运行 --->> cmd 调出命令窗口,进入到memcached的解压目录
③.安装memcached:    输入E:\memcached\memcached.exe -d install 执行安装
   注意事项根据下载版本不同安装文件可能是单文件,不用质疑。
④.启动memcached服务:输入E:\memcached\memcached.exe -d start 启动服务

设置memcached,启动该服务后,memcached服务默认占用的端口是11211,占用的最大内存默认是64M。

如果需要修改这两个参数,比如修改端口为10000,内存为512,则输入: 

E:\memcached\memcached.exe -p 10000 -m 512 -d start  ,  -p 表示要修改的端口,-m表示占用的最大内存(单位为M)。

⑤.参数介绍在安装和启动时可设置如下参数:

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助


连接memcached服务器:telnet 192.168.1.120 11211
输入stats查看基本信息:
STAT pid 1712
STAT uptime 5247
STAT time 1402624936
STAT version 1.2.6
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 5
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 221
STAT bytes_written 512
STAT limit_maxbytes 67108864
STAT threads 1
⑤.停止memcached服务: 输入E:\memcached\memcached.exe -d stop|shutdown 进行关闭。



九、配置Session共享
①.这里需要使用一个开源项目,即Memcached Session Manager(MSM),如下链接是该开源项目的官网:
http://code.google.com/p/memcached-session-manager/
官方给出4种序列化方案,其中kryo是效率最高的,我下载的是javolution序列化方案jar包 
javolution-5.4.3.1.jar
memcached-session-manager-1.6.1.jar
memcached-session-manager-tc7-1.6.1.jar #Tomcat6 则用memcached-session-manager-tc6-1.5.1.jar
msm-javolution-serializer-1.6.1.jar
msm-javolution-serializer-cglib-1.3.0.jar
msm-javolution-serializer-jodatime-1.3.0.jar
spymemcached-2.7.3.jar


②.将上面所述的MSG的jar包拷贝至Tomcat安装目录lib文件夹中
   编辑Tomcat E:\JavaEE\Apache-Tomcat-7.0.41\conf\context.xml配置文件
   在<context>...</context>标签之间加入如下代码:


<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
        memcachedNodes="n1:localhost:11211" 
        requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"
        sessionBackupAsync="false"
        sessionBackupTimeout="100"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
        copyCollectionsForSerialization="false">        
</Manager>


注意此处:memcachedNodes="n1:localhost:11211" #将localhost换成实际启动了memcached服务的主机IP






③.测试项目:http://127.0.0.1/Session/login.jsp 登录成功页面返回结果如下:


192.168.126.1 服务器处理结果 SESSIONID = 2C33E37DD3EC70F1D1D66BA31D45970A-n1 
当前登录用户:1001------->>tom----->>123456 


刷新页面返回结果如下:
192.168.126.15 服务器处理结果 SESSIONID = 2C33E37DD3EC70F1D1D66BA31D45970A-n1 
当前登录用户:1001------->>tom----->>123456 


处理请求的服务器IP变化了,SESSION_ID保持一致,并且SESSION中保存的用户信息未失效说明SESSION共享成功。


到此利用Nginx + Tomcat + Memcached 搭建WEB服务器负载均衡SESSION失效转移成功。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值