• 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信息共享。

  • 相关阅读:
    C语言面试题大汇总
    cocos2d-x的win32编译环境
    完美解决Android SDK Manager无法更新
    ADT离线安装教程
    Android开发环境搭建教程
    如何利用dex2jar反编译APK
    Eclipse与Android源码中ProGuard工具的使用
    Proguard语法及常用proguard.cfg代码段
    Android之ProGuard混淆器
    Nutch源码阅读进程2---Generate
  • 原文地址:https://www.cnblogs.com/shihaiming/p/5896537.html
Copyright © 2020-2023  润新知