TOMCAT

一、概述
Tomcat 是由 Apache 软件基金会下属的 Jakarta 项目开发的一个 servelet 容器,按照 Sun microsystems 提供的技术 规范开发出来,Tomcat 8 实现了对 servlet 3.1 Javaserver page 2.3 JSP )的支持,并提供了作为 web 服务器的 一些特有功能,如Tomcat 管理和控制平台、安全域管理和 Tomcat 附加组件等

二、部署
首先安装jdk,tomcat8就安装jdk8
cd /usr/local/src
tar zxf jdk-8u333-linux-x64.tar.gz
mv jdk1.8.333 /usr/local/java

#vim /etc/profile

JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH

. /etc/profile

可以去阿里的镜像仓库下载tomcat
tar zxf apache-tomcat-8.5.82.tar.gz
mv apache-tomcat-8.5.82/ /usr/local/tomcat
vim /etc/profile

TOMECAT=/usr/local/tomcat
export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH

. /etc/profile

1.多实例
cp -rf /usr/local/tomcat /usr/local/tomcat2
vim /usr/local/tomcat2/conf/server.xml

修改实例停止端口 原来是8005 这个改成8006吧
<Server port="8006" shutdown="SHUTDOWN">
修改连接器端口 原来为8009/8443 改成 8010 8444
 <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
修改web服务器端口 原来是8080 改成8081
 <Connector port="8081" protocol="HTTP/1.1"

/usr/local/tomcat2/bin/catalina.sh start


2.jps
jps -q 仅显示vm标识,-m输出主函数传入的参数,-l输出应用程序主类完整package,-v列出jvm参数,-V输出通过,hotsportrc或者-XX:Flags=<filename>指定的jvm参数
hostid:指定特定主机,可以使ip地址或域名


3.目录结构
conf ——Tomcat配置文件 lib ——Tomcat运行需要的库文件(JARS) logs ——
Tomcat执行时的LOG文件 temp ——Tomcat临时文件存放目录 webapps ——Tomcat的主要Web发布目录(存放我们自己的JSP,SERVLET,类) work ——Tomcat的工作目录
WEB-INF:可以称为是安全目录,因为在这下面的文件,浏览器是访问不到的,用来配置应用程序、扩展程序、类加载器和服务


默认webapps目录结构
docs:Tomcat帮助文档 examples:web应用实例 host-manager:主机管理 manager:应用管理 ROOT:默认站点根目录


配置文件
server.xml 主配置文件 web.xml 与其他适用于整个web应用程序设置的配置文件 context.xml 默认context设置,应用于安装了Tomcat的所有主机的所有部署内容 tomcat-users.xml用来配置管理tomcat的用户与权限catalina.xml Tomcat的安全防护策略文件


1) Server提供一个接口,由1至多个Service组成,让其它程序可以访问到这个Service集合,同时维护各个Service的生命周期,包括如何初始化,如何结束服务,如何找到别人请求的服务。
2)Service又由1-n个Connector及单个Container组成,只是在Container和Connector外多包了一层,提供各种服务
3)Connector组件是可选择替换的,负责接收浏览器发过来的TCP连接请求,创建Request/Response,分配线程,将创建的对象传递给Container来处理请求
4)Container是容器的父接口,由四个容器组成,分别是Engine,Host,Context,Wrapper。其中Engine包 含Host,Host包含Context,Content包含Wrapper,一个Servlet class对应一Wrapper
5)Engine容器是作为顶级Container组件来设计的,由Host组成,其作用相当于一个Container的门面。有了Engine,请求的处理过程变为:浏览器发出请求,Connector接受请求,将请求交由Container(这里是Engine)处理,Container(Engine来担当)查找请求对应的Host并将请求传递给它,Host拿到请求后查
找相应的应用上下文环境,准备 servlet环境并调用service方法。
6)Host容器是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个主机可以运行多个应用,他负责安装和展开这些应用,并且标识这个应用,以便能够区分他们。它的子容器通常是Context,他除了关联子容器外,还保存一个主机应有的信息。Host不是必需的,但是要运行 war程序,就必须要使用Host,因为在war中必有web.xml文件,这个文件解析就需要Host,如果有多个Host就需要定义一个top容器 Engine,而Engine没有父容器,一个Engine就代表一个完整的Servlet引擎
7)Context代表Servlet的Context,它具备Servlet运行的基本环境,理论上只要有Context就能运行Servlet,简单的Tomcat可以没有Engine和Host。其最重要的功能就是管理Servlet实例,Servlet实例在Context中是以Wrapper 出现的。
8)Wrapper代表一个Servlet,它负责管理Servlet,包括装载,初始化,执行以及资源回收。它是最底层的容器
9)valve 阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志、基于ip做访问控制


XML配置文件结构
<Server> 顶层类元素:一个配置文件中只能有一个<Server>元素,可包含
多个Service。
 <Service> 顶层类元素:本身不是容器,可包含一个Engine,多个
Connector。
 <Connector/> 连接器类元素:代表通信接口。
 <Engine> 容器类元素:为特定的Service组件处理所有客户请求,可包含多个Host。
 <Host> 容器类元素:为特定的虚拟主机处理所有客户请求,可包含多个
Context。
 <Context> 容器类元素:为特定的Web应用处理所有客户请求。
 </Context>
 </Host>
 </Engine>
 </Service>
</Server>
4. 自定义目录
修改server.xml文件中的host元素 #appBase 定义站点目录 #docBase 定义应用目录 #Context path 指出你的访问路径(虚拟应用名,可为空) #Context docBase 指定你的存放路径 #debug 为设定dedug的登记,0提供最
少的信息,9提供最多的信息 #reloadable=true 当web.xml或者class有改动的是后续都会自动更新加载,不需要
从新启动服务 #crosscontext="true" 表示配置的不同context共享一个session #unpackWARs 是否自动解压war包 #autoDeploy 是否自动部署(热部署)

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/shop" docBase="/data/project" debug="0" reloadable="false"
crossContext="true">
</Context>
</Host>

正常访问/shop时会报错,可以修改conf/web.xml文件,将listings改为true(生产环境不建议开启)


5.监控页面
自定义一个监控页面,tomcat基于java环境所以可以直接在webapps/ROOT下写一个jsp文件
vim webapps/ROOT/test.jsp
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory: "+tm+"MB"+"<br>");
out.println("Free memory: "+fm+"MB"+"<br>");
out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
在浏览器访问 192.168.86.10/test.jsp


6.远程监控
1) 修改bin/catalina.sh
CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.86.10
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=8080
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=true" 必须是一行
2) 配置认证用户
cd /usr/local/java/jre/lib/management/
cp jmxremote.password.template jmxremote.password
vim jmxremote.password
在文件最后
monitorRole 123456
controlRole 123456

jmxremote.access文件最后显示这两个用户的权限
monitorRole readonly
controlRole readwrite \    controlRole有更高的权限

修改文件读取权限
chmod 600 vim jmxremote.password
重启tomcat
在具有图形界面的linux系统中使用jconsole命令
或者在windows下载jdk环境再使用jconsole,必须具有图形环境

7.tomcat主页的manager App无法访问
1)修改webapps/manager/META-INF/context.xml文件
<Context antiResourceLocking="false" privileged="true" >
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
 allow=" ^.*$" /> 允许所有ip访问,也可以使用正则限制
 <Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPrevent
ionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>?


2)修改conf/tomcat-users.xml文件,配置manager角色,用户名及密码
把原来配置文件底部的内容取消注释并修改
<tomcat-users> 
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="manager" password="123456" roles="manager-gui"/>
<user username="managerscript" password="123456" roles="manager-script"/>
</tomcat-users>
manager-gui #允许访问html接口(即URL路径为/manager/html/*)
manager-script #允许访问纯文本接口(即URL路径为/manager/text/*)
manager-jmx #允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
manager-status #允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)
重启tomcat并访问,访问后弹出登录界面,使用配置文件中的用户名和密码即可
从app manager后台中,可以实现管理应用运行状态,选择是否部署、会话管理、信息状态查看、部署war包等动作


3)hostmanager需要单独配置
修改允许访问的ip
vim webapps/host-manager/META-INF/context.xml
跟manager一样改为^.*$或者正则匹配
修改conf/tomcat-users.xml文件添加admin角色
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="admin" password="123456" roles="admin-gui"/>
 <user username="adminscript" password="123456" roles="admin-script"/>
重启再次访问


8.安全
1)端口防护
修改目标端口为不易猜测的端口,就修改多实例那几个地方就可以
2)后台管理
删除默认的管理后台(如果不需要使用),降低被爆破和提权的风险
删除webapp下的host-manager和manager目录
3)禁用目录浏览
修改conf/web.xml文件,将listings改为false
4)隐藏版本信息
vim conf/web.xml
<error-page>
<error-code>404</error-code>也可以写别的报错403.404.500
<location>/notfound.jsp</location>
</error-page>

vim notfound.jsp
<%
out.println("error");
%>


5)脚本权限收回
去除其他用户对tomcat的bin目录下的shutdown.sh,startup.sh,catalina.sh的可执行权限


6)日志规范
修改日志格式
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log" suffix=".txt"
 pattern="%h %l %u %t &quot;%r&quot; %s %b" />
修改后的样子:
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log" suffix=".txt"
 pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" />


7)日志切割
下载安装cronolog日志切割工具
yum -y install cronolog
编译tomcat的bin/catalina.sh
-classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 "&"最后一行改为
2>&1 |cronolog "$CATALINA_BASE/logs/catalina-bdqn-%Y-%m-%d.log" &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值