GG资源网

Zabbix监控多实例Tomcat(Zabbix配置监控项及聚合图形的实例代码)

Zabbix监控多实例Tomcat

监控原理图

1. 监控步骤和设置

1.1监控端设置

如果add-service编写正确,并且所有需要监控的Tomcat位置固定,直接运行脚本,完成监控端的设置.重启zabbix-agent和Tomcat即可.监控还需要用到jar包,将此包上传到/lib下即可.
cmdline-jmxclient-0.10.3

如果不用脚本运行,可以如下设置:
在zabbix_agent.conf最后加入以下内容
UserParameter=java.jmx.discovery[*],/usr/local/zabbix/etc/discover_jvm.sh #这个是你discove_jvm.sh脚本放置的位置
UserParameter=java.Runtime.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Runtime $2 2>&1 |grep $2 |awk \'{print $NF}\' #jar包放置的位置.这里统一放置到 /lib下
UserParameter=java.Memory.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory $2 2>&1 |grep $2 |awk \'{print $NF}\'
UserParameter=java.System.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=OperatingSystem $2 2>&1 |grep $2 |awk \'{print $NF}\'
UserParameter=java.HeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep $2 |awk \'{print $NF}\'
UserParameter=java.NonHeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep $2 |awk \'{print $NF}\'
UserParameter=java.LoadClass.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=ClassLoading $2 2>&1 |awk \'{print $NF}\'
UserParameter=java.Threading.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Threading $2 2>&1 |awk \'{print $NF}\'#这里的IP是你要监控的主机的IP.

当然不想写到zabbix_agent.conf文件中,可以新建tomcat.conf放置到/etc/zabbix/zabbix_agentd.conf.d中#如果是默认安装的zabbix-agent(yum安装),如果是在源码安装,找到你的安装位置.

在catalina.sh中增加:# ----- Execute The Requested Command -----------------------------------------在才此处添加如下内容
export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote\"
export CATALINA_OPTS=\"$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.0.195\"#客户端IP
export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=12346\"
export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false\"
export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false\"

设置的JMX端口.这里需要特别注意,如果是多个实例监控,不用脚本配置,手动配置时候,要和discover_jmx.sh获取到的端口匹配上,就是每个Tomcat都有自己端口.可以在本地运行discover_jmx.sh和这里匹配下.

以上配置以后重启zabbix-agent和Tomcat.

1.2 web端设置

服务器主要就是导入监控模版这里我在网络上模版基础上增加监控信息,主要是GC和堆内存详细信息。tomcat模版

导入模版

添加的监控模版

在创建监控主机后,添加上面的监控模版.

连接监控模版

看到发现项正常

看到这里启用,就是正常的了.
如果出现报错,比如说不是json格式等,那么是你的discover_jmx脚本获取的值有问题.或者你在zabbix_agent.conf第一个UserParameter=java.jmx.discovery[*],/usr/local/zabbix/etc/discover_jvm.sh配置项错误,并且disconver_jvm.sh所属是否为zabbix等。可以zabbix-server使用如下命令测试,如何使获取到值并且没有例如权限报错说明获取正确:
/usr/local/zabbix-3.0.3/bin/zabbix_get -s 192.168.199.35 -p10041 –k java.jmx.discovery #IP和端口是监控端的信息

2. dicover-jmx脚本编写 (需要根据具体环节修改脚本)

#!/bin/basht_datadir=find 安装tomcat位置 -name catalina.sh|awk -F \"/bin/catalina.sh\" \'{print $1}\'
tomcat_no=find 安装tomcat位置 -name catalina.sh|awk -F \"/bin/catalina.sh\" \'{print $1}\'|wc -l
# 这里一点要注意和add-service脚本填的一样,配置端口的顺序才能一样。
n_port=12345 #配置监控初始端口,也是和addservice匹配上,否则会找不到。
i=1
printf \'{\"data\":[\\n\'
for tomcat in $t_datadir #输出JSON文件 do
t_service=echo \"$tomcat\"|awk -F\"/\" \'{print $(NF-0)}\' #这里的NF-0不能提提取tomcat服务名,则需要修改为:NF-1。
if [ \"$i\" != ${tomcat_no} ];then
printf \"\\t\\t{ \\n\"
printf \"\\t\\t\\t\\\"{#JMX_PORT}\\\":\\\"${n_port}\\\",\\n\"
printf \"\\t\\t\\t\\\"{#JAVA_NAME}\\\":\\\"${t_service}\\\"},\\n\"
else
printf \"\\t\\t{ \\n\"
printf \"\\t\\t\\t\\\"{#JMX_PORT}\\\":\\\"${n_port}\\\",\\n\"
printf \"\\t\\t\\t\\\"{#JAVA_NAME}\\\":\\\"${t_service}\\\"}]}\\n\"
fi
let \"n_port=n_port+1\"
let \"i=i+1\" done

3.add-service脚本编写 (此脚本需要根据你的环境修改后才能使用)

#!/bin/basht_datadir=find 安装tomcat位置 -name catalina.sh|awk -F \"/bin/catalina.sh\" \'{print $1}\'
tomcat_no=find 安装tomcat位置 -name catalina.sh|awk -F \"/bin/catalina.sh\" \'{print $1}\'|wc -l
n_port=12345 #配置监控初始端口
local_ip=ifconfig eth0 |awk -F \'[ :]+\' \'NR==2 {print $4}\' #提取主机IP
for tomcat in $t_datadirdo
m_no=cat -n $tomcat/bin/catalina.sh|grep \'Execute The Requested Command\'|awk \'{print $1}\' #提取代码插入位置
cp $tomcat/bin/catalina.sh $tomcat/bin/catalina.sh_bak #备份catalina.sh
# cp /tmp/catalina-jmx-remote.jar $tomcat/lib/catalina-jmx-remote.jar #复制文件到实例lib目录
sed -i \'\'$m_no\'a export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote\"\' $tomcat/bin/catalina.sh #插入监控配置
let \"m_no=m_no+1\" #设置行号
sed -i \'\'$m_no\'a export CATALINA_OPTS=\"$CATALINA_OPTS -Djava.rmi.server.hostname=\'$local_ip\'\"\' $tomcat/bin/catalina.sh
let \"m_no=m_no+1\"
sed -i \'\'$m_no\'a export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=\'$n_port\'\"\' $tomcat/bin/catalina.sh
let \"m_no=m_no+1\"
sed -i \'\'$m_no\'a export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false\"\' $tomcat/bin/catalina.sh
let \"m_no=m_no+1\"
sed -i \'\'$m_no\'a export CATALINA_OPTS=\"$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false\"\' $tomcat/bin/catalina.sh
let \"n_port=n_port+1\"
done
local_ip=ifconfig eth0 |awk -F \'[ :]+\' \'NR==2 {print $4}\' #提取主机IP
cat >> /etc/zabbix/zabbix_agentd.conf <<END #修改zabbix_agentd.conf,添加KEY 增加了GC和堆内存监控 已经连接数等
UserParameter=java.jmx.discovery,/home/zabbix/bin/jmx_discovery.sh
UserParameter=java.Runtime.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=Runtime \\$2 2>&1 |grep \\$2 |awk \'{print \\$NF}\'
UserParameter=java.Memory.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=Memory \\$2 2>&1 |grep \\$2 |awk \'{print \\$NF}\'
UserParameter=java.System.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=OperatingSystem \\$2 2>&1 |grep \\$2 |awk \'{print \\$NF}\'
UserParameter=java.HeapMemoryUsage.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep \\$2 |awk \'{print \\$NF}\'
UserParameter=java.NonHeapMemoryUsage.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep \\$2 |awk \'{print \\$NF}\'
UserParameter=java.LoadClass.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=ClassLoading \\$2 2>&1 |awk \'{print \\$NF}\'
UserParameter=java.Threading.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:type=Threading \\$2 2>&1 |awk \'{print \\$NF}\'
UserParameter=java.CMS.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=ConcurrentMarkSweep,type=GarbageCollector \\$2 2>&1 |grep \\$2|awk \'{print \\$NF}\'
UserParameter=java.Copy.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=Copy,type=GarbageCollector \\$2 2>&1 |grep \\$2|awk \'{print \\$NF}\' #这个有可能是copy也有可能是ParNew
UserParameter=java.Survivor.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=\"Survivor Space\",type=MemoryPool Usage 2>&1 |grep \\$2|awk \'{print \\$NF}\'
UserParameter=java.PermGen.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=\"CMS Perm Gen\",type=MemoryPool Usage 2>&1 |grep \\$2|awk \'{print \\$NF}\'
UserParameter=java.OldGen.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=\"CMS Old Gen\",type=MemoryPool Usage 2>&1 |grep \\$2|awk \'{print \\$NF}\'
UserParameter=java.EdenSpace.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 java.lang:name=\"Eden Space\",type=MemoryPool Usage 2>&1 |grep \\$2|awk \'{print \\$NF}\'
UserParameter=java.tomcatThreadPool.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\\$1 Catalina:type=Executor,name=tomcatThreadPool \\$2 2>&1 |grep \\$2|awk \'{print \\$NF}\'END

4.Tomcat监控模版

监控模版的修改不建议在xml环境下修改,建议导入到zabbix中再修改监控项,这样修改后导出即可使用.现在监控主要涉及到以下几项.
GC+线程+线程(jvm线程和service)+堆内存+类+系统文件负载+非堆对象

监控模版

Zabbix配置监控项及聚合图形的实例代码

主要介绍了Zabbix配置监控项及聚合图形,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1.安装Zabbix Agent监控本机

安装agent软件

与server端不同,Agent只需安装zabbix-agent包

cat /etc/yum.repos.d/zabbix.repo

[zabbix]

name=Zabbix Official Repository - $basearch

baseurl=https://mirrors.aliyun.com/zabbix/zabbix/3.4/rhel/7/$basearch/

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

[zabbix-non-supported]

name=Zabbix Official Repository non-supported - $basearch

baseurl=https://mirrors.aliyun.com/zabbix/non-supported/rhel/7/$basearch/

enabled=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX

gpgcheck=1

curl https://mirrors.aliyun.com/zabbix/RPM-GPG-KEY-ZABBIX-A14FE591 -o /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591

curl https://mirrors.aliyun.com/zabbix/RPM-GPG-KEY-ZABBIX -o /etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX

yum -y install zabbix-agent zabbix-get

2.配置Agent并启动

vim /etc/zabbix/zabbix_agentd.conf

Server=39.108.140.0 # 被动模式 zabbix-server-ip

ServerActive=39.108.140.0 # 主动模式 zabbix-server-ip

Hostname=You-Men # Agent端主机名,最终显示在监控页面上的名字

UnsafeUserParameters=1 # 是否限制用户自定义keys使用特殊字符

systemctl restart zabbix-agent

netstat -antp|grep agent

tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 3898/zabbix_agentd

tcp6 0 0 :::10050 :::* LISTEN 3898/zabbix_agentd

3.配置snmp(可以不做)

zabbix除了可以使用agent获取数据之外,还可以通过snmp获取数据,为了能够让zabbix监控更多的信息,将本机的snmp功能启动起来.

yum -y install net-snmp net-snmp-utils

vim /etc/snmp/snmpd.conf

com2sec notConfigUser 39.108.140.0 public

access notConfigGroup \"\" any noauth exact all none none

view all included .1 80

systemctl restart snmpd && systemctl enabel snmpd

ss -anup |grep snmp # 161端口,udp协议

# 测试snmp协议工作是否正常

# snmpwalk -v 1 -c public 39.108.140.0 .1.3.6

# 使用v1版本,共同体为public,来对192.168.0.1的.1.3.6分支进行walk。

snmpwalk -v 2c -c public 39.108.140.0

# 使用v2c版本,共同体为public,对39.108.140.0进行walk。

# -v 显示当前SNMPWALK命令行版本.

# -

# 获取cisco设备39.108.140.0的接口类型

接下来我们到web界面上配置如何监控本地主机,我们看到接口上是127.0.0.1,但是我们配置文件写的是39.108.140.0,我们让这两个IP一致.点击3进去然后修改.

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第1张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第2张

更新完后,跳到下面页面,稍等一会,重新载入一下页面就是可用性为绿色了

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第3张

至此,监控本地主机就完成了,如果想看下监控本地主机的网卡流量就做下面图2步骤.鼠标依次根据数字挨个点,如果想要监控项是中文的话,可以做Zabbix故障例一,但是4.4版本较以前版本有所改善,监控项不是乱码,而是英文.

如果想要将这种乱码换成正常中文

如果是windows在C盘搜索simkai.tff中文楷体,拷贝/上传到服务器,然后cp到zabbix的字体目录

3.*版本:

cp /root/simkai.ttf /usr/share/zabbix/fonts/

# 不同的安装方式,路径会有所不同,所以可以直接find / -type d -type fonts找到类似的文件夹,那就是了

# 注意字体权限问题

vim /usr/share/zabbix/include/defines.inc.php

define(\'ZBX_GRAPH_FONT_NAME\', \'simkai\');

define(\'ZBX_FONT_NAME\', \'simkai\');

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第4张

4.Zabbix监控远程主机

如果远程主机安装不上zabbix-agent,可以通过装的上的zabbix-agent的机器把包传过去

yum -y instlal yum-utils

# 下载到指定目录

yum install zabbix-agent -y --downloadonly --downloaddir=/root

1.安装zabbix agent

# 方法一(国外源zabbix好像下载不下来包了,用上面的源):

# rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm

yum clean all

yum -y install zabbix-agent

# 方法二:(使用别的机器传过来的zabbix-agent包直接rpm安装即可)

rpm -ivh zabbix-agent-4.4.1-1.el7.x86_64.rpm

# 修改zabbix-agent配置并启动服务

vim /etc/zabbix/zabbix_agentd.conf

Server=192.168.244.144

Server=192.168.244.144 //监控主机IP地址

Hostname=agent1.zabbix.com //被监控主机到监控主机的名字

UnsafeUserParameters=1

systemctl start zabbix-agent

ss -antp |grep 10050

# 接下来我们到web端进行操作

# 为了服务方便管理和易于查看。

# 监控系统中往往根据被监控的主机角色或其他属性将同类主机划分到同一个主机组中.

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第5张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第6张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第7张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第8张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第9张

如果等上一段时间,可用性哪里没有红色警告,就说明这台主机被添加进来了,但是因为没有挂载模板和创建监控项,所以我们接下来尝试着挂载一下模板,然后再去创建监控项.

我们到agent端装一个nginx,然后去zabbix的web端找到此模板并挂载.

yum -y install nginx

systemctl start nginx

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第10张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第11张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第12张

5.测试监控主机

接下来我们用浏览器或者elinks访问一下nginx,产生一些数据,然后去zabbix上查看变化

elinks --dump 116.196.83.113

我们以后自定义Key监控项时,先看看最新数据有没有数据过来,如果数据都不会过来,就别提图形触发器报警什么了.

至此,添加本地主机,远程主机,创建主机组,挂载模板就已经完了

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第13张

Zabbix配置监控项及聚合图形的实例代码 (https://www.wpmee.com/) WordPress教程 第14张

6.Zabbix监控项

监控项(Items)简介

监控项是Zabbix中获得数据的基础,没有监控项,就没有数据——因为一个主机只有监控项定义了单一的指标或者需要获得的数据,监控项适用于采集数据的,多个同类的监控项可以定义成一个应用集,如,mysql增删改查以及每秒钟的读表,写表速度可以写成一个Mysql应用集.

对于监控项的示例,需要输入以下必要的信息

名称

输入CPU Load作为值,在列表中和其他地方,都会显示这个值作为监控项名称.

手动输入system.cpu.load作为值,这是监控项的一个技术上的名称,用于识别获取信息的类型,这个特定值需要是Zabbix Agent预定义值的一种.
https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/zabbix_agent # 此网址就是zabbix官网的预定义值.

信息类型

在此处选择Numeric(float),这个属性定义了获得数据的格式
你也需要减少监控项历史保留的天数,7或者14天,对于数据库而言,最佳实践是避免数据库保留过多的历史数据.
我们选择了数据类型后,暂时保持其他选项的默认值.
1> 磁盘容量Units一般为B
2> 网卡流量单位为bps
3> Mysql每秒访问量qps,例如MySQL每秒select,insert Mysql serlect

点击添加,新的监控项就出现在监控项列表中了

7.查看数据

当一个监控项定义完成后,你可能好奇他具体获取了什么值,前往监控首页,点击最新数据,选择相应的主机.看数据能不能过来以及是不是自己想要的类型.

图表

当监控项运行了一段时间后,可以查看可视化图表,如果没有可以自己创建一个,下面会有详细介绍

8.常用监控项

1.服务器网络接口进出流量和总流量

net.if.in[if,<mode>]

net.if.out[if,<mode>]

net.if.total[if,<mode>]

2.服务器启动分区剩余空间

vfs.fs.size[fs,<mode>]

vfs.fs.size[/boot,free]

3.监控虚拟机内存

vm.memory.size[<mode>]

vm.memory.size[total

vm.memory.size[free]

vm.memory.size[wired]

4.服务器服务状态

net.tcp.listen[port]

net.tcp.port[<ip>,port]

net.tcp.service[service,<ip>,<port>]

net.tcp.service.perf[service,<ip>,<port>]

5.服务器进程数量

proc.num[<name>,<user>,<state>,<cmdine>]

zabbix_get -s 39.108.140.0 -k proc.num

121

zabbix_get -s 39.108.140.0 -k proc.num[,,run]

3

zabbix_get -s 39.108.140.0 -k proc.num[,,sleep]

118

6.服务器CPU状态(浮点型,无单位)

system.cpu.intr

system.cpu.load[<cpu>,<mode>]

system.cpu.num

system.cpu.switches

system.cpu.util[<cpu>,<type>,<mode>]

zabbix_get -s 39.108.140.0 -k system.cpu.load[all,avg1]

0.000000

zabbix_get -s 39.108.140.0 -k system.cpu.load[,avg5]

0.010000

7.磁盘IO情况

vfs.dev.read[device,<type>,<mode>]

vfs.dev.write[device,<type>,<mode>]

zabbix_get -s 39.108.140.0 -k vfs.dev.read[/dev/vda1]

8.监控文件修改

vfs.file.chsum下载地址

由于网站搬家,部分链接失效,如无法下载,请联系站长!谢谢支持!
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » Zabbix监控多实例Tomcat(Zabbix配置监控项及聚合图形的实例代码)

发表回复

CAPTCHAis initialing...
© 2021-GG资源网 - www.ggplus.cn. All rights reserved