学习Tomcat(二)

一、 Java简介

JDK: 面向开发人员使用的SDK,提供Java的开发环境和运行环境
SDK: 软件开发包,包括函数库、编译程序等 
JRE: Java的运行环境,面向Java的使用者,不是开发者

二、 Tomcat安装

1、软件准备
JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 
Tomcat下载:http://tomcat.apache.org/

2、部署java环境
# mkdir /application/tools/ -p
# cd /application/tools/
# tar xf jdk-8u60-linux-x64.tar.gz -C /application/
# ln -s /application/jdk1.8.0_60 /application/jdk
# sed -i.ori '$a export JAVA_HOME=/application/jdk\n
                 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\n
                 export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' 
            /etc/profile
# source /etc/profile
# java -version

3、安装Tomcat
# tar xf apache-tomcat-8.0.27.tar.gz -C /application/
# ln -s /application/apache-tomcat-8.0.27 /application/tomcat
# echo 'export TOMCAT_HOME=/application/tomcat' >> /etc/profile
# source /etc/profile
# useradd -u 601 tomcat
# chown -R tomcat.tomcat /application/jdk/ /application/tomcat/
# tail -4  /etc/profile
  export JAVA_HOME=/application/jdk
  export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
  export TOMCAT_HOME=/application/tomcat
  
4、Tomcat目录介绍
# tree -L 1 /application/tomcat/
├── bin                                                 #管理Tomcat脚本文件(.bat和.sh)
├── conf                                                #配置文件(XML和DTD)
├── lib                                                 #web应用访问的JAR包
├── LICENSE
├── logs                                                #Catalina和应用的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp                                                #临时文件
├── webapps                                             #Web应用程序根目录
└── work                                                #JSP编译出的Servlet的.java和.class文件
# ll webapps/
drwxr-xr-x 14 root root 4096  docs                      #tomcat帮助文档
drwxr-xr-x  6 root root 4096  examples                  #web应用实例
drwxr-xr-x  5 root root 4096  host-manager              #管理
drwxr-xr-x  5 root root 4096  manager                   #管理
drwxr-xr-x  3 root root 4096  ROOT                      #默认网站根目录
  
5、启动Tomcat  
# /application/tomcat/bin/startup.sh                    #启动程序
# /application/tomcat/bin/shutdown.sh                   #关闭程序
# netstat -tunlp | grep java
# ps -ef | grep java

6、访问网站
网址: http://192.168.1.11:8080/

7、Tomcat日志
# tailf /application/tomcat/logs/catalina.out

8、tomcat 启动和停止的方法
1) 启动Tomcat
方法1
# /opt/tomcat/bin/startup.sh
方法2
# /opt/tomcat/bin/catalina start

2) 停止Tomcat
方法1
# /opt/tomcat/bin/shutdown.sh
方法2
# /opt/tomcat/bin/catalina stop

3) 重启Tomcat
方法1
# /opt/tomcat/bin/shutdown.sh
# /opt/tomcat/bin/startup.sh
方法2
# /opt/tomcat/bin/catalina restart
方法3
# /opt/tomcat/bin/catalina stop
# /opt/tomcat/bin/catalina start

三、Tomcat配置文件

1、配置文件介绍

server.xml                                              #主配置文件
tomcat-users.xml                                        #管理用户配置文件

2、Tomcat管理(生产环境不要用)

# vim /application/tomcat/conf/tomcat-users.xml
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
# /application/tomcat/bin/shutdown.sh
# /application/tomcat/bin/startup.sh

3、主配置文件详解

1、配置文件结构
<server>                                                #顶级组件,位于整个配置的顶层
     <service>                                          #容器类组件,可包含其它组件
        <connector />                                   #连接器组件,用户请求连接tomcat
     <engine>                                           #容器类组件,可包含其它组件
     <host>                                             #容器类组件,可包含其它组件
     <context></context>                                #容器类组件,可包含其它组件
     </host>
     <host>
     <context></context>
     <Valve />                                          #被嵌套类组件,位于一个容器中,不能包含其他组件
     </host>
     </engine>
     </service>
</server>

2、配置文件注释
<?xml version='1.0' encoding='utf-8'?>
<!-- 
    <Server>                                            #实例的顶层元素,代表整个容器
    port:                                               #关闭tomcat端口
    shutdown:                                           #关闭tomcat字符串
-->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
<!--
    service服务组件
-->
  <Service name="Catalina">
<!--
    connector                                           #接收用户请求
        port:                                           #服务监听端口号
        address:                                        #服务监听地址,默认0.0.0.0
        protocol:                                       #连接器使用的协议,支持HTTP和AJP(ajp:httpd反向代理tomcat时用)
        minProcessors                                   #最小处理请求的线程数
        maxProcessors                                   #最大处理请求的线程数
        enableLookups                                   #是否开启DNS查询,true:返回主机名,false:返回ip
        redirectPort                                    #https端口号
        acceptCount                                     #队列的请求数
        connectionTimeout                               #连接超时时间,单位:毫秒
-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--
    engine                                              #核心容器组件,catalina引擎,接收并处理用户请求
        defaultHost                                     #默认处理请求的主机名
-->
    <Engine name="Catalina" defaultHost="localhost">
<!--
    Realm                                               #存放用户名,密码及role的数据库
-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
<!--
    host                                                #一个虚拟主机
        name:                                           #主机名
        appBase:                                        #应用程序的目录,app的目录,可相对路径,也可绝对路径
        unpackWARs:                                     #是否自动解压war包,true:不解压,false:解压
        autoDeploy:                                     #是否自动部署war包
        xmlValidation:                                  #是否启动xml的校验功能,一般不效验
        xmlNamespaceAware:                              #是否检测名称空间,一般不检测
-->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<!--
    Context                                             #一个web应用程序,通常为WAR文件
        docBase                                         #webapp的war包目录,相对路径或绝对路径
        path                                            #webapp的url的前缀,url:http://localhost:8080/path/webapp
        reloadable                                      #自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes
-->
        <Context path="" docBase="" debug=""/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

4、组件详解

server port 关闭tomcat端口
shutdown 关闭tomcat字符串
service name 服务的名称,默认:Catalina
Connector port 服务监听端口号
address 服务监听地址,默认0.0.0.0
protocol 连接器协议类型,支持HTTP(BIO,NIO,NIO2,APR)和AJP(httpd反向代理tomcat时用)
minProcessors 最小处理请求的线程数
maxProcessors 最大处理请求的线程数
enableLookups 是否开启DNS查询,true:返回主机名,false:返回ip
redirectPort https端口号
acceptCount 队列的请求数
connectionTimeout 连接超时时间,单位:毫秒
maxThreads 最大并发连接数
allowTrace 是否跟踪请求转发过程,一般不跟踪
asyncTimeout 一部分访问超时时间,默认是30000(30秒)
maxHeaderCount

最大的headers信息数量,默认100,0为不限制

maxParameterCount 最大的参数数量,默认1000,0为不限制
maxPostSize 最大POST请求提交数据包,默认为2M
maxSavePostSize SSL验证最大缓存大小,默认是4k
scheme 协议名字,默认http
secure 是否用安全模式通信,默认false
useIPVHosts 是否用IP指向虚拟主机,默认false
xpoweredBy 是否添加X-Powered-By头信息
executor 指定使用线程池,默认使用内置的线程池
acceptorThreadCount cpu数量
compressableMimeType 压缩类型
compression 是否开启压缩
compressionMinSize 压缩文件最小值
connectionUploadTimeout 上传文件的超时时间
disableUploadTimeout 是否禁用上传超时时间
keepAliveTimeout Keep-Alive连接超时时间,默认和connectionTimeout一致
maxConnections 最大连接数,NIO:10000,APR:8192(windows:1024)
maxKeepAliveRequests 最大保持活跃的连接数,默认100
minSpareThreads 最小空闲线程数
maxSpareThreads 最大空闲线程数
maxHttpHeaderSize 请求和响应的HTTP头的最大大小,单位:字节
tcpNoDelay 可以提高性能,默认是true
noCompressionUserAgents 对于以下的浏览器,不启用压缩
URIEncoding URL编码字符集
allowTrace 是否允许HTTP的TRACE方法,默认:false
emptySessionPath 用户的所有路径是否设置为/(跟目录),默认为false
useBodyEncodingForURI 是否用contentType中指定的编码来取代URIEncoding,默认:false
bufferSize 连接器缓冲区的大小,单位:字节,默认缓存区大小:2048字节
socketBuffer Socket输出缓冲区的大小,单位:字节,默认:9000字节,-1:禁止缓冲
threadPriority JVM中请求处理线程优先级,默认:NORMAL-PRIORITY
useURIValidationHack 是否检查不必要的URL,false:不检查,提升性能
Engine defaultHost 默认接收的主机名称
name Engine组件的名称,提供日志记录,名称不能和其他Engine冲突
host     name 主机名
appBase 应用程序的目录,app的目录,可相对路径,也可绝对路径
unpackWARs 是否自动解压war包,true:不解压,false:解压
autoDeploy 是否自动部署war包
xmlValidation 是否启动xml的校验功能,一般不效验
xmlNamespaceAware 是否检测名称空间,一般不检测
Values     directory 日志保存的目录
prefix 指定log文件的前缀
suffix 指定log文件的后缀
pattern 日志内容格式
fileDateFormat 自定义时间戳,作为日志suffix的前缀
timestamp 文件名是否加入系统时间戳,true:开启
AccessLogValve 访问日志Valve
ExtendedAccessValve 扩展功能的访问日志Valve
JDBCAccessLogValve 通过JDBC将访问日志,发送到数据库
RequestDumperValve 请求转储Valve
RemoteAddrValve 基于远程地址的访问控制
RemoteHostValve 基于远程主机名的访问控制
SemaphoreValve 控制Tomcat主机任何容器的并发访问量
JvmRouteBinderValve 配置多个Tomcat,以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当停止某节点时,通过此Valve将请求定向至备用节点,使用此Valve,必须使用JvmRouteSessionIDBinderListener
ReplicationValve 专用于Tomcat集群架构中,某个请求的session发生更改时,触发session数据在各节点间进行复制
SingleSignOn 将两个或多个需要对用户进行认证,webapp在认证用户时,即一次认证,可访问所有连接在一起的webapp
ClusterSingleSingOn SingleSignOn的扩展,专用于Tomcat集群中,要结合ClusterSingleSignOnListener进行工作
Context docBase webapp的war包目录,相对路径或绝对路径
  path webapp的url的前缀,url: http://localhost:8080/path/webapp
  reloadable 自动加载新的应用,目录:/WEB-INF/lib和/WEB-INF/classes
Realm JAASRealm 基于Java Authintication and Authorization Service实现用户认证
JDBCRealm 通过JDBC访问某关系型数据库表实现用户认证
JNDIRealm 基于JNDI使用目录服务实现认证信息的获取
MemoryRealm 查找tomcat-user.xml文件实现用户信息的获取
UserDatabaseRealm 基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证

 5、管理tomcat脚本

# vim tomcat.sh 
  #!/bin/sh
  JAVA_HOME=/application/jdk
  CATALINA_HOME=/application/tomcat
  
  
  usage(){
      echo "$0 {start|stop|restart}"
      exit 1
  }
  [ $# -ne 1 ]&& usage
  
  start_tomcat(){
       $CATALINA_HOME/bin/startup.sh
  }
  stop_tomcat(){
  TPID=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}')
  kill -9 $TPID
  sleep 5;
  TSTAT=$(ps -aux|grep java|grep tomcat|grep -v 'grep'|awk '{print $2}')
  if [ -z $TSTAT ];then
      echo "tomcat stop"
  else
      kill -9 $TSTAT
  
  fi
  
  cd $CATALINA_HOME
  rm temp/* -rf
  rm work/* -rf
  }
  
  case $1 in
  start)
      start_tomcat
      ;;
  stop)
      stop_tomcat
      ;;
  restart)
      stop_tomcat
        sleep 5
      start_tomcat
         ;;
  *)
        usage
        ;;
  esac

四、Tomcat性能优化

 1、内存优化

-server                                                 #以server模式运行(默认client模式)
-Xms                                                    #初始堆内存大小
-Xmx                                                    #最大堆内存大小
–Xmn                                                    #年轻代大小(整个堆大小=年轻代大小+年老代大小+持久代大小)
-XX:NewSize                                             #设置年轻代大小(for 1.3/1.4版本)
-XX:MaxNewSize                                          #年轻代最大值(for 1.3/1.4)
-XX:PermSize                                            #设置持久代初始值
-XX:MaxPermSize                                         #设置持久代最大值
-Xss                                                    #每个线程的堆栈大小(JDK版本5.0后,每个线程堆栈大小:1M)
-XX:NewRatio                                            #年轻代与年老代的比值
-XX:SurvivorRatio                                       #Eden区与Survivor区的大小比值
-XX:LargePageSizeInBytes                                #内存页的大小,设置过大,会影响Perm的大小
-XX:+UseFastAccessorMethods                             #原始类型的快速优化(get,set方法转成本地代码)
-XX:+DisableExplicitGC                                  #关闭System.gc()
-XX:MaxTenuringThreshold                                #垃圾最大年龄(该参数在串行GC时才有效)
-XX:+AggressiveOpts                                     #加快编译
-XX:+UseBiasedLocking                                   #锁机制的性能改善
-XX:MetaspaceSize                                       #Metaspace的初始大小
-XX:MaxMetaspaceSize                                    #Metaspace的最大值
-Xnoclassgc                                             #禁用垃圾回收
-XX:PretenureSizeThreshold                              #对象超过多大,直接在旧生代分配
-XX:TLABWasteTargetPercent                              #TLAB占eden区的百分比
-XX:+CollectGen0First                                   #FullGC时是否先YGC

并行收集器
-XX:+UseParNewGC                                        #对年轻代采用多线程并行回收(gc)
-XX:ParallelGCThreads                                   #并行收集器的线程数
-XX:+UseParallelOldGC                                   #对年老代采用多线程并行回收(gc)
-XX:MaxGCPauseMillis                                    #每次年轻代垃圾回收的最长时间(最大暂停时间)
-XX:+UseAdaptiveSizePolicy                              #自动选择年轻代区大小和相应的Survivor区比例
-XX:GCTimeRatio                                         #垃圾回收占程序运行的时间百分比
-XXUseParallelGC                                        #垃圾回收设置为并行收集器

CMS
-XX:+UseConcMarkSweepGC                                 #用CMS收集器对年老代进行GC,CMS收集器优势停顿时间少,适用停顿时间短的前台应用
-XX:+AggressiveHeap                                     #用大量的物理内存,忽略Xmx参数
-XX:CMSFullGCsBeforeCompaction                          #多少次后进行内存压缩
-XX:+CMSParallelRemarkEnabled                           #开启降低标记停顿
-XX:+UseCMSCompactAtFullCollection                      #CMS收集器完成垃圾回收后,是否对年老代的压缩整理
-XX:+UseCMSInitiatingOccupancyOnly                      #用手动定义初始化开始CMS收集(指定阈值回收,不指定jvm会自动调整)
-XX:CMSInitiatingOccupancyFraction=70                   #年老代满70%开始CMS收集
-XX:CMSInitiatingPermOccupancyFraction                  #持久代满多少百分比,开始CMS回收
-XX:+CMSIncrementalMode                                 #设置为增量模式(用于单CPU)
-XX:+CMSClassUnloadingEnabled                           #在用CMS收集进行垃圾回收时,同时清理持久代不使用的class(类)
-XX:ParallelCMSThreads                                  #设定CMS的线程数

辅助信息
-XX:+PrintGC                                            #输出JVM gc日志
-XX:+PrintGCDetails                                     #输出JVM gc详情
-XX:+PrintGCTimeStamps                                  #gc日志中输出GC的时间戳
-XX:+PrintGC:PrintGCTimeStamps                          #gc日志中输出GC的时间戳(混合模式)
-XX:+PrintGCApplicationStoppedTime                      #输出垃圾回收期间,程序暂停的时间(可与上面一起用)
-XX:+PrintGCApplicationConcurrentTime                   #输出每次垃圾回收前,程序未中断的执行时间(可与上面一起用)
-XX:+PrintHeapAtGC                                      #输出GC前后的详细堆栈信息
-XX:+PrintClassHistogram                                #输出实例的数量以及空间大小
-XX:+PrintTLAB                                          #输出TLAB空间的使用情况
-XX:+PrintTenuringDistribution                          #输出每次minor GC后,新的存活周期的阈值
-verbose:gc                                             #输出JVM gc日志
-Xloggc:${CATALINA_BASE}/logs/gc.log                    #指定gc日志目录
-XX:+PrintGCDateStamps                                  #gc日志中输出GC的时间戳(日期格式: 2013-05-04T21:53:59.234+0800)
-XX:+HeapDumpOnOutOfMemoryError                         #在发生OOM时dump堆内存便于排查问题
-XX:HeapDumpPath=${CATALINA_BASE}/logs                  #指定堆内存dump文件导出路径

-Djava.awt.headless=true                                #一般在最后,图表工具的展示

2、连接器优化

主要优化connector标签相关参数,用于处理用户的访问请求
1、通用配置 # vim server.xml
<Connector port="8080" protocol="HTTP/1.1" #编码格式 URIEncoding="UTF-8" #线程配置 maxThreads="1000" maxProcessors="1000" minProcessors="5" minSpareThreads="100" maxSpareThreads="1000 #连接数配置     maxConnections="1000" connectionTimeout="20000" acceptCount="1000"     enableLookups="false" disableUploadTimeout="true" useURIValidationHack="false" #启用压缩的配置      compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"      #其他配置      maxPostSize="10485760" maxHttpHeaderSize="8192" tcpNoDelay="true" acceptorThreadCount="8" redirectPort="8443" /> 2、https配置示例 # vim server.xml <Connector port="8443" protocol="HTTP/1.1" URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="/home/tomcat/ssl/test.jks" keystorePass="123456" />

3、线程池优化

1、配置
# vim server.xml 
  <Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
             connectionTimeout="20000" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="100"
             useBodyEncodingForURI="true" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false"
    />
  <Executor name="tomcatThreadPool"   
         namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000"  
         maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5"  
         className="org.apache.catalina.core.StandardThreadExecutor"/>  

2、参数详解
name                                    #线程池名,在 Connector中指定
namePrefix                              #创建每个线程名的前缀,线程名: namePrefix + threadNumber
maxThreads                              #线程池最大线程数
minSpareThreads                         #活跃线程数
maxIdleTime                             #线程空闲时间,默认:6000(1分钟),单位:毫秒
maxQueueSize                            #被执行前最大队列数,默认:Int的最大值,一般不用改
prestartminSpareThreads                 #启动线程池时是否启动minSpareThreads部分线程,默认:false(不启动)
className                               #线程池实现类,默认实现类:org.apache.catalina.core.StandardThreadExecutor

 4、优化IO模式

1、io模式介绍
BIO(阻塞型IO)、NIO、NIO2和APR

2、区别
BIO: BIO(Blocking I/O),阻塞式I/O,使用传统的Java I/O操作(java.io包及其子包),默认:bio模式,性能低,连接数少
NIO: NIO(New I/O),基于缓冲区,非阻塞I/O,提供java API(java.nio包及其子包),并发高,适合连接数多且短(聊天),后台耗时完成请求的操作
APR: APR(Apache Portable Runtime)JNI调用HTTP动态库处理文件,提高静态文件和SSL的处理,连接数多且长(相册),从系统层面解决IO堵塞

3、修改io模式
<Connector port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>
protocol="HTTP/1.1"                                     #BIO 
protocol="org.apache.coyote.http11.Http11NioProtocol"   #NIO  
protocol="org.apache.coyote.http11.Http11Nio2Protocol"  #NIO2 
protocol="org.apache.coyote.http11.Http11AprProtocol"   #APR  

5、监听器优化

1、Listener配置
预防JRE内存泄漏,默认无需配置
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

6、优化总结 

1、如何分配JVM的内存空间
2、应该使用什么类型的垃圾回收器
JVM产生的垃圾需要回收、回收有不同的回收器,JVM的调优需要了解各个垃圾回收机制的原理
终极目标: 降低FULL GC出现的频率(FULL GC出现会导致应用的暂停服务)

五、监控Tomcat

 1、使用jconsole来监控jvm

1、安装jconsole
在Windows平台安装jconsole图形化软件

2、配置tomcat的远程连接
# vim bin/catalina.sh 
  CATALINA_OPTS="$CATALINA_OPTS
  -Dcom.sun.management.jmxremote                        #启用远程监控JMX
  -Dcom.sun.management.jmxremote.port=12345             #jmx远程端口
  -Dcom.sun.management.jmxremote.authenticate=false     #不开启用户密码认证
  -Dcom.sun.management.jmxremote.ssl=false              #不开启ssl(https)
  -Djava.rmi.server.hostname=192.168.230.130"           #tomcat的IP地址

3、单击java目录bin下的JConsole.exe可执行文件

 

 

posted on 2019-10-12 11:20  五光十色  阅读(246)  评论(0编辑  收藏  举报

导航