zoukankan      html  css  js  c++  java
  • Nginx+Tomcat+memcached负载均衡实现session共享

    原文:http://blog.csdn.net/zht666/article/details/38515147

    以下内容是参考原文修改后的

    测试环境linux  centOS 6

    在一台真实windows机上装了两台虚拟机

    192.168.1.249  

    192.468.1.248

    每台虚拟机都装了2个tomcat

    因为nginx已经是安装好的了,所以没有按照原博客安装,没有验证是否正确。

     tomcat也是安装好的,我在每一台服务器上都安装了2个tomcat,第二个tomcat是复制的第一个tomcat,

    编辑环境变量:vi /etc/profile

    加入以下代码
    ##########first tomcat###########
    CATALINA_BASE=/usr/local/tomcat
    CATALINA_HOME=/usr/local/tomcat
    TOMCAT_HOME=/usr/local/tomcat
    export CATALINA_BASE CATALINA_HOME TOMCAT_HOME
    ##########first tomcat############
    ##########second tomcat##########
    CATALINA_2_BASE=/usr/local/tomcat_2
    CATALINA_2_HOME=/usr/local/tomcat_2
    TOMCAT_2_HOME=/usr/local/tomcat_2
    export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME
    ##########second tomcat##########
    保存退出。
    再输入:source /etc/profile
    才能生效。

    然后再修改第二个tomcat的server.xml中的端口号,要与第一个tomcat的端口号不能一样,不然端口冲突起不来服务。

    最后再修改tomcat/bin/catalina.sh找到下面粉红字,

     # OS specific support.  $var _must_ be set to either true or false.

    在下面增加如下代码

    export CATALINA_BASE=$CATALINA_2_BASE
    export CATALINA_HOME=$CATALINA_2_HOME

    可以参考http://www.cnblogs.com/shihaiming/p/5896283.html

    1.安装Nginx

    Nginx官网:http://nginx.org/

    下载最新稳定版本。在安装Nginx之前,需要先安装gcc、 openssl、 pcre和zlib软件库。

    1.1安装gcc、gcc-c++

    安装命令:

    #sudo yum install gcc

    # sudo yum install gcc-c++

    1.2安装openssl

    openssl官网:http://www.openssl.org/

    安装版本:openssl-1.0.1i.tar.gz

    安装命令:

    #tar -zxvf openssl-1.0.1i.tar.gz

    #cd openssl-1.0.1i

    #sudo ./config --prefix=/usr/local/openssl-1.0.1i    #prefix指定安装目录

    #sudo make

    #sudo make install

    【注意】:此处使用的是config命令,而不是平常的configure命令

    安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。

    1.3安装pcre

    pcre官网:http://www.pcre.org/

    安装版本:pcre-8.35.tar.gz

    安装命令:

    #tar -zxvf pcre-8.35.tar.gz

    #cd pcre-8.35

    #sudo ./configure --prefix=/usr/local/pcre-8.35    #prefix指定安装目录

    #sudo make

    #sudo make install

    安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。

    【注意】:如果没有安装c++编译器,这个软件的安装会报错!

    1.4安装zlib

    zlib官网:http://www.zlib.net/

    安装版本:zlib-1.2.8.tar.gz

    安装命令:

    #tar -zxvf zlib-1.2.8.tar.gz

    #cd zlib-1.2.8

    #sudo ./configure --prefix=/usr/local/zlib-1.2.8    #prefix指定安装目录

    #sudo make

    #sudo make install

    安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。

    1.5安装Nginx

    安装版本:nginx-1.6.1.tar.gz

    安装命令:

    #tar -zxvf nginx-1.6.1.tar.gz

    #cd nginx-1.6.1

    #sudo ./configure

    --prefix=/usr/local/nginx-1.6.1                #prefix指定安装目录

    --with-openssl=/home/zht/src/openssl-1.0.1i    #指的是openssl源码路径

    --with-pcre=/home/zht/src/pcre-8.3.5          #指的是pcre的源码路径

    --with-zlib=/home/zht/src/zlib-1.2.8           #指的是zlib 的源码路径

    --with-http_ssl_module

    #sudo make

    #make install

    安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。

    1.5.1 配置Nginx

    配置文件目录:/usr/local/nginx-1.6.1/conf/nginx.conf

     cd /usr/local/nginx-1.6.1/conf

     vi nginx.conf

    修改后的配置文件如下:

    在#gzip on;后面加入upstream

    #gzip on;

    upstream tomcat {
    # ip_hash;
    server 192.168.1.249:8080 weight=1;
    server 127.0.0.1:8082 weight=1;
    server 192.168.1.248:8081 weight=1;
    server 192.168.1.248:8083 weight=1;
    }

    server {
    listen 8088;
    server_name localhost;

    location / {

    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
    root /usr/share/nginx/html;
    index index.html index.htm ;
    proxy_pass http://tomcat;
    proxy_connect_timeout 10;
    proxy_read_timeout 10;
    proxy_send_timeout 10;
    }

    }

    此处nginx配置的listen坚挺端口是8088,那么等配置好后访问nginx就是192.168.1.249:8088,这样就会显示nginx欢迎页

    在与tomcat集群配好后在访问192.168.1.249:8088,会显示tomcat的首页,

    要是测试集群是否正常,在每个tomcat的webapps目录下建个test目录,将测试用的index.jsp放在此目录下即可,此时访问http://192.168.1.249:8088/test/

    就会显示index.jsp内容。以上说的192.167.1.249是我nginx安装目录所在,自己测试时要根据自己实际的nginx所在服务器的ip来访问。

    效果如下图:

    访问测试用tomcat的webapps目录下的test/index.jsp的页面

    upstream tomcat{ # 负载均衡站点的名称为tomcat,可以自己取
    # ip_hash; # 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
    server 127.0.0.1:8080 weight=1; # web服务器的IP地址及tomcat发布端口,  #weigth参数表示权值,权值越高被分配到的几率越大
    server 127.0.0.1:8082 weight=1;

    server 192.168.1.248:8081 weight=1;

    server 192.168.1.248:8083 weight=1;

    }

     说明:红色字体的tomcat这个名称随便命名,但在location中proxy_pass ,http://后面的名称要一致

      weigth参数表示权值,权值越高被分配到的几率越大

    location 中加入有下划线的代码

    location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    proxy_pass http://tomcat; # 负载均衡指向的发布服务tomcat
    proxy_redirect default;
    proxy_connect_timeout 10; #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
    }

    proxy_pass http://tomcat;  #是必须要加的

    proxy_connect_timeout  10;   #这个参数是连接的超时时间。 我设置成10,表示是10秒后超时会连接到另外一台服务器

    #其他参数自己选吧。

    2. Memcache安装

    Memcached官网:http://memcached.org/

    安装memcached需要先安装libevent,libevent官网:http://libevent.org/

    本次安装版本:

    memcached-1.4.31.tar.gz

    libevent-2.0.22-stable.tar.gz

    2.1安装livevent

    查看是否已安装:# rpm qa | grep libevent

    如果已安装且版本低于1.3,则先通过:

    # rpm -e libevent --nodeps 进行卸载。

    # tar zxvf libevent-2.0.22-stable.tar.gz

    # cd libevent-2.0.22-stable

    # sudo ./configure --prefix=/usr/local/libevent-2.0.22-stable      #prefix指定安装路径

    # sudo make

    # sudo make install

    安装完成后,到prefix指定的目录下,看看是否存在libevent-2.0.22-stable目录,如下图所示。

    图片中版本是2.0.21,因为重命名弄错了,实际版本还是2.0.22

    2.2安装Memcached

    # tar zxvf memcached-1.4.31.tar.gz

    # cd memcached-1.4.31

    sudo ./configure --prefix=/usr/local/memcached-1.4.31 --with-libevent=/usr/local/libevent-2.0.22-stable

    # sudo make

    # sudo make install

    2.2.1检查看装情况

    安装完成后,到prefix指定的目录下查看是否有memcached-1.4.31目录,如下图所示。

    2.2.2查看memcached和libevent版本信息

    首先定位到Memcached的bin目录下:

    # cd /usr/local/memcached-1.4.31/bin

    执行命令:

    # sudo ./memcached -i

    2.2.3启动memcached

    # sudo ./memcached -d -v -p 12000 -m 512 -u root

    解释:-d表示以守护进程方式运行memcached;-v表示输出浸膏和错误信息;-p指定监听的端口号;-m指定能使用的最大内存,单位MB;-u指定运行memcached的账户。

    红色的12000这个参数非常重要,在tomcat的context.xml中配置memcache时memcachedNodes必须要与其一致,不然启动tomcat时报错,拒绝链接

    如果在同一台服务器上安装多个memcached时,此数字不能一样,这个数字自有定义,只要没被占用。

    Memcache

    使用# ps -ef | grep memcached查看进程。

    3. tomcat配置Memcache

    到tomcat的安装目录lib中,加入:需要的jar包

    每个tomcat的lib下都要加入这些jar

    Tomcat6、Tomcat7、Tomcat8使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar、memcached-session-manager-tc7-1.6.5.jar、memcached-session-manager-tc8-2.0.0.jar,

    只可选一,安装tomcat的版本下载该jar,否则启动报错。

    配置tomcat. 在tomcat安装目录下的context.xml文件中加入:

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:127.0.0.1:12000"
    sticky="false"
    requestUriIgnorePattern=".*.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
    sessionBackupAsync="false"
    sessionBackupTimeout="100"
    copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

    说明:红色字体n1表示memcached服务器节点的名称,12000表示该节点的端口号,此端口号与启动memcached时的端口号要一致

    有人说:也可在server.xml配置文件的<Host>...<Host>中添加配置

    <Context docBase="webapps" path="" reloadable="true">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:127.0.0.1:12000"
    sticky="false"
    requestUriIgnorePattern=".*.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
    sessionBackupAsync="false"
    sessionBackupTimeout="100"
    copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
    </Context>

    这个我没试

    【参数说明】:

    docBase:与<Host>中的appBase一致,网站部署目录。

    memcachedNodes:memcached服务器信息,此属性是必须的。这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为<id>:<host>:<port>,多个服务器之间用空格或半角逗号隔开,如:

    n1:127.0.0.1:12001 n2:127.0.0.1:12002  n3:127.0.0.1:12003

    如果你设置单个memcache节点<id>是可选的,所以它允许设置为<host>:<port>,如:memcachedNodes="localhost:11211"

    打开server.xml文件,在<Engine>节点的中添加jvmRoute="jvm1",这个是用于指定Tomcat集群的路由。Tomcat2设置成jvmRoute="jvm2",Tomcat3设置成jvmRoute="jvm3",依次类推。

    注意: sticky模式时,要配置jvmroute参数,每台tomcat的jvmroute参数都不能一样

    在tomcat目录的/conf/server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    4. 测试Session共享

    测试JSP代码如下:index.jsp

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Tomcat+memcached共享session测试</title>
    </head>
    <body>
    SessionID:<%=session.getId()%>
    <BR>
    SessionIP:<%=request.getServerName()%>
    <BR>
    SessionPort:<%=request.getServerPort()%>
    <BR>

    这里是服务器192.168.1.249  

    <BR>

     tomcat端口是8080

    </body>
    </html>

    上面的红色字体根据实际的tomcat服务配置来写,方便看是否集群且session共享成功。

    下面是我测试的效果:

    千万要记住:浏览器输的地址是nginx服务的地址,不是某一个tomcat的地址,因为是nginx来做的负载均衡,由nginx来分配具体访问哪个服务。

    要在每一个tomcat中webapps下新建一个test目录,把index.jsp放进去。

    由图可以看到,三个Tomcat的SessionID都是一样的:BBE70447F8121E0A011CB3879FBF17A7-n1.jvm1 ,

    -n1是memcached服务器的节点名称,jvm1 是我在其中一个tomcat的server.xml中<Engine>节点的中添加jvmRoute="jvm1 ",这个是用于指定Tomcat集群的路由,可以不写,写的话就会在sessionid里显示。

    只要不关闭浏览器,不管怎么刷新,SessionID都是不变了。由此可以,三个Tomcat通过memcached实现了Session信息共享。

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/shihaiming/p/5896537.html
Copyright © 2011-2022 走看看