提示:关于nginx 和tomcat 己经在前面的博文己在介绍过了

第一部分:nginx反向代理tomcat

一、软件及环境

软件

系统 角色 用途 安装的软件 ip地址
Centos6.5x86_64 nginx 反向代理用户请求 nginx 172.16.249.210
Centos6.5x86_64 tomcat1 处理jsp请求
jdk+tomcat 172.16.249.101
Centos6.5x86_64 tomcat2 172.16.249.100
Centos6.5x86_64 mog(ilefs/store) 分布式存储静态数据 mogilefs 172.16.249.129
Centos6.5x86_64 mog(ilefs/store)+mariadb 172.16.249.128

拓扑图

linux+nginx+tomcat负载均衡,实现session同步_第1张图片

二、实现过程

1、nginx安装

配置文件如下:


#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
upstream mogfs_cluster {
    server 172.16.249.128:7001;
    server 172.16.249.129:7001;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
}
upstream jsp_server {
   server 172.16.249.100:8080;
   server 172.16.249.101:8080;
}
    server {
        listen       80;
       # server_name  localhost;
       # location / {
        #    root   html;
        #    index  index.html index.htm;
       # }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    location ~* ^(/p_w_picpaths/.*)$ {
             mogilefs_tracker mogfs_cluster;
             mogilefs_domain p_w_picpaths;
         mogilefs_noverify on;
         mogilefs_pass $1 {
        proxy_pass $mogilefs_path;
        proxy_hide_header Content-Type;
        proxy_buffering off;
}
}
    location ~* ^(/text/.*)$ {
             mogilefs_tracker mogfs_cluster;
             mogilefs_domain text;
             mogilefs_noverify on;
             mogilefs_pass $1 {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
}
}
  location ~* (\.jsp|do)$ {
        proxy_pass http://jsp_server;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
}                                                                                                                      
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2、安装JDK+Tomcat

tomcat1配置文件如下(server.xml)





  
  
  
  
  
  
  
  
  
  
  
    
    
  
  
  
    
    
    
    
    
    
    
    
    
    
    
    
    
      
      
      
      
        
        
      
      
            
            
      
      
        
        
        
        
      
    
  

站点目录文件如下

[root@essun tomcat]# cd webapps/essun/
[root@essun essun]# ls
index.jsp  WEB-INF
[root@essun essun]# ll WEB-INF/
total 8
drwxr-xr-x 2 root root 4096 May  2 11:07 classes
drwxr-xr-x 2 root root 4096 May  2 11:07 lib
[root@essun essun]# cat index.jsp
<%@  page language="java" %>

  essun.node2
      

essun.node2.org

<% session.setAttribute("essun.org","essun.org"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>

"Picture"

<% out.println(""); %>

tomcat2 与此处的配置相同,仅 index.jsp有所不同

[root@essun essun]# cat index.jsp
<%@  page language="java" %>

  essun.node1
      

essun.node1.org

<% session.setAttribute("essun.org","essun.org"); %>
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>

"picture"

<% out.println(""); %>

3、mogilefs安装

配置文件中只要修改对应的ip地址即可

4、测试

访问nginx

linux+nginx+tomcat负载均衡,实现session同步_第2张图片

刷新后的结果

linux+nginx+tomcat负载均衡,实现session同步_第3张图片

己经通过nginx中的proxy_pass为tomcat反向代理

注:

<% out.println( "" ); %>

这两处的url都是nginx反向代理mogilefs的url.

第二部分、实现session会话同步(DeltaManager方式)

tomcat会话管理

会话分类

标准会话管理器和持久会话管理器

标准会话管理器(StandardManager)

默认保存于$CATALINA_HOME/work/Catalina///下的SESSIONS.ser文件中。

  • maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制;

  • maxInactiveInterval:非活动的会话超时时长,默认为60s;

  • pathname:会话文件的保存目录;  持久会话管理器(PersistentManager):将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。

  • 保存至文件中的示例  


          
        

每个用户的会话会被保存至directory指定的目录中的文件中,文件名为.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。  

  • 保存至JDBCStore中的示例  



          
        


Manger对象用于实现HTTP会话管理的功能,Tomcat6中有4种Manger的实现:

  • StandardManagerTomcat7的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。

  • PersistentManager当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。

  • DeltaManager用于Tomcat集群的会话管理器,它通过将改变了的会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。

  • BackupManager用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。

注 :

负载均衡,且实现会话绑定要注意给每个tomcat实例的egine容器一个jvmRoute属性!此名称要跟前端调度模块使用名称保持一致!另外,在mod_proxy实现负载均衡的会话绑定时,还要使用sticksession=JSESSIONID(字符要大写)!

1、分别打开tomcat1和tomcat2下conf中server.xml


 

找到

Tomcat1下的修改为

Tomcat2下的修改为

2、修改tomcat1中的Cluster className tomcat1找到 修改为


#在这以下为添加内容
 
          
          
            
            
            
              
            
            
            
          
          
          
          
          
          
        

3、将conf/web.xml复制一份到发布的站点目录WEB-INF下,在前面加入以下这句话

如我的站点目录为

[root@essun tomcat]# cd webapps/essun/
[root@essun essun]# ll WEB-INF/
total 168
drwxr-xr-x 2 root root   4096 May 14 04:40 classes
drwxr-xr-x 2 root root   4096 May 14 04:40 lib
-rw------- 1 root root 162921 May 14 04:40 web.xml

4、在各节点为使用组播地址添加组播路由,格式:

route add -net $MCAST_ADDRESS netmask 255.255.255.255 dev eth0

如我自己的地址为

route add -net 228.0.0.4 netmask 255.255.255.255 dev eth0

而在tomcat2上只有两处与tomcat1不同,其它操作都一样

jvmRoute="tomcat2"

address="172.16.249.101"

address最好是当前节点的主机地址

session同步到这里设置完毕。

看一下效果

linux+nginx+tomcat负载均衡,实现session同步_第4张图片

还有一张

linux+nginx+tomcat负载均衡,实现session同步_第5张图片

服务器的启动顺序如下:

tomcat1 --> |tomcat2 --> |nginx

先启动tocmat1,等tomcat1启动完全的时候再启动tomcat2,等两个tocmat全启动之后,再启动nginx负载的时候可以用APACHE或NGINX,如果什么都不用,两台一接防问了话,可能会出错极session不同步的问题,网上也很多人介意不要做seeeion同步,这样会降低机器的性能,有一个方法可以,就是NGINX的ip_hash,这样至少可以保证客户端去防问同一台TOCMAT,除非那台TOCMAT挂了