您的位置:首页 > 数据库 > Memcache

Nginx +Tomcat 集群+memcached 实现负载均衡和session共享[实践篇Windows]

2016-10-17 16:29 946 查看
实践环境

打包下载

nginx安装

Nginxtomcat集群 负载均衡配置

tomcatmemcached实现session共享

测试Nginx和Tomcat

Manager 节点详细属性补充

nginx 配置详细补充 可以实现动静态分离

实践环境

windows10 64位

jdk 1.7

tomcat 7.0

nginx 1.10

memcached 1.4.4

打包下载

版本一致性很重要 不然会出现一系列莫名其妙的问题 这个我能用不代表你能使用

感谢:http://download.csdn.net/download/xu_xiao_ji/9550578

nginx安装

http://www.oschina.net/question/1014681_107718?fromerr=8MXDvfOJ

将安装包ngin解压到X:/目录

启动Nginx:进入X:/nginx目录,执行命令:start nginx.exe,弹出屏会一闪而逝。接着输入tasklist /fi “imagename eq nginx.exe”,出现如下内容,表示nginx已正常启动啦!在浏览器输入http://localhost,可以看到Nginx的欢迎页。



更多Nginx常用命令:

停止Nginx:nginx.exe -s stop|quit

重启Nginx:nginx.exe -s reload

查看Nginx版本:nginx.exe -v

修改文件$NGINX_HOME/conf/nginx.conf。

Nginx+tomcat集群 负载均衡配置

这里我就一台计算机搭建两个tomcat 所有tomcat2的几个端口不能和tomcat1重复 如果是两天计算机跳过这里



2 nginx /conf/nginx.conf配置修改



3 设置tomcat root 的index.jsp 添加tomcat1字样 tomcat2添加tomcat2字样

开启nginx tomcat1 tomcat2 如果访问localhost 刷新反复出现tomcat1 tomcat2 则配置成功

tomcat+memcached实现session共享

1 将需要的jar放入tomcat/lib下

再次提醒不同序列化方式需要的jar包不一样 而且jar的版本也决定成败

2 配置tomcat/bin/context.xml 添加如下节点

我这里端口改了默认是11211

我这里使用的kryo序列化方案 不同序列化transcoderFactoryClass配置不同

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11210"
failoveNodes="n1"
lockingMode="auto"
sticky="false"
requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync= "false"
sessionBackupTimeout= "100"
copyCollectionsForSerialization="false"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>


测试Nginx和Tomcat

  测试Nginx是否实现负载均衡已经Tomcat能否共享session信息,分别在两个Tomcat服务器的\webapps\ROOT目录下新建两个test.jsp页面,内容如下:

Tomcat1

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 1111111");
%>
</span>


Tomcat2

<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<%
out.println("This is Tomcat Server 2222222");
%></span>


通过浏览器访问Nginx服务器,如下图将访问地址改成Nginx所在服务器。

反复刷新浏览器,如果SessionID一直不变,下面的SessionPort的内容在不断变化则说明配置成功。

Manager 节点详细属性补充

1.className 必须

类名:de.javakaffee.web.msm.MemcachedBackupSessionManager

2.memcachedNodes 必须

memcached节点:此属性应该包含所有运行的 memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为::, 多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes=”n1:app01:11211,n2:app02:11211”,如果只 有单个的memcached节点,则是可选项,只需配置:即可,形 如:memcachedNodes=”localhost:11211”。

如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。

3.failoverNodes 可选项

故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。

4.username 可选项

从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

5.password 可选项

从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。

6.memcachedProtocol 可选项

定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。

7.sticky 可选项

定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性

8.lockingMode 可选项

只有非黏性session才使用,默认值为none

none: 从不对session进行锁定

all: session将一直被锁定,知道请求结束

auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定

uriPattern:: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。

9.requestUriIgnorePattern 可选项

此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用 上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要 触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。 如:”.*.(png|gif|jpg|css|js)$”

10.sessionBackupAsync 可选项

指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。

11.backupThreadCount 可选项

用来异步保存Session的线程数,(如果sessionBackupAsync=”true”)。默认值为cup的内核数。

12.sessionBackupTimeout 可选项

设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒

13.operationTimeout 可选项

从1.6.0版开始使用, 默认值为1000

14.sessionAttributeFilter 可选项

此属性是用来控制Session 中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如 sessionAttributeFilter=”^(userName|sessionHistory)$” 指定了只有”userName”和”sessionHistory”属性保存到Memcached中。依赖于选择的序列化策略。

15.transcoderFactoryClass 可选项

此属性值是创建序列化和反序列化 保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了 de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.

默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

16.copyCollectionsForSerialization 可选项

默认值为false。

17.customConverter 可选项

自己定义特殊的类注册到kryo自定义转换器中,实现序列化

18.enableStatistics 可选项

用来指定是否进行统计。 默认值为true。

19.enabled 可选项

指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。

nginx 配置详细补充 可以实现动静态分离

##定义nginx运行的用户各用户组
user nginx nginx;
##nginx进程数,建议设置与cpu核心数一致
worker_processes 1;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
##全局错误日志定义类型[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
##一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
##进程文件
#pid logs/nginx.pid;
##工作模式与连接数上限
events {
  ##参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
  use epoll;
  ##单个进程的最大连接数
  worker_connections 65535;
}
##设置http服务器
http {
  ##引入外置配置文件
  include /etc/nginx/conf.d/*.conf;
  ##文件扩展名与文件类型映射表
  include mime.types;
  ##默认文件类型
  default_type application/octet-stream;
  ##默认编码
  #charset utf-8;
  ##服务器名字的hash表大小
  #server_name_hash_bucket_size 128;
  ##上传文件大小限制   建议打开
  client_header_buffer_size 32K;
  ##设定请求缓存 建议打开
  large_client_header_buffers 4 64K;
  ##最大缓存
  client_max_body_size 20M;
client_header_timeout        20;
  ##日志格式设定
  #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指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如    果图片显示不正常把这个改成off。
  sendfile on;
  ##开启目录列表访问,合适下载服务器,默认关闭
  #autoindex on;
  ##防止网络阻塞  建议打开
  tcp_nopush on;
  ##防止网络阻塞  建议打开
  tcp_nodelay on;
  ##长链接超时时间,单位是秒,为0,无超时  
  keepalive_timeout 65;
  ##gzip模块设置
  ##开启gzip压缩输出     建议打开
  gzip on;
  ##最小压缩文件大小    建议打开
  gzip_min_length 1k;
  ##压缩缓冲区   建议打开
  gzip_buffers 4 16k;
  ##压缩版本(默认1.1,前端如果squid2.5请使用1.0)   建议打开
  gzip_http_version 1.0;
  ##压缩等级
  gzip_comp_level 2;     建议打开
  ##压缩类型,默认就已经包含了textxml,默认不用写,写上去也没有问题,会有一个warn    建议打开
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  ##开启连接限制ip连接数使用
  #limit_zone crawler $binary_remote_addr 10m;
##反向代理缓存Proxy Cache配置
proxy_temp_path  /opt/cache/nginx/temp;
proxy_cache_path /opt/cache/nginx/cache levels=1:2 keys_zone=infcache:600m inactive=1d max_size=2g;
proxy_cache_path  /opt/cache/nginx/proxy_cache_image  levels=1:2   keys_zone=cache_image:3000m inactive=1d max_size=10g;
proxy_connect_timeout 30;
proxy_read_timeout        60;
proxy_send_timeout        20;
proxy_buffer_size        96k;
proxy_buffers        8 256k;
proxy_busy_buffers_size        512k;
proxy_temp_file_write_size        512k;
#proxy_cache_path配置
#keys_zone=infcache:600m 表示这个zone名称为infcache,分配的内存大小为600MB
#/opt/cache/nginx/cache 表示cache这个zone的文件要存放的目录
#levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/data/ngx_cache/cache1/a/1b这种形式
#inactive=1d 表示这个zone中的缓存文件如果在1天内都没有被访问,那么文件会被cache manager进程删除掉
#max_size=10g 表示这个zone的硬盘容量为10GB
  ##FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  ##载均衡,weight权重,权值越高被分配到的几率越大
  upstream myserver{
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=4;
    server 192.168.1.12:8080 weight=1;
  }
  ##虚拟主机配置
  server {
    ##监听端口
    listen 80;
    ##域名可以有多个,用空格隔开
    server_name localhost;
    #charset koi8-r;
    ##定义本虚拟主机的访问日志
    #access_log logs/host.access.log main;

    location / {
      root html;
      index index.html index.htm;
    }
    ##图片缓存时间设置
    location ~.*.(gif|jpg|jpeg|png|bmp|swf)${
      expires 10d;
    }  
    ##js和CSS缓存时间设置
    location ~.*.(js|css)?${
      expires 1h;
    }
    #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;
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
      # proxy_pass http://127.0.0.1;     #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
      # root html;
      # fastcgi_pass 127.0.0.1:9000;
      # fastcgi_index index.php;
     # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
      # include fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
      # deny all;
    #}
    
    ##对 "/" 启用反向代理
    location / {
      ##或者使用
      #proxy_pass http://myserver;       proxy_pass http://127.0.0.1:88;       proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      #以下是一些反向代理的配置,可选。
      proxy_set_header Host $host;
      client_max_body_size 10m;       #允许客户端请求的最大单文件字节数
      client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数,
      proxy_connect_timeout 90;       #nginx跟后端服务器连接超时时间(代理连接超时)
      proxy_send_timeout 90;         #后端服务器数据回传时间(代理发送超时)
      proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
      proxy_buffer_size 4k;           #设置代理服务器(nginx)保存用户头信息的缓冲区大小
      proxy_buffers 4 32k;           #proxy_buffers缓冲区,网页平均在32k以下的设置
      proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
      proxy_temp_file_write_size 64k;      #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
    ##设定查看Nginx状态的地址
    location /NginxStatus {
      stub_status on;
      access_log on;
      auth_basic "NginxStatus";
      auth_basic_user_file confpasswd;
      #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
    }
    ##本地动静分离反向代理配置
    #所有jsp的页面均交由tomcat或resin处理
    location ~ .(jsp|jspx|do)?$ {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://127.0.0.1:8080;     }
    ##所有静态文件由nginx直接读取不经过tomcat或resin
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
      { expires 15d; }
    location ~ .*.(js|css)?$
      { expires 1h; }
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息