码迷,mamicode.com
首页 > Web开发 > 详细

Nginx+LAT(apache+tomcat)的实现和使用memcached保存tomcat的session会话

时间:2015-11-01 01:43:45      阅读:430      评论:0      收藏:0      [点我收藏+]

标签:nginx+lat(apache+tomcat)   apache的反向代理和负载均衡   tomcat-session-memcached   

Nginx+LATApache+tomcat)的实现和Apache反向代理和负载均衡tomcat的不同方式以及使用memcached保存tomcatsession会话

一.Nginx+LAT(Apache+tomcat)的环境结构;

    1.Nginx +Apache实现负载均衡用户请求至tomcat,其中Nginx是负载均衡调度器,Apachetomcat在同一台机器上,Apache将关于JSP的请求发送至tomcat

    2.实验结构图:


    

技术分享

  3.环境介绍,在两台CentOS7上都安装TomcatApache,实现动态.jsp内容的请求。在一台CentOS6上安装LAMP实现静态内容加.php的请求。一台Nginx实现负载均衡调度,且实现session sticky

二.Nginx+LAT的实现过程;

  1.CentOS7上安装TomcatApache

    在CentOS7Tomcat可以通过本地光盘镜像挂载安装。也可以通过源码安装,在安装tomcat之前要先安装好JDK环境。The Java Platform Standard Edition Development Kit (JDK) includesboth the runtime environment (Java virtual machine, the Java platform classesand supporting files) and development tools (compilers, debuggers,toollibraries and other tools).

在此讲述一下源码安装的过程:

    a.     安装jdk,jdk的版本要使用稳定的版本;可以从官方下载rpm类型的jdk软件包进行安装;jdk-7u79-linux-x64.rpm

    b.     安装好JAVA运行环境之后就可以安装tomcatapache-tomcat-8.0.23.tar.gz

    # tar xf apache-tomcat-8.0.23.tar.gz –C /usr/local/    
    # cd /usr/local/
    # ln –sv apache-tomcat-8.0.23 tomcat
    # vim /etc/profile.d/tomcat.sh
    exportCATALINA_HOME=/usr/local/tomcat
    export $PATH=$CATALINA_HOME/bin:$PATH

到此安装完成;只需运行catalina.sh start就可以启动tomcat

                 

   CentOS7上使用yum 安装tomcatApache即可:yuminstall tomcatyum install httpd会解决依赖的关系;

  2.在安装好tomcatApache的主机上进行相关配置:(两个节点的配置相似只是部分主机名不同和测试页面不同)

在配置之前在/etc/hosts添加一下内容:

        172.16.99.72node72.zkchang.com         node72

        172.16.99.71 node71.zkchang.com         node71

         并设置好主机名,关闭防火墙和selinux

    a.     tomcat上添加一虚拟主机,并提供测试页面;

    在目录/etc/tomcat目录下编写service.xml文件;在<Engine> </Engine>中添加如下内容:

    <Engine name="Catalina"defaultHost="node72.zkchang.com" jvmRoute="node72">    
    <Host name="node71.zkchang.com" 
        appBase="/test/webapps/" 
        unpackWARs="true"autoDeploy="false">
        <Contextpath="" docBase="/test/webapps/test1" />
         <Valve className="org.apache.catalina.valves.AccessLogValve"
          directory="/test/webapps/logs" 
          prefix="node71_access_log."suffix=".txt"
          pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    </Host>

    创建目录:

        ~]# mkdir /test/webapps/test1 –pv

        webapps]# mkdir test1/{WEB-INF,MATE-INF,classes,lib} –pv

       创建测试index.jsp网页页面:在/test/webapps/test1目录下创建文件index.jsp内容如下:

    <%@page language="java" %>    
    <html>
     <head><title>Node71</title></head>
      <body>
        <h1><fontcolor="red">node71.zkchang.com</font></h1>
        <tableborder="1">
          <tr>
            <td>Session ID</td>
        <%session.setAttribute("zkchang.com","zkchang.com"); %>
            <td><%= session.getId()%></td>
          </tr>
          <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime()%></td>
         </tr>
        </table>
      </body>
    </html>

    先测试一下tomcat是否正常运行:

    

技术分享

    b.     使用Apache反代tomcat,使tomcat不直接接收客户端的请求;

    Apache可以通过mod_jkmod_proxy模块跟tomcat整合,但是mod_proxy只有在Apache2.2.x系列的版本中才提供,Apache反向代理tomcat有三种种方法,一种是通过mod_proxy+mod_proxy_http

第二种是通过mod_proxy+mod_proxy_ajp.第三种通过mod_jk模块,但是mod_jk模块只支持ajp协议,所在tomcatserver.xml文件中要使用ajp协议。

    查看当前Apache是否支持mod_proxy,mod_proxy_http,mod_proxy_ajp模块:

     [root@node71 httpd]# httpd –M
     proxy_ajp_module(shared)
     proxy_balancer_module (shared)
     proxy_connect_module (shared)
     proxy_express_module (shared)
     proxy_fcgi_module (shared)
     proxy_fdpass_module (shared)
     proxy_ftp_module (shared)
     proxy_http_module (shared)
     proxy_scgi_module(shared)

本次实验使用mod_proxy+mod_proxy_http进行反向代理后端的tomcat

    编辑httpd的配置文件:

    注释中心主机:

     #DocumentRoot"/var/www/html"

    打开IncludeOptional conf.d/*.conf此项

    /etc/httpd/conf.d/目录下创建一文件并添加如下内容:

    [root@node71 httpd]# vim conf.d/proxy.conf    
    <VirtualHost*:80>
        ServerName node71.zkchang.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
        ProxyPass / http://node71.zkchang.com:8080/
        ProxyPassReverse /http://node71.zkchang.com:8080/
        <Location />
            Require all granted
        </Location>
    </VirtualHost>

    另一台的tomcat(172.16.99.72)Apache的配置和此节点的配置相似,只是相应的修改了主机名,以及测试内容不同。

    启动httpd服务,在浏览器中进行测试:

    

技术分享

  3.172.16.99.12node12)上安装LAP,用于响应静态内容和.php的动态内容:

        yum groupinstall" Server Platform Development" "Development tools"

    a.     安装httpd

    安装aprapr-util

    ]# tar xf apr-1.5.2.tar.bz2    
    ]# cd apr-1.5.2
    ]# ./configure --prefix=/usr/local/apr
    ]# make && make install
    ]# tar xf apr-util-1.5.4.tar.bz2
    ]# cd apr-util-1.5.4
    ]# ./configure --prefix=/usr/local/apr-uitl--with-apr=/usr/local/apr/
    ]# make && make install

    安装httpd:

    # tar xf httpd-2.4.12.tar.bz2    
    # cd httpd-2.4.12
    # ./configure --prefix=/usr/local/httpd  --sysconfdir=/etc/httpd24     --enable-so--enable-ssl --enable-cgi --enable-rewrite --with-zlib     --with-pcre--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util     --enable-modules=most--enable-mpms-shared=all --with-mpm=event
    # make && make install
    将/usr/local/httpd/bin目录下的apachectl文件复制到/etc/init.d/下,并命名为httpd:
    # cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd
    修改httpd文件:在文件前部分添加如下几行:
    # chkconfig: - 85 15
    # description: Apache is a World Wide Web server.
    添加系统服务:
    #  chkconfig --add httpd
    添加PATH变量:
    在目录/etc/profile.d/目录下创建一文件httpd.sh,内容如下:
    export PATH=/usr/local/httpd/bin/:$PATH

    httpd安装完毕

    b.     安装php

解决依赖关系:

# yum -y install bzip2-devel libmcrypt-devel(要通过epel源下载)libxml2-devel

编译安装php-5.6.4.tar.xz

        # tar xf php-5.6.4.tar.xz        
        # cd php-5.6.4
        # ./configure --prefix=/usr/local/php --with-openssl --with-mysql=mysqlnd         --with-mysqli=mysqlnd–with-pdo-mysql=mysqlnd --enable-mbstring         --with-freetype-dir--with-jpeg-dir --with-png-dir --with-zlib         --with-libxml-dir=/usr--enable-xml  --enable-sockets         --with-apxs2=/usr/local/httpd/bin/apxs--with-mcrypt         --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d--with-bz2          --enable-maintainer-zts
        #make && make install

1.为服务提供配置文件:

# cp php.ini-production /etc/php.ini

2.编辑httpd的配置文件,是apache支持php

                    # vim /etc/httpd/httpd.conf

                添加如下二行

                       AddTypeapplication/x-httpd-php  .php

                      AddType application/x-httpd-php-source  .phps

3.定位至DirectoryIndexindex.html

              修改为: DirectoryIndex index.php  index.html

    c.     测试

    /usr/local/httpd/htdocs/目录下创建一文件index.php 内容为:

    <?php

     phpinfo();

    ?>

    

技术分享

  4.172.16.99.10node10)上安装nginx,实现对后端服务器的负载均衡:

    Nginx安装使用的是yum安装,nginxrpm安装包存在epel源上。也可以通过源码进行安装;

在安装和配置之前node10要能够访问两台tomcat的主机名,还要关闭防火墙和selinux

    Yum安装nginx

  在/etc/nginx/nginx.conf配置文件中添加如下内容:

    user              nginx;    
    worker_processes  1;
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/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 /var/log/nginx/access.log  main;
        sendfile        on;
        #tcp_nopush     on;
        #keepalive_timeout  0;
        keepalive_timeout  65;
        upstream tcserver {
            ip_hash;
            server node71.zkchang.com;
            server node72.zkchang.com;
        }
        #gzip on;
        # Load config files from the/etc/nginx/conf.d directory
        # The default server is inconf.d/default.conf
        include /etc/nginx/conf.d/*.conf;
    }

                  /etc/nginx/conf.d/default.conf的配置如:        

     server{
        listen       80default_server;
        server_name node10.zkchang.com;
        include /etc/nginx/default.d/*.conf;
        error_page  404              /404.html;
        location = /404.html {
          root   /usr/share/nginx/html;
        }
        error_page   500 502 503 504  /50x.html;
          location = /50x.html {
          root  /usr/share/nginx/html;
        }
        location~* \.(php|html|jpg|png|gif|css|js|jpeg)$ {
           proxy_pass   http://172.16.99.12;
        }
        location~* \.(jsp|do)$ {
           proxy_passhttp://tcserver;
        }
    }

启动nginx服务器,进行测试:

技术分享

技术分享

    由于nginx的负载均衡调度算法为ip_hash,所以在第一访问之后,再次访问时会定向上次访问的节点上。

 

以下实验的配置都是在上述环境的基础实现的,也可重新配置实验环境

三.启动Manager功能;

         由于是yum安装的tomcat,默认在安装完之后在/usr/share/tomcat/webapps/目录下不会有apache-tomcat的主页,需要安装以下两个包:yum install tomcat-admin-webapps tomcat-webapps。安装之后,会在/usr/share/tomcat/webapps/目录下生成以下目录:examples  host-manager manager  ROOT  sample

         由于上述试验中,在server.xml文件中把defaultHost定义为”node71.zkchang.com”,在此为虚拟机添加一个ip(#ip addr add 172.16.99.100/16 dev eth0:0),在server.xml文件中,把默认的<Hostname="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">中的name=”localhost”修改为:Name=”172.16.99.100”。重新新启动tomcat服务。进行访问:

技术分享

    编辑tomcat-user.xml,添加如下行:    
    <role rolename="admin"/>
    <role rolename="admin-gui"/>
     <rolerolename="admin-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user name="admin" password="tcmanager"roles="admin,manager,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status"/>

而后重启tomcat

技术分享

技术分享

四.Apache使用mod_ajp模块和mod_proxy模块进行反向代理tomcat

         使用ajp协议方向代理tomcat其实很简单,只需在/etc/httpd/conf.d/proxy.conf添加如下内容即可:

      <VirtualHost*:80>
       ServerName node71.zkchang.com
       ProxyVia On
       ProxyRequests Off
       ProxyPreserveHost On
       <Proxy *>
           Require all granted
       </Proxy>
      proxyPass /status !
       ProxyPass / ajp://node71.zkchang.com:8009/
       ProxyPassReverse / ajp://node71.zkchang.com:8009/
       <Location />
           Require all granted
       </Location>
    </VirtualHost>

         重启httpd服务器;

         上述指令说明:

         ProxyPreserveHost{On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。

         ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off

         ProxyRequests{On|Off}:是否开启apache正向代理的功能。在做反向代理时,必须关闭此项。

         ProxyPassReverse:用于让apache调整HTTP重定向响应报文中的LocationContent-LocationURI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器

         ProxyPass  [path] !|url  [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。

ProxyPass后的参数:

         loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100

         retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。

         如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:

         lbmethodapache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。

         maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。

         nofailover:取值为OnOff,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On

stickysession:调度器的stickysession的名字,根据web程序语言的不同,其值为JSESSIONIDPHPSESSIONID

上述指令除了能在banlancer://ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:

    <Proxy balancer://hotcluster>

    BalancerMember  http://www1.lllkkk.com:8080 =1

    BalancerMember  http://www2.lllkkk.com:8080 loadfactor=2

    ProxySet lbmethod=bytraffic

    </Proxy>


五.实现Apache通过mod_proxy模块负载均衡后端的tomcat.并实现stickysession

实验通过172.16.99.71上的httpd负载均衡node71172.16.99.72上和node71172.16.99.71 上的tomcat

    在node71上:在/etc/httpd/conf.d/目录下编写proxybc.conf文件,添加如下内容:

    ProxyRequests Off    
    <proxy balancer://lbcluster1>
    BalancerMember http://172.16.99.71:8080loadfactor=1 route=node71
    BalancerMember http://172.16.99.72:8080loadfactor=1 route=node72
    </proxy>
     
    <VirtualHost *:80>
     ServerAdmin admin@zkchang.com
     ServerName node71.zkchang.com
     ProxyPass / balancer://lbcluster1/
     ProxyPassReverse / balancer://lbcluster1/ 
    </VirtualHost>

    重启httpd服务器即可。在这没有进行会话绑定,

技术分享

    进行会话绑定,bcproxy.conf的配置文件内容为:

    ProxyRequests Off    
    Headeradd Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <proxy balancer://lbcluster1>
    BalancerMember http://172.16.99.71:8080loadfactor=1 route=node71
    BalancerMember http://172.16.99.72:8080loadfactor=2 route=node72
    ProxySetstickysession=ROUTEID
    </proxy>
     
    <VirtualHost *:80>
     ServerAdmin admin@zkchang.com
     ServerName node71.zkchang.com
     ProxyPass / balancer://lbcluster1/
     ProxyPassReverse / balancer://lbcluster1/
    </VirtualHost>

技术分享

六.memcached保存session会话

使用memcached保存tomcatsession会话:tomcat-session-memcached 。也就是使用session服务保存session会话.

         Nginx+LAT实验环境的基础上来实现tomcatsession保存

技术分享

    实现这一功能需要一个组件:memcached-session-manager.下载此组件并安装至各个tomcat节点的安装目录下的lib目录中。(node71node72),下载memcached-session-manager-1.8.3.jar  memcached-session-manager-tc7-1.8.3.jar这两个组件和安装时,要与你安装tomcat的版本保持一致:

         由于是rpm安装的tomcatLib目录存在/usr/share/tomcat/lib/。将相关连的组件复制到此目录下:(两个tomcat 节点都需复制

    [root@node71msm]# cp memcached-session-manager-tc7-1.8.3.jar /usr/share/tomcat/lib/
    [root@node71 msm]# cp memcached-session-manager-1.8.3.jar/usr/share/tomcat/lib/
    [root@node71 msm]# cp msm-javolution-serializer-1.8.3.jar/usr/share/tomcat/lib/
    [root@node71 msm]# cp spymemcached-2.11.1.jar /usr/share/tomcat/lib/
    [root@node71 msm]# cp javolution-5.4.3.1.jar /usr/share/tomcat/lib/

    分别在node71:172.16.99.71 node72172.16.99.72上定义一个用于测试的context容器,并在此容器中创建一个会话管理器:

   <Host name="node72.zkchang.com"appBase="/test/webapps/" unpackWARs="true"autoDeploy="false">
       <Context path="" docBase="/test/webapps/test1">
        <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" 
            memcachedNodes="n71:172.16.99.71:11211,n72:172.16.99.72:11211"
            failoverNodes="n71"
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"           
            transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
       </Context>
   </Host>

    Yum 安装memcached服务,并启动;(另外一节点同样)

    

技术分享

    两个节点上的的Apache上面的配置如下:

        Node71node72:配置文件:(做反向代理tomcat),此处配置和上述的Nginx+LAT实验环境上的Apache的配置相同:

    <VirtualHost *:80>    
       ServerName node71.zkchang.com
       ProxyVia On
       ProxyRequests Off
       ProxyPreserveHost On
       <Proxy *>
           Require all granted
       </Proxy>
       ProxyPass / HTTP://node71.zkchang.com:8080/
       ProxyPassReverse / HTTP://node71.zkchang.com:8080/
       <Location />
           Require all granted
       </Location>
    </VirtualHost>

    使用node10 :172.16.99.10nginx对后端tomcat的负载均衡:

         /etc/nginxnginx.conf文件中的http段内定义upstream

      upstream tcserver {    
        #   ip_hash;
        server node71.zkchang.com;
        server node72.zkchang.com;
    }

    在/etc/nginx/conf.d/default.conf中定义对upstream的引用;

    location ~* \.(jsp|do|ico)$ {    
       proxy_pass http://tcserver;
    }

检测nginx的配置文件是否有错,(nginx -t)无错启动Ngnix服务器。

重新启动tomcatApache进行测试:

技术分享

技术分享

发现会话并没有发生变化,在node72上使用memcached-tool 127.0.0.1查看缓存:

技术分享

到此是基于memcached缓存tomcatsession会话的实现





本文出自 “片刻” 博客,请务必保留此出处http://zkchang.blog.51cto.com/10574636/1708481

Nginx+LAT(apache+tomcat)的实现和使用memcached保存tomcat的session会话

标签:nginx+lat(apache+tomcat)   apache的反向代理和负载均衡   tomcat-session-memcached   

原文地址:http://zkchang.blog.51cto.com/10574636/1708481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!