2015年12月21日

采用nginx_upstream_jvm_route模块解决tomcat多节点session不一致问题

这种方式不需要修改web工程只需要对nginx下载nginx_upstream_jvm_route插件,修改tomcat和nginx配置,就能解决session问题。由于这种方式不会把session存储起来,所以当某tomcat节点挂掉之后就会造成用户需要重新登录的问题。

思路:是通过对nginx里面每个参与访问的server都打上不同的标签值,这个值和tomcat的jvmRoute值相同。根据tomcat的特性,当server.xml配置文件中加了jvmRoute值后,会给sessionid加上jvmRoute值的后缀,根据这一特性,nginx_upstream_jvm_route对每次访问请求中的sessionId的值,自动匹配对应的server。这样就会使得每次都访问到同一个tomcat,这样就解决了访问不同tomcat节点,session发生变化的问题。但是这种方式就会有当一直访问的tomcat节点挂掉之后,根据负载的原理,将会访问其它节点,就会造成session发生变化,需重新登录的问题。

具体的实现步骤:

第一步:下载并安装nginx_upstream_jvm_route:

进入nginx目录,并下载和安装nginx_upstream_jvm_route,具体代码如下:

  1. shell $> patch -p0 < ../nginx-upstream-jvm-route-read-only/jvm_route.patch      
  2.    shell $> useradd www      
  3.    shell $> ./configure --user=www --group=www --prefix=/usr/local//nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/nginx-upstream-jvm-route-read-only      
  4.    shell $> make      
  5.    shell $> make install     

第二步:配置nginx
进入nginx的conf目录用vi命令打开nginx.conf文件,对该文件进行修改:

  1. #Nginx所用用户和组    
  2. #user  niumd niumd;    
  3.     
  4. #工作的子进程数量(通常等于CPU数量或者2倍于CPU)    
  5. worker_processes  2;    
  6.     
  7. #错误日志存放路径    
  8. #error_log  logs/error.log;    
  9. #error_log  logs/error.log  notice;    
  10. error_log  logs/error.log  info;    
  11.     
  12. #指定pid存放文件    
  13. pid        logs/nginx.pid;    
  14.     
  15. events {    
  16.         #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue    
  17.     #use epoll;    
  18.         
  19.     #允许最大连接数    
  20.     worker_connections  2048;    
  21. }    
  22.     
  23. http {    
  24.     include       mime.types;    
  25.     default_type  application/octet-stream;    
  26.     
  27.         #定义日志格式    
  28.     #log_format  main  '$remote_addr - $remote_user [$time_local] $request '    
  29.     #                  '"$status" $body_bytes_sent "$http_referer" '    
  30.     #                  '"$http_user_agent" "$http_x_forwarded_for"';    
  31.     
  32.     #access_log  off;    
  33.     access_log  logs/access.log;    
  34.     
  35.     client_header_timeout  3m;    
  36.     client_body_timeout    3m;    
  37.     send_timeout           3m;    
  38.      
  39.     client_header_buffer_size    1k;    
  40.     large_client_header_buffers  4 4k;    
  41.     
  42.     sendfile        on;    
  43.     tcp_nopush      on;    
  44.     tcp_nodelay     on;    
  45.     
  46.     #keepalive_timeout  75 20;    
  47.     
  48.     include    gzip.conf;    
  49.     upstream tomcat {    
  1. <span style="white-space:pre">    </span>#srun_id 值需与tomcat的jvmRoute的值对应    
  2.     
  3. server 127.0.0.1:18080 srun_id=tomcat2;    
  4.        server 127.0.0.1:18081 srun_id=tomcat1;    
  5.     jvm_route $cookie_JSESSIONID|sessionid reverse;    
  6.      }    
  7.     
  8.     server {    
  9.             listen       8081;    
  10.             server_name  127.0.0.1;       
  11.         location / {    
  12.          proxy_pass http://tomcat;    
  1.  #这些配置很重要    
  2.    proxy_redirect off ;    
  3.              proxy_set_header Host $host;    
  4.              proxy_set_header X-Real-IP $remote_addr;    
  5.              proxy_set_header REMOTE-HOST $remote_addr;    
  6.              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
  7.              proxy_set_header X-Forwarded-Proto https;    
  8.              proxy_cookie_path / /;    
  9.              proxy_set_header Cookie $http_cookie;    
  10.              client_max_body_size 50m;    
  11.              client_body_buffer_size 256k;    
  12.              proxy_connect_timeout 30;    
  13.              proxy_send_timeout 30;    
  14.              proxy_read_timeout 60;    
  15.              proxy_buffer_size 256k;    
  16.              proxy_buffers 4 256k;    
  17.              proxy_busy_buffers_size 256k;    
  18.              proxy_temp_file_write_size 256k;    
  19.              proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;    
  20.              proxy_max_temp_file_size 128m;    
  21.             }    
  22.                 
  23.    }    
  24. }    

第三:配置tomcat server.xml

打开tomcat的server.xml, 在两台服务器的tomcat的配置文件中分别找到: <Engine name="Catalina" defaultHost="localhos

  1. Tomcat01:      
  2. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">      
  3. Tomcat02:      
  4. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">     

第四:向tomcat1和tomcat2中部署相同的应用

第五:运行nginx、tomcat1、tomcat2

打开之后可以在浏览器里面输入:http://127.0.0.1:8081进行测试。可以通过浏览器的调试模式看出sessionID是固定不变的,只有当停掉当前一直访问的tomcat,sessionID才会发生变化

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*