重启tomcat服务命令tomcat安装和使用启动tomcat服务器命令




重启tomcat服务命令tomcat安装和使用启动tomcat服务器命令

2022-07-21 2:23:56 网络知识 官方管理员

开课

本章我们来学习一下另外的一种web服务tomcat,这是一个支持jsp页面的web服务,很多开发方向的IT人员,包括运维开发方向的同仁,都会选择使用tomcat

知识点

什么是tomcat

CentOS8中如何部署tomcat

windows系统中如何部署tomcat

tomcat的相关目录和文件的作用

tomcat的管理界面如何使用

如何使用tomcat发布静态页面

tomcat动态页面的实现

tomcat多实例的实现

让nginx和tomcat协同工作

tomcat的运行模式

tomcat运行模式的调整

额外的优化参数

压力测试工具的使用

课程目标

能够知道什么是tomcat

能够在不同的系统上部署tomcat

能够记住tomcat的常用目录和文件

能够知道如何管理tomcat

能够在tomcat上部署静态网站和动态网站

能够将nginx和tomcat整合并实现多实例

能够对tomcat进行简单的调优

能够使用压力测试工具


Tomcat

介绍

ApacheTomcat最早是由Sun开发的,在1999年被捐献给ASF(Apache软件基金会ApacheSoftwareFoundation),隶属于Jakarta(雅加达)项目,现在已经独立为一个顶级项目。因为Tomcat技术先进、性能稳定,同时也是一个免费的开放源代码的Web应用服务器,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,被很多企业普遍使用,也是开发和调试JSP程序的首选。成为目前比较流行的Web应用服务器。

官方网站:http://tomcat.apache.org/

tomcat的同类产品

  • Resin服务器

Resin是Caucho公司的产品,速度非常快。可以显示动态内容,也可以显示静态内容,但是用户数量少,参考文档也少,使用起来不太方便,一旦涉及到相关文件和内容的更新,系统会自动重新部署并重启

  • Jetty服务器

Jetty是一个纯粹的基于Java的web服务器,也是一个开源项目。架构简单,速度快,修改简单,但是对java的支持不如tomcat全面,

  • WebLogic服务器

WebLogic是BEA公司的产品,可进一步细分为WebLogicServer、WebLogicEnterprise和WebLogicPortal等系列,其中WebLogicServer的功能特别强大。WebLogic支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供Java平台所拥有的一切应用服务器的用户来说,WebLogic是一个十分理想的选择。但是不开源且收费

JBoss、WebSphere

Apachenginxtomcat比较

Apache

优点:模块多,功能全面,性能稳定,适合静态HTML

缺点:配置相对复杂,自身不支持动态页面

Nginx

优点:功能较多,负载均衡、反向代理等,速度比Apache快

缺点:轻量级web服务器,功能不如Apache全面

Tomcat

优点:能够处理动态请求,可以独立于Apache运行,支持JSP

缺点:对静态内容和大文件的支持有所欠缺

Apache是用C写的,Nigix是用C写的,Tomcat是用Java写的。Tomcat是Apache的拓展,更实质的说是Java应用服务器,用于处理JSP后台语言开发的应用,主要用于处理JSP动态网页。Tomcat服务器是一个免费的开放源代码的Web应用服务器(主要用于解析servlet/JSP,同时具备http服务),单纯的Tomcat性能有限,在很多地方表现有欠缺,如活动连接支持、静态内容、大文件和HTTPS等,因此多数都是Apache+Tomcat+JavaSDK的集成。严格的来说,Apache/Nginx应该叫做「HTTPServer」;而Tomcat则是一个「ApplicationServer」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python等其他语言开发的应用也无法直接运行在Tomcat上)。

安装部署

Linux部署tomcat

下载软件包

tomcat:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31.zip

jdk:https://www.oracle.com/java/technologies/javase-downloads.html

如何想使用tomcat9的话,官方要求JRE的版本必须是8以上的,所以在安装之前,我们需要确认一下本机的版本,如果满足需求的话可以直接安装tomcat

[root@manage01~]#java-versionbash:java:未找到命令...文件搜索失败:Cannotupdateread-onlyrepo#系统提示没有找到命令,意味着没有安装相关软件包,所以我们要安装[root@manage01~]#rpm-ivhjdk-13.0.2_linux-x64_bin.rpm警告:jdk-13.0.2_linux-x64_bin.rpm:头V3RSA/SHA256Signature,密钥IDec551f03:NOKEYVerifying...#################################[100%]准备中...#################################[100%]正在升级/安装...1:jdk-13.0.2-2000:13.0.2-ga#################################[100%]安装完成后再次查看[root@manage01~]#java-versionjavaversion"13.0.2"2020-01-14Java(TM)SERuntimeEnvironment(build13.0.2+8)#java的运行环境,也叫jreJavaHotSpot(TM)64-BitServerVM(build13.0.2+8,mixedmode,sharing)#JVMjava的虚拟机,可以使Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的字节码就可以了,这样就可以在多种平台上不加修改地运行。很多语言都采用了这种类似的思路,才使得他们具有可移植性,比如说python安装tomcat我们可以看到tomcat软件包的名称包含有apache字样,原因很简单,它是由apache资助的项目[root@manage01~]#unzipapache-tomcat-9.0.31.zip-d/opt/[root@manage01~]#cd/opt/[root@manage01opt]#mvapache-tomcat-9.0.31tomcat1解压完成,改个名就可以使用了,因为tomcat是一个二进制包,什么意思呢?就类似于我们下载游戏的时候的硬盘版,什么是硬盘版?解压就能玩,所以这个tomcat我们就压之后就可以使用了,不需要安装。[root@manage01bin]#pwd/opt/tomcat1/bin[root@manage01bin]#shstartup.shCannotfind./catalina.shThefileisabsentordoesnothaveexecutepermissionThisfileisneededtorunthisprogram启动tomcat[root@manage01bin]#chmod+xcatalina.sh[root@manage01bin]#shstartup.shUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarTomcatstarted.[root@manage01webapps]#netstat-antp|grepjavatcp600127.0.0.1:8005:::*LISTEN46987/javatcp600:::8080:::*LISTEN46987/javatomcat的两个端口8005是关闭tomcat使用的端口,可以使用telnetserverip8005然后输入大写的SHUTDOWN关闭tomcat,所以建议更改端口或者把引号中了命令改成不容易记忆的,个人推荐改命令,因为改端口没有告诉负责网络安全的同事就会给你屏蔽掉………8080连接端口8009AJP协议使用的端口,tomcat的优势是处理jsp页面但是对于图片,静态页面处理能力特别差,相对于apache来说,那么这个时候怎么办做个分流jsp页面由tomcat完成,静态的页面图片由AJP来完成,AJP是定向包协议使用二进制格式来传输可读性文本,在server.xml配置文件中默认不生效

重启tomcat服务命令(tomcat安装和使用)(1)

注意tomcat的访问端口是8080

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME

Windows部署tomcat

tomcat:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31-windows-x64.zip

jdk:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

安装jdk11

重启tomcat服务命令(tomcat安装和使用)(2)

重启tomcat服务命令(tomcat安装和使用)(3)

重启tomcat服务命令(tomcat安装和使用)(4)

重启tomcat服务命令(tomcat安装和使用)(5)

重启tomcat服务命令(tomcat安装和使用)(6)

重启tomcat服务命令(tomcat安装和使用)(7)

重启tomcat服务命令(tomcat安装和使用)(8)

重启tomcat服务命令(tomcat安装和使用)(9)

重启tomcat服务命令(tomcat安装和使用)(10)

重启tomcat服务命令(tomcat安装和使用)(11)

重启tomcat服务命令(tomcat安装和使用)(12)

重启tomcat服务命令(tomcat安装和使用)(13)

重启tomcat服务命令(tomcat安装和使用)(14)

如果使用java-version看到的还是以前的提示,重启一下系统

重启tomcat服务命令(tomcat安装和使用)(15)

安装tomcat

解压tomcat的压缩包并进入到bin目录下

重启tomcat服务命令(tomcat安装和使用)(16)

重启tomcat服务命令(tomcat安装和使用)(17)

serverstatus查看服务器的状态,包括linux主机的信息,tomcat的版本信息,资源使用情况等

managerapp管理网站

hostmanager虚拟主机的管理

发布静态页面

目录说明

tomcat主目录

bin:命令,存放不同平台上启动或关闭的脚本
BUILDING.txt&RUNNING.txt:使用文档,告诉用户如何搭建
conf:各种全局配置文件,最主要的是server.xml和web.xml
CONTRIBUTING.md:捐赠
lib:tomcat需要用到的库,主要是各种jar包
LICENSE:许可
logs:存放tomcat的日志
NOTICE:通知信息
README.md:读我文档
RELEASE-NOTES:版本信息
temp:临时文件
webapps:tomcat的web发布目录,类似于nginx或者apache的html目录
work:tomcat的工作目录,存放的是jsp编译后产生的.class文件及.java文件。清空work目录,然后重启tomcat,可以达到清除缓存的作用。

bin目录

bin目录下的文件主要有两类,一个是Linux使用的.sh结尾的文件,另外一个是windows使用的.bat结尾的文件,

catalinatomcat的设置脚本,也可以启动&关闭tomcat

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本

conf目录

这个目录下主要存放的是与tomcat设置相关的文件,常用的配置文件主要包含
server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码
web.xml可以设置tomcat支持的文件类型
context.xml可以用来配置数据源之类的
tomcat-users.xml用来配置管理tomcat的用户与权限
Catalina此目录下可以设置默认加载的项目

webapps目录

ROOTtomcat默认的页面
docs使用说明文档
examples例子--tomcat首页中的examples按钮对应的内容
host-manager首页HostManager按钮对应的内容
manager首页ManagerApp按钮对应的内容

tomcat相关配置文件简介

server.xml

元素名

属性

解释

server

port

指定一个端口,这个端口负责监听关闭tomcat的请求

shutdown

指定向端口发送的命令字符串

service

name

指定service的名字

Connector(表示客户端和service之间的连接)

port

指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求

minProcessors

服务器启动时创建的处理请求的线程数

maxProcessors

最大可以创建的处理请求的线程数

enableLookups

如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址

redirectPort

指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

connectionTimeout

指定超时的时间数(以毫秒为单位)

Engine(表示指定service中的请求处理引擎,接收和处理来自Connector的请求)

defaultHost

指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的

Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)

docBase

应用程序的路径或者是WAR文件存放的路径

path

表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/

reloadable

这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序

host(表示一个虚拟主机)

name

指定主机名

appBase

应用程序基本目录,即存放应用程序的目录

unpackWARs

如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

Logger(表示日志,调试和错误信息)

className

指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口

prefix

指定log文件的前缀

suffix

指定log文件的后缀

timestamp

如果为true,则log文件名中要加入时间,如下例:localhost_log.004-mm-dd.txt

Realm(表示存放用户名,密码及role的数据库)

className

指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger中的一样)

className

指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息

directory

指定log文件存放的位置

pattern

有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

web.xml

默认Web应用的首页文件的设置

报错文件的设置

session会话过期时间的设置,单位是分钟

servlet的设置(JavaServlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。)

tomcat-users.xml

管理用户配置文件

rolename定义角色,不同的角色管理权限不同,相当于组

manager-gui允许访问html接口(即URL路径为/manager/html/*)
manager-script允许访问纯文本接口(即URL路径为/manager/text/*)
manager-jmx允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
manager-status允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)
admin-gui允许访问html管理界面
admin-script允许访问文本管理界面

user定义用户名

username定义用户名
password设置密码
roles属于那些角色/组

登录管理tomcat

重启tomcat服务命令(tomcat安装和使用)(18)

在提示登录的界面点击取消,会看到提示

重启tomcat服务命令(tomcat安装和使用)(19)

[root@manage01~]#vim/opt/tomcat1/conf/tomcat-users.xml

设置完成之后重启tomcat就可以登录后台管理页面了,其中在managerapp中主要管理的是网站是否发布的操作,start=发布网站

stop=停止发布网站,reload=重新加载,undeploy=卸载/删除网站(慎用),expiresession=会话过期时间

重启tomcat服务命令(tomcat安装和使用)(20)

与war文件部署相关的设置,包括定义war文件存放的位置,和上传war文件

war是一个可以直接运行的web模块,通常用于网站,打包部署。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。war包是Sun提出的一种web应用程序格式,与jar类似,是很多文件的压缩包。war包中的文件按照一定目录结构来组织。简单来说,war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。

重启tomcat服务命令(tomcat安装和使用)(21)

configuration定义TLS(安全传输协议)配置文件

diagnostics检查网站在启动,重新加载或卸载时,是否造成内存溢出,这个操作会触发垃圾回收机制,生产环境中慎用

TLSconnectorconfigurationdiagnostics加密诊断,可以帮助用户诊断加密是否有问题

firefox设置中文

[root@manage01~]#dnfinstallibus*-y

添加完整的中文环境后重启

重启tomcat服务命令(tomcat安装和使用)(22)

重启完成为浏览器添加中文后重启浏览器

重启tomcat服务命令(tomcat安装和使用)(23)

再次访问tomcat管理界面就会变成中文

重启tomcat服务命令(tomcat安装和使用)(24)

发布静态页面

[root@manage01webapps]#pwd/opt/tomcat1/webapps[root@manage01webapps]#mkdirtest[root@manage01webapps]#echo'<%=newjava.util.Date()%>'>test/index.jsp

使用浏览器访问http://ip:8080/test,每次刷新时间都会改变

发布动态页面

我们知道tomcat是用来发布jsp网站的,jsp的网站,页面漂亮还安全,上节课我们已经知道如何发布静态页面了,本节课我们一起来看一下如何发布动态页面,我们通过jpress一个使用java开发的建站软件来实现jsp页面

jpress下载地址:http://jpress.io/download

step1准备jsp页面

[root@manage01~]#mvjpress-v3.2.1.warjpress.war[root@manage01~]#cpjpress.war/opt/tomcat1/webapps/#重启tomcat[root@manage01~]#cpjpress.war/opt/tomcat1/webapps/[root@manage01~]#sh/opt/tomcat1/bin/shutdown.sh[root@manage01~]#sh/opt/tomcat1/bin/startup.sh#重启之后tomcat会自己将这个war的压缩包解压,生成一个同名的目录

step2准备数据库

[root@manage01yum.repos.d]#dnfinstallmariadbmariadb-server-y[root@manage01yum.repos.d]#systemctlrestartmariadb.service[root@manage01~]#mysql-uroot-pEnterpassword:MariaDB[(none)]>createdatabasejpresscharsetutf8;MariaDB[(none)]>grantallonjpress.*tojpress@'localhost'identifiedby'123456';

step3安装jpress

重启tomcat服务命令(tomcat安装和使用)(25)

重启tomcat服务命令(tomcat安装和使用)(26)

重启tomcat服务命令(tomcat安装和使用)(27)

重启tomcat服务命令(tomcat安装和使用)(28)

重启tomcat服务命令(tomcat安装和使用)(29)

重启tomcat服务命令(tomcat安装和使用)(30)

重启tomcat服务命令(tomcat安装和使用)(31)

tomcat多实例

tomcat是一个单进程多线程的软件,在很早之前,我们都认为这种模式挺好的,因为早些年的CPU都是单核的,但是现在都是多核心的CPU了,如果还是一个进程的话呢,就比较浪费CPU资源,所以本节课我们要讨论下如果多开几个tomcat,也就是我们本节课要实现的是tomcat的多实例,这样可以提高资源的利用率,在之前的课程中我们提到过tomcat有三个端口800580098080,其中8005是用来关闭tomcat的端口,8080是访问端口,8009是ajp协议使用的端口,如果我想在一台机器上开启多个tomcat的话,首先要保证的就是端口不能冲突,否则开不了。

step1将之前部署好的tomcat复制一份

[root@manage01webapps]#cd/opt/[root@manage01opt]#lstomcat1[root@manage01opt]#cp-rtomcat1tomcat2[root@manage01opt]#lstomcat1tomcat2

step2修改刚刚部署完成的tomcat的相关配置文件

[root@manage01opt]#vimtomcat2/conf/server.xml#修改端口

step3启动tomcat

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME0

step4打开浏览器访问测试

重启tomcat服务命令(tomcat安装和使用)(32)

重启tomcat服务命令(tomcat安装和使用)(33)

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME1

nginx+tomcat

之前我们在访问的时候使用的都是类似http://serverip/test或者http://serverip/jpress这种字样的URL,使用起来比较麻烦,所以呢,我们可以将tomcat和nginx结合在一起

step1调整tomcat1

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME2

step2调整tomcat2

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME3

使用rewrite实现

step1部署nginx

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME4

step2调整nginx配置文件

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME5

step3修改测试机的hosts文件

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME6

step4打开浏览器直接访问域名测试

使用反向代理实现

调整nginx配置文件

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME7

tomcat调优

tomcat的优化可以提高网站的并发能力,体现个人的价值,tomcat在java项目中的使用率非常高,所以在生产环境对tomcat的优化也就变得非常必要了,一般情况下tomcat的优化主要从两个方面入手,一个是自身配置,另一个是tomcat所运行的jvm虚拟机的优化,优化的工作可以从安装完tomcat就开始着手

AJP优化

在前面的课程中我们提到了一个叫AJP的协议,同时我们也知道了这个AJP的作用,但是在生产环境中一般使用的是nginx+tomcat的架构,所以大多数时候用不到AJP协议,所以我们可以禁用它,而在我们的server.xml文件中这个AJP默认就是禁用的,如果是其它版本最好看一下

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME8

运行模式优化

tomcat的运行模式有3种:

bio

性能非常低下,没有经过任何优化处理和支持,适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

nio

nio(newI/O),是JavaSE1.4及后续版本提供的一种新的I/O操作方式它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat9默认使用nio运行模式。适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。AIO(NIO2)使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能

进入tomcat的服务器状态页面查看默认的模式

重启tomcat服务命令(tomcat安装和使用)(34)

如果默认使用的是bio模式

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用java-version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环境变量设置文件[root@manage01~]#vim/root/.bash_profile#####javaJAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本PATH=$JAVA_HOME/bin:$PATH:$HOME/binCLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexportPATHJAVA_HOMECLASSPATHCATALINA_HOME9

apr

APR(ApacheportableRun-timelibraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。可以大大地提高Tomcat对静态文件的处理性能。也是在Tomcat上运行高并发应用的首选模式。

系统自带的软件包不是最新的,且缺少相关软件包,所以我们选择源码包安装

所需软件包

apr-1.7.0.tar.gz主程序包包含了通用开发组件

apr-iconv-1.2.2.tar.gz用于实现iconv编码

apr-util-1.6.1.tar.gz额外的开发组件

tomcat-native.tar.gz关联tomcat和apr的组件

arp相关软件包下载https://mirrors.cnnic.cn/apache/apr/

tomcat-native在tomcat安装目录的bin下

部署apr环境

step1环境准备

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本0

step2安装apr主程序包

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本1

step3安装apr-iconv

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本2

step4安装apr-util

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本3

step5安装tomcat-native

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本4

step5修改并加载环境变量

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本5

step6修改tomcat配置文件

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本6

step7测试

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本7

重启tomcat服务命令(tomcat安装和使用)(35)

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本8

其它优化参数

[root@manage01bin]#shcatalina.shhelpUsingCATALINA_BASE:/opt/tomcat1UsingCATALINA_HOME:/opt/tomcat1UsingCATALINA_TMPDIR:/opt/tomcat1/tempUsingJRE_HOME:/usrUsingCLASSPATH:/opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jarUsage:catalina.sh(commands...)commands:debugStartCatalinainadebuggerdebug-securityDebugCatalinawithasecuritymanagerjpdastartStartCatalinaunderJPDAdebuggerrunStartCatalinainthecurrentwindowrun-securityStartinthecurrentwindowwithsecuritymanagerstartStartCatalinainaseparatewindowstart-securityStartinaseparatewindowwithsecuritymanagerstopStopCatalina,waitingupto5secondsfortheprocesstoendstopnStopCatalina,waitinguptonsecondsfortheprocesstoendstop-forceStopCatalina,waitupto5secondsandthenusekill-KILLifstillrunningstopn-forceStopCatalina,waituptonsecondsandthenusekill-KILLifstillrunningconfigtestRunabasicsyntaxcheckonserver.xml-checkexitcodeforresultversionWhatversionoftomcatareyourunning?Note:Waitingfortheprocesstoendanduseofthe-forceoptionrequirethat$CATALINA_PIDisdefined[root@manage01bin]#shcatalina.shstop[root@manage01bin]#shcatalina.shhelpstartup启动脚本shutdown关闭脚本9

压力测试工具的使用

ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库、FTP服务器,等等。JMeter可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能

JMeter的作用

能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC)。

完全的可移植性和100%纯java。

完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样。

精心的GUI设计允许快速操作和更精确的计时。

缓存和离线分析/回放测试结果。

下载地址:http://jmeter.apache.org/download_jmeter.cgi

JMeter安装使用

将下载好的压缩包在windows中解压(需要先安装JDK),解压后进入到bin目录双击jmeter.bat,等待启动

重启tomcat服务命令(tomcat安装和使用)(36)

设置中文

重启tomcat服务命令(tomcat安装和使用)(37)

创建测试

重启tomcat服务命令(tomcat安装和使用)(38)

添加线程组,使用线程模拟用户的并发

重启tomcat服务命令(tomcat安装和使用)(39)

重启tomcat服务命令(tomcat安装和使用)(40)

1000个线程循环10次,tomcat会收到10000个请求

添加并设置http请求

重启tomcat服务命令(tomcat安装和使用)(41)

重启tomcat服务命令(tomcat安装和使用)(42)

添加监控

重启tomcat服务命令(tomcat安装和使用)(43)

启动测试

重启tomcat服务命令(tomcat安装和使用)(44)

查看结果

重启tomcat服务命令(tomcat安装和使用)(45)

标签:说明是请求类型,如Http,FTP等请求。
样本总数:也就是图形报表中的样本数目,总共发送到服务器的样本数目。
平均值:也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。
居中的数值:也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
90%&95%&99%:有多少请求的响应时间比给出的数值还要小。
最小:是代表时间的数字,是服务器响应的最短时间。
最大:是代表时间的数字,是服务器响应的最长时间。
异常%:请求的错误百分比。
吞吐量:也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。
发送/接收KB/sec:是每秒钟发送/接收的字节数。

(时间的单位为ms)

通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为587次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为587次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

调整tomcat线程池

[root@manage01~]#vim/opt/tomcat1/conf/tomcat-users.xml0

调整队列

[root@manage01~]#vim/opt/tomcat1/conf/tomcat-users.xml1

3分钟了解计算机发展历

参数介绍可以去官网查看

章总结

tomcat的安装部署

tomcat的相关文件介绍

tomcat的管理

静态页面和动态页面的发布

如何实现tomcat多实例

如何将tomcat和nginx整合

tomcat的调优及压力测试工具的使用

重点:tomcat如何安装、相关目录的作用、如何使用tomcat发布网站,后台管理功能的使用,多实例的实现,如何与nginx整合,tomcat的调优及压力测试工具的使用

难点:不同操作系统的安装,相关文件的作用,使用tomcat发布页面,与nginx的整合方法,调优的方式及压力测试工具

今天东西超级多,我看有几个能从头到尾看完的,哈哈哈哈哈

发表评论:

最近发表
网站分类
标签列表