LNMP-memcache、openresty、tomcat、session共享

##为了提高网络的访问速度,一般会建立缓存,下面将演示分别在php和nginx 建立memcache缓存,来提高访问速度.

MemCache的工作流程如下
先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。
Memcached是以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
对cpu没有限定,只要内存足够大就一直能用(加内存条)

所有web服务器如:IIS/nginx/apache只能处理静态页面

Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口
Memcache面向对象的常用接口包括:(telnet localhost 11211)
Memcache::connect – 打开一个到Memcache的连接
Memcache::pconnect – 打开一个到Memcache的长连接
Memcache::close – 关闭一个Memcache的连接
Memcache::set – 保存数据到Memcache服务器上
Memcache::get –提取一个保存在Memcache服务器上的数据
Memcache::replace –替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set)
Memcache::delete – 从Memcache服务器上删除一个保存的项目
Memcache::flush – 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目)
Memcache::getStats – 获取当前Memcache服务器运行的状态

memcache是php的扩展模块—–主要做缓存,没有持久化,用来作加速可以匹配数据库,降低数据库压力.

环境变量的更改:
vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin

一、php-memcache的安装:
安装包:memcache-2.2.5.tgz
安装步骤:
(1)解压
tar zxf memcache-2.2.5.tgz
(2)在解压目录下:
phpize ————– 生成预编译环境(才会有configure执行文件)
(3)编译安装
./configure make && make install
安装完成之后发现memcache安装在/usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20131226/(php的扩展里面)
(4)让memcache在php里面生效
此时在这个目录下有memcache.so文件,为了在php里面生效memcache那么需要在php.ini的配置文件里面加入

 873 extension=memcache.so(将动态扩展模块下面的扩展加上memcache)
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example, on Windows:
;
;   extension=msql.dll
;
; ... or under UNIX:
;
extension=memcache.so

此时平滑重启php /etc/init.d/php-fpm reload
查看memcache模块是否加入:
php -m | grep memcache

二、memcached服务的安装:
yum install -y memcached

(1)在/root/memcache-2.2.5目录下:
cp example.php /usr/local/lnmp/nginx/html/
cp memcache.php /usr/local/lnmp/nginx/html/

(2)更改memcache在浏览器登陆的用户和密码:
vim /usr/local/lnmp/nginx/html/memcache.php

define('ADMIN_USERNAME','memcache');    // Admin Username
define('ADMIN_PASSWORD','password');    // Admin Password

(3)更改浏览器测试连接memcache的地址
vim /usr/local/lnmp/nginx/html/example.php

$memcache = memcache_connect('172.25.34.3', 11211);

(4)平滑启动:
nginx -s reload

浏览器测试

在example.php页面刷新,会在memcache页面发现命中率在不断提高,最后接近100%

压力测试(如果没有ab命令–安装httpd-tools)

ab -c 10 -n 5000 http://172.25.34.1/example.php
-c 并发量 -n 访问次数

三、openresty的安装测试:

OpenResty #基于nginx开发的工具,使用起来和nginx一样。 通过汇聚各种设计精良的Nginx模块,从而Nginx有效的变成一个强大的通用Web应用平台,是一种整合了Nginx和lua的框架。

OpenResty运行原理
Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程)。协程之间数据隔离,每个协程具有独立的全局变量_G。
ps. 协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。

OpenResty的优势

首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。
而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。

(1)openresty的安装
安装包:openresty-1.13.6.1.tar.gz

安装步骤:
cd openresty-1.13.6.1
./configure
gmake && gmake install
nginx -s stop #关闭原有nginx服务
在这个服务里面更改nginx配置文件:
vim /usr/local/openresty/nginx/conf/nginx.conf

    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.conf;
    }

编写测试页面:
vim /usr/local/openresty/nginx/html/index.php
启动nginx:
/usr/local/openresty/nginx/sbin/nginx -t 检查配置文件的更改是否成功
/usr/local/openresty/nginx/sbin/nginx

压力测试:(一般情况下压力测试不要自己压自己:)
ab -c 10 -n 5000 http://172.25.78.1/index.php
ab -c 10 -n 5000 http://172.25.78.1/example.php

(2)实际应用中通常在nginx和php下都做缓存,这样就会大大提高访问体验

vim /usr/local/openresty/nginx/conf/nginx.conf

 19 http {
 20         upstream memcache {
 21         server 172.25.78.1:11211;
 22         #keepalive 512 single;
 23 }

 26     include       mime.types;
 27     default_type  application/octet-stream;

 57     server {
 58         listen       80;
 59         server_name  localhost;
 60 
 61 #memc-nginx-module
 62     location /memc {
 63                 internal;
 64                 memc_connect_timeout 100ms;
 65                 memc_send_timeout 100ms;
 66                 memc_read_timeout 100ms;
 67                 set $memc_key $query_string;
 68                 set $memc_exptime 300;
 69                 memc_pass memcache;
 70               }
]
 99         location ~ \.php$ {
100                 set $key $uri$args;
101                 srcache_fetch GET /memc $key;
102                 srcache_store PUT /memc $key;
103                 root           html;
104                 fastcgi_pass   127.0.0.1:9000;
105                 fastcgi_index  index.php;
106         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_s    cript_name;
107                  include        fastcgi.conf;
108         }

(3)nginx平滑启动
/usr/local/openresty/nginx/sbin/nginx -s reload

(4)再次做压力测试体验两次压测的区别

使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

摘抄自互联网
Nginx的Memc和SR Cache模块
缓存策略的改进

为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统。众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的成熟,越来越多的系统开始转型为LNMP(Linux+Nginx+MySQL+PHP with fpm),这是因为Nginx采用基于事件机制的I/O多路复用思想设计,在高并发情况下其性能远远优于默认采用prefork模式的Apache,另外,相对于Apache,Nginx更轻量,同时拥有大量优秀的扩展模块,使得在Nginx上可以实现一些美妙的功能。

传统上,PHP中使用memcache的方法是使用php-memcache或php-memached扩展操作Memcache,然而在Nginx上有构建更高效缓存机制的方法,本文将首先介绍这种机制,然后介绍具体的操作步骤方法,最后将对这种机制和传统的PHP操作memcache的性能进行一个benchmark。

我们知道,Nginx的核心设计思想是事件驱动的非阻塞I/O。

Nginx被设计为可以配置I/O多路复用策略,在Unix系统中传统的多路复用是采用select或poll,但是这两个方法的问题是随着监听socket的增加,性能会下降,因为在linux内核中是采用轮询的方式判断是否可以触发事件,换句话说算法的复杂度为O(N),而在较新的linux内核中引入了复杂度为O(1)的epoll,因此Nginx在Linux下默认采用epoll,而在FreeBSD下默认采用kqueue作为I/O策略。

即便是这样,传统的缓存策略仍可能造成效率低下,因为传统上是通过PHP操作memcache的,要执行PHP代码,Nginx就必然要和FastCGI通信,同时也要进入PHP的生命周期,因此SAPI、PHP Core和Zend Engine的一系列逻辑会被执行。更糟糕的是,fpm和PHP可能会阻塞,因此破坏了Nginx的非阻塞性。(原文中此处表述有误,fastcgi与nginx进行同步通信,但并不会破坏nginx i/o的非阻塞性,多谢agentzh给予指正)下图展示了在memcache命中时整个处理过程。

可以看到,即使Memcache命中,还是要进入PHP的生命周期。我们知道,目前很多互联网应用都使用RESTful规范进行设计,在RESTful应用下,普遍使用uri和查询参数作为缓存的key,因此一种更高效的缓存策略是Nginx直接访问Memcache,并用$uri$args等Nginx内置变量设定缓存key规则,这样,当缓存命中时,Nginx可以跳过通过fastcgi和PHP通信的过程,直接从memcache中获取数据并返回。memc-nginx和srcache-nginx正是利用这种策略提高了缓存的效率。下图是这种高效缓存策略的示意图(当memcache命中时)。

模块介绍

memc-nginx和srcache-nginx模块均为前淘宝工程师agentzh(章亦春)开发。其中memc模块扩展了Nginx标准的memcache模块,增加了set、add、delete等memcache命令,而srcache则是为location增加了透明的基于subrequest的缓存层。两者配合使用,可以实现上一节提到的高效缓存机制。关于两个模块的详细信息可以参考它们Nginx官网的wiki(memc wiki,srcache wiki)页。
安装及配置

下面以LNMP环境介绍如何使用这两个模块构建缓存层。

因为Nginx并不支持模块动态加载,所以要安装新的模块,必须重新编译Nginx。首先下载两个模块(memc下载地址,srcache下载地址),另外,为了发挥出缓存的最大性能,建议将memcache的upstream配置为keep-alive,为了支持upstream的keep-alive需要同时安装http-upstream-keepalive-module。

将模块下载并解压到合适的目录,这里我Nginx使用的版本是1.0.4,与相关模块一起解压到了/home/www/download

然后就可以编译安装Nginx了,命令如下:

./configure --prefix=/usr/local/nginx \
--add-module=../memc-nginx-module \
--add-module=../srcache-nginx-module \
--add-module=../ngx_http_upstream_keepalive
make
make install

这里我将nginx安装到/usr/local/nginx下,你可以根据自己的需要更改安装路径,另外,我只列出了本文必要的configure命令,你也可以增加需要的configure选项。
然后需要对nginx进行配置,nginx默认主配置文件放在安装目录的conf下,例如我的主配置文件为/usr/local/nginx/conf/nginx.conf。
这里我只贴出相关的配置:

#Memcache服务upstream
upstream memcache {
    server localhost:11211;
    keepalive 512 single;
}
server {
    listen       80;
    server_name  localhost;
    #memc-nginx-module
    location /memc {
        internal;
        memc_connect_timeout 100ms;
        memc_send_timeout 100ms;
        memc_read_timeout 100ms;
        set $memc_key $query_string;
        set $memc_exptime 300;
        memc_pass memcache;
    }
    location / {
        root   /var/www;
        index  index.html index.htm index.php;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        charset        utf-8;
        default_type   text/html;
        #srcache-nginx-module
        set $key $uri$args;
        srcache_fetch GET /memc $key;
        srcache_store PUT /memc $key;
        root           /var/www;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

下面解释一下其中几个点。
上文说过,memc-nginx是一个标准的upstream模块,因此首先需要定义memcache的upstream。这里我在本机上启动了一个memcache服务,端口为默认的11211,keepalive指令是http-upsteram-keepalive-module提供的功能,这里我们最大保持512个不立即关闭的连接用于提升性能。

下面是为memc-nginx-module配置location,我们配置为/memc,所有请求都通过请求这个location来操作memcache,memc-nginx-module存取memcache是基于http method语义的,使用http的GET方法表示get、PUT方法表示set、DELETE方法表示delete。这里我们将/memc设为internal表示只接受内部访问,不接收外部http请求,这是为了安全考虑,当然如果需要通过http协议开放外部访问,可以去掉internal然后使用deny和allow指令控制权限。比较重要的是$memc_key这个变量,它表示以什么作为key,这里我们直接使用Nginx内置的$query_string来作为key,$memc_exptime表示缓存失效时间,以秒记。这里统一设为3005分钟),在实际应用中可以根据具体情况为不同的内容设置不同的过期时间。

最后我们为“~ \.php$”这个location配置了缓存,这表示所有以“.php”结尾的请求都会结果被缓存,当然这里只是示例需要,实际中一般不会这么配,而是为特定需要缓存的location配置缓存。

srcache_fetch表示注册一个输入拦截处理器到location,这个配置将在location进入时被执行;而srcache_store表示注册一个输出拦截器到location,当location执行完成并输出时会被执行。注意srcache模块实际可以与任何缓存模块进行配合使用,而不必一定是memc。这里我们以$uri$args作为缓存的key。

经过上述配置后,相当于对Nginx增加了如下逻辑:当所请求的uri以“.php”结尾时,首先到memcache中查询有没有以$uri$args为key的数据,如果有则直接返回;否则,执行location的逻辑,如果返回的http状态码为200,则在输出前以$uri$args为key,将输入结果存入memcache。
更多配置

上一节给出了使用memc和srcache构建缓存层的最基本方法,实际应用中可能需要更多灵活的配置,例如为不同的location配置不同的缓存参数,根据返回内容而不是返回的http状态码确定是否缓存等等。可以有很多的方法实现这些需求,例如,srcache还支持两个指令:srcache_fetch_skip和srcache_fetch_skip,这两个指令接受一个参数,当参数已定义且非0时,则进行相应操作,否则不进行。例如,如果配置了srcache_fetch_skip $skip,这条指令,那么只有当$skip的值为非0时,才将结果缓存,如果配合ngx_lua模块的set_by_lua指令,则可以实现复杂的缓存控制。如:

location /xxxx {
    set $key ...;
    set_by_lua $skip '
        if ngx.var.cookie_foo == "bar" then
            return 1
        end
        return 0
    ';
    srcache_fetch_skip $skip;
    srcache_store_skip $skip;
    srcache_fetch GET /memc $key;
    srcache_store GET /memc $key;
    # proxy_pass/fastcgi_pass/...
}

这表示对/xxxx这个location的访问,只有存在cookie “foo”且值为“bar”时缓存机制才起作用。关于ngx_lua的更多内容请参考其主页。

另外,我最近在春哥(章亦春在淘宝的昵称)的微博上看到他目前正在完善srcache的功能,为其实现更多RFC2616的缓存行为标准。关于这个模块的最新动态可以关注其github主页。
Benchmark

下面对使用memc和srcache构建的缓存机制进行一个简单的benchmark,并与使用PHP操作memcache的策略进行一个对比。为了简单起见,我们的测试PHP脚本不去访问I/O,而仅仅是调用phpinfo函数输出PHP相关信息。
测试一共分三组进行:第一组在Nginx和PHP中均不开启缓存,第二组仅使用PHP memcache缓存,第三组仅使用Nginx memcache缓存。三组都用ab程序去压,并发数为20,请求次数为10000。
这里的测试环境是我的一个虚拟机,操作系统为Ubuntu10,内存512M。Nginx采用epoll,单worker进程,memcache最大并发数为1024,最大使用内存64m。
不开启缓存

这一组我们不开启缓存,PHP程序非常简单:

<?php
phpinfo();
?>

测试结果如下:

PHP memcache缓存策略

第二组我们用PHP操作缓存,测试脚本为:

<?php
$memc = new Memcached;
$memc->addServer('localhost', 11211) or die('Connect to memcache server failed!');
$output = $memc->get('my_key');
if(empty($output)) {
    ob_start();
    phpinfo();
    $output = ob_get_contents();
    ob_end_clean();
    $memc->set('my_key', $output, 300);
}
echo $output; 
?>

测试结果如下:

Nginx memcache缓存策略

最后,我们将PHP脚本回归到不使用缓存的版本,并配置好memc和srcache缓存机制。
测试结果如下:

结果对比分析

为了直观,我取“每秒处理请求数”、“平均每个请求处理时间”和“吞吐率”作为评价指标,制作了一张图表。

我想看到图表,结论已毋需我多言。在各项指标上使用memc和srcache构建的缓存机制都大大优于使用PHP操作memcache。其中每秒处理请求数(并发度)和吞吐率都是其9倍左右,而平均个请求所用时间仅有传统策略的1/8。

这里要特别说明一下,这里之所以PHP memcache策略比不使用缓存优势不明显,是因为我们的PHP脚本不涉及I/O操作,如果其中存在如数据库存取,PHP memcache的优势还是有的,但不论如何,Nginx memcache策略在性能上的优势是其无法比拟的。

另外,除了性能优势外,使用这种策略还可以简化PHP逻辑,因为缓存这一层都放在Nginx中了,PHP就从缓存操作中解放了出来,因此是一举多得。

如果你的系统也构建在LNMP上(或LAMP)上,不妨使用本文提到的方法替代传统的缓存策略,尽情享受性能上的提升。

四、tomcat的安装

nginx只能处理静态页面,所有的.php页面都要交给php处理。但php相对处理速度慢,从压测就能看出来。(client–nginx:80–fastcgi_pass–php-fpm:9000–php-memcache:11211–memcached)为实现动静分离更好的是将动态请求和静态请求分开,所以安装 tomcat

(1)安装步骤
安装包:jdk-7u79-linux-x64.tar.gz
apache-tomcat-7.0.37.tar.gz
(2)jdk环境的配置
解压: tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
在解压目录下:
ln -s jdk1.7.0_79/ java —-为了为以后升级jdk版本方便,不用在配置文件里也要到处修改
环境变量的配置:
vim /etc/profile

export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile #使环境变量立即生效

查看是否配置成功:javac(看是否报错,是否not found)

(3)tomcat的配置
解压:tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
在解压目录下:
ln -s apache-tomcat-7.0.37/ tomcat
启动tomcat:
cd /usr/local/tomcat/bin
./startup.sh

测试:ip:8080—会出现tomcat的页面

tomcat的发布目录和nignx的默认发布目录不再一起
nginx:/usr/local/lnmp/nginx/html/
tomcat:/usr/local/tomcat/webapps/ROOT/

编写tomcat测试页:
vim test.jsp

    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page import="java.util.*" %>
    <html><head><title>Cluster App Test</title></head>
    <body>
    Server Info:
    <%
    out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
    <%
    out.println("<br> ID " + session.getId()+"<br>");
    String dataName = request.getParameter("dataName");
    if (dataName != null && dataName.length() > 0) {
    String dataValue = request.getParameter("dataValue");
    session.setAttribute(dataName, dataValue);
    }
    out.print("<b>Session list</b>");
    Enumeration e = session.getAttributeNames();
    while (e.hasMoreElements()) {
    String name = (String)e.nextElement();
    String value = session.getAttribute(name).toString();
    out.println( name + " = " + value+"<br>");
    System.out.println( name + " = " + value);
    }
    %>
    <form action="test.jsp" method="POST">
    name:<input type=text size=20 name="dataName">
    <br>
    key:<input type=text size=20 name="dataValue">
    <br>
    <input type=submit>
    </form>
    </body>
    </html>

测试:ip:8080/test.jsp
http://172.25.78.2:8080/test.jsp

这个时候为了负载均衡在nginx里面配置:
vim /usr/local/lnmp/nginx/conf/nginx.conf

    upstream tomcat {
    server 172.25.78.1:8080;
    server 172.25.78.2:8080;
    }

    location ~ \.jsp$ {
        proxy_pass   http://tomcat;
    }

这个时候tomcat页面的id会一直变化,为了静态不变,需要更改配置
vim /usr/local/lnmp/nginx/conf/nginx.conf

    upstream tomcat {
    sticky;
    server 172.25.34.2:8080;
    server 172.25.34.3:8080;
    #keepalive 512 single;
    }

此时发现加入sticky不支持,需要降低nginx的版本,加入模块:
nginx-1.10.1.tar.gz
nginx-sticky-module-ng.tar.gz

重新安装nginx(记得隐藏版本号和debug编译大小)
记得加入模块
./configure –prefix=/usr/local/lnmp/nginx –with-http_ssl_module –with-http_stub_status_module –with-file-aio –with-threads –user=nginx –group=nginx –add-module=/mnt/nginx/nginx-sticky-module-ng(这个指定的是sticky的解压目录)
make && make install

配置文件可见此目录下!!!!!!!!!!!!

此时测试:ip:/test.jsp
http://172.25.78.1/test.jsp

发现ID不变

#####################################
#Server Info: 172.25.78.2 : 8080    #
#                   #
#ID D3CF011351374228D39EE5E5BDB3C79E#
#Session list               #
#name:                              #
#key:                   #
#####################################

但此时当tomcat宕机的时候会自动切换到另一台tomcat主机上,这个时候前面存储的会丢失。为了不丢失引入了session共享机制:

五、session共享机制

(1)
get {
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc6-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar }
因为使用的tomcat是7的所以把6的删掉
之后把这些文件放到/usr/local/tomcat/lib
(2)打开两台主机上的memcache:
/etc/init.d/memecached start

(3)指定tomcat交换存储机制
告诉他们n1,n2分别指谁,错误存储的时候找自己的主机上的memcache

##t1故障之后直接转到t2接管,这个时候依然在mem2上面存储。只有t2直接接到的nignx的session请求才存到mem1上。当t1修复好,seesion不会飘移。

(4)打开tomcat服务
/usr/local/tomcat/bin/startup.sh
关闭tomcat服务
/usr/local/tomcat/bin/shutdown.sh

cd /usr/local/tomcat
tail -f logs/catalina.out 试验服务打开是否成功

(INFO: MemcachedSessionService finished initialization, sticky true, operation timeout 1000, with node ids [n1] and failover node ids [n2])证明成功

猜你喜欢

转载自blog.csdn.net/deep_aely/article/details/80222574