Tomcat实战

Web中间件Tomcat详解

一、Tomcat简介

Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP程序的首选。

Tomcat 和 Nginx、Apache(httpd)、lighttpd 等 We b服务器一样,具有处理 HTML 页面的功能,另外它还是一个 Servlet 和 JSP 容器,独立的 Servlet 容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。

目前Tomcat最新版本为9.0。Java容器还有resin、weblogic等。

Tomcat官网: http://tomcat.apache.org

二、Tomcat 基础 JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

JDK包含了一批用于Java开发的组件,其中包括:

javac:编译器,将后缀名为.java的源代码编译成后缀名为“.class”的字节码
java:运行工具,运行.class的字节码
jar:打包工具,将相关的类文件打包成一个文件
javadoc:文档生成器,从源码注释中提取文档,注释需匹配规范
jdb debugger:调试工具
jps:显示当前java程序运行的进程状态
javap:反编译程序
appletviewer:运行和调试applet程序的工具,不需要使用浏览器
javah:从Java类生成C头文件和C源文件。这些文件提供了连接胶合,使Java和C代码可进行交互。
javaws:运行JNLP程序
extcheck:一个检测jar包冲突的工具
apt:注释处理工具 
jhat:java堆分析工具
jstack:栈跟踪程序
jstat:JVM检测统计工具
jstatd:jstat守护进程
jinfo:获取正在运行或崩溃的java程序配置信息
jmap:获取java进程内存映射信息
idlj:IDL-to-Java编译器。将IDL语言转化为java文件 
policytool:一个GUI的策略文件创建和管理工具
jrunscript:命令行脚本运行

JDK中还包括完整的 JRE(Java Runtime Environment),Java运行环境,也被称为private runtime。包括了用于产品环境的各种库类,如基础类库rt.jar,以及给开发人员使用的补充库,如国际化与本地化的类库、IDL库等等。

JDK中还包括各种样例程序,用以展示Java API中的各部分。

JDK下载面页:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

##三、安装 Tomcat & JDK

安装时候选择 tomcat 软件版本要与程序开发使用的版本一致。jdk 版本要进行与 tomcat 保持一致。

1、系统环境说明
[root@qfedu.com ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@qfedu.com ~]# uname -a 
Linux qfedu.com 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@qfedu.com ~]# getenforce 
Disabled
[root@qfedu.com ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
2 、安装 JDK
1、命令集
1.上传jdk到服务器中,安装jdk
[root@qfedu.com ~]# mkdir /application   #创建工作目录
[root@qfedu.com ~]# tar xzf jdk-8u60-linux-x64.tar.gz -C /application/
[root@qfedu.com ~]# mv /application/jdk1.8.0_60 /application/jdk
# 设置环境变量
[root@qfedu.com ~]# vim /etc/profile
export JAVA_HOME=/application/jdk   #指定java安装目录
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH    #用于指定java系统查找命令的路径
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar  #类的路径,在编译运行java程序时,如果有调用到其他类的时候,在classpath中寻找需要的类。
[root@qfedu.com ~]# source /etc/profile  #让环境变量生效
2、测试jdk是否安装成功
[root@qfedu.com ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
3、安装Tomcat
1、命令集
将tomcat安装包上传到服务器中:
[root@qfedu.com ~]# tar xzf apache-tomcat-8.0.27.tar.gz -C /application/
[root@qfedu.com ~]# mv /application/apache-tomcat-8.0.27 /application/tomcat
# 设置环境变量
[root@qfedu.com ~]# echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
[root@qfedu.com ~]# source /etc/profile
# 注意授权,统一权限
[root@qfedu.com ~]# chown -R root.root /application/jdk/ /application/tomcat/
2、检查tomcat是否安装成功
[root@qfedu.com ~]# /application/tomcat/bin/version.sh
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.27
Server built:   Sep 28 2015 08:17:25 UTC
Server number:  8.0.27.0
OS Name:        Linux
OS Version:     3.10.0-693.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_60-b27
JVM Vendor:     Oracle Corporation

##四、Tomcat 目录介绍

1、tomcat主目录介绍
[root@qfedu.com ~]# cd /application/tomcat/
[root@qfedu.com tomcat]# tree -L 1
.
├── bin              #存放tomcat管理脚本
├── conf             # tomcat 配置文件存放目录
├── lib              # web应用调用的jar包存放路径
├── LICENSE
├── logs             # tomcat 日志存放目录,catalina.out 为主要输出日志
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp             # 存放临时文件
├── webapps          # web程序存放目录
└── work             # 存放编译产生的.java 与 .class文件

7 directories, 4 files
2、webapps 目录介绍
[root@qfedu.com tomcat]# cd webapps/
[root@qfedu.com webapps]# tree -L 1
.
├── docs            # tomcat 帮助文档
├── examples       # web应用实例
├── host-manager  # 主机管理
├── manager         # 管理
└── ROOT             # 默认站点根目录

5 directories, 0 files
3、Tomcat 配置文件目录介绍(conf)
[root@qfedu.com conf]# tree -L 1
.
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── logging.properties
├── logs
├── server.xml           # tomcat 主配置文件
├── server.xml.bak
├── server.xml.bak2
├── tomcat-users.xml     # tomcat 管理用户配置文件
├── tomcat-users.xsd
└── web.xml

2 directories, 10 files

##五、Tomcat运维

# 启动程序/application/tomcat/bin/startup.sh
# 关闭程序/application/tomcat/bin/shutdown.sh

1、启动停止

[root@qfedu.com ~]# /application/tomcat/bin/shutdown.sh 
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
[root@qfedu.com ~]# /application/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.

​ 注意:tomcat未启动的情况下使用shutdown脚本,会有大量的输出信息。

2、检查tomcat是否启动正常

[root@qfedu.com ~]# netstat -lntup  |grep java
tcp6       0      0 :::8080         :::*                   LISTEN      30560/java          
tcp6       0      0 127.0.0.1:8005          :::*          LISTEN      30560/java          
tcp6       0      0 :::8009                 :::*           LISTEN      30560/java      

**说明:**所有与java相关的,服务启动都是java命名的进程

3、浏览器进行访问

http://10.0.0.17:8080/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blXUDsqD-1634979006952)(assets/1190037-20171127161441800-1077081232.png)]

###4、Tomcat 日志说明

1、查看日志
[root@qfedu.com ~]# tail -f /application/tomcat/logs/catalina.out
24-Nov-2017 15:09:51.654 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
24-Nov-2017 15:09:51.665 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
24-Nov-2017 15:09:51.670 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 60037 ms

​ 发现启动时间较长,其中有一项的启动时间占据了绝大多数

24-Nov-2017 15:09:50.629 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /application/apache-tomcat-8.0.27/webapps/memtest.war has finished in 58,892 ms

​ 发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session ID是通过SHA1算法计算得到的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥。

2、解决 Tomcat 启动慢的方法

Tomcat启动慢主要原因是生成随机数的时候卡住了,导致tomcat启动不了。

是否有足够的熵来用于产生随机数,可以通过如下命令来查看

[root@qfedu.com ~]# cat /proc/sys/kernel/random/entropy_avail
6

为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断,网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。

cat /dev/random 会消耗能量

方法1:

[root@qfedu.com ~]# vim $JAVA_HOME/jre/lib/security/java.security
securerandom.source=file:/dev/random

改为

securerandom.source=file:/dev/urandom

方法2:

[root@qfedu.com ~]# vim $TOMCAT_HOME/bin/catalina.sh
if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
    JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
fi

这个系统属性 egd 表示熵收集守护进程 (entropy gathering daemon)

方法3:(推荐)

[root@qfedu.com ~]# yum install rng-tools # 安装rngd服务(熵服务,增大熵池)
[root@qfedu.com ~]# systemctl start rngd  # 启动服务

5、Tomcat 管理功能使用

注意:测试功能,生产环境不要用

Tomcat 管理功能用于对 Tomcat 自身以及部署在 Tomcat 上的应用进行管理的 web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置tomcat-users.xml 文件。

[root@qfedu.com ~]# vim /application/tomcat/conf/tomcat-users.xml
……
 39 <role rolename="manager-gui"/>
 40 <role rolename="admin-gui"/>
 41 <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
 42 </tomcat-users>   # 在此行前加入上面三行

需要注释一下内容:
[root@qfedu.com ~]# vim /application/tomcat/webapps/manager/META-INF/context.xml
...
<!--  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

未修改文件前进行访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjyBMfBI-1634979006960)(assets/image-20200420121858287.png)]

​ 从而得出上面的配置文件信息。

1、在web界面访问管理界面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6W94ftqE-1634979006961)(assets/1190037-20171127161751487-2030329982.png)]

​ 输入之前配置的账户与密码即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1aPEgvfI-1634979006963)(assets/1190037-20171127161800081-74753629.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hi8ngxtb-1634979006963)(assets/1190037-20171127161808956-1963855479.png)]

6、Tomcat主配置文件详解

1、server.xml 组件类别

顶级组件:位于整个配置的顶层,如server。

容器类组件:可以包含其它组件的组件,如service、engine、host、context。

连接器组件:连接用户请求至tomcat,如connector。

被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

<server>
     <service>
     <connector />
     <engine>
     <host>
     <context></context>
     </host>
     <host>
     <context></context>
     </host>
     </engine>
     </service>
</server>
2、组件介绍
组件名称功能介绍
engine核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。
host类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。
context定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。
connector接收用户请求,类似于httpd的listen配置监听端口的。
service(服务)将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。
server表示一个运行于JVM中的tomcat实例。
Valve阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。
logger日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。
realm可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。
UserDatabaseRealm使用JNDI自定义的用户认证库。
MemoryRealm认证信息定义在tomcat-users.xml中。
JDBCRealm认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。
3、server.xml 配置文件注释
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
    port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
    shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
-->
<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主要参数说明(见下表) -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
        defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
    -->
    <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参数详解)-->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!-- 详情常见下表(Context参数说明 )-->
        <Context path="" docBase="" debug=""/>
        <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" />
      </Host>
    </Engine>
  </Service>
</Server>
4、Connector 主要参数说明
参数参数说明
connector接收用户请求,类似于httpd的listen配置监听端口.
port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
address指定连接器监听的地址,默认为所有地址(即0.0.0.0)
protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)
5、host 参数详解
参数参数说明
host表示一个虚拟主机
name指定主机名
appBase应用程序基本目录,即存放应用程序的目录.一般为appBase=“webapps”,相对于CATALINA_HOME而言的,也可以写绝对路径。
unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
autoDeploy在tomcat启动时,是否自动部署。
xmlValidation是否启动xml的校验功能,一般xmlValidation=“false”。
xmlNamespaceAware检测名称空间,一般xmlNamespaceAware=“false”。
6、Context 参数说明
参数参数说明
Context表示一个web应用程序,通常为WAR文件
docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序

7、WEB站点部署

上线的代码有两种方式:

第一种方式是直接将程序目录放在 webapps 目录下面,这种方式大家已经明白了,就不多说了。

第二种方式是使用开发工具将程序打包成 war 包,然后上传到 webapps 目录下面。

1、使用 war 包部署 web 站点
1.将准备的memtest.war包上传到服务中
[root@qfedu.com webapps]# pwd
/application/tomcat/webapps
[root@qfedu.com webapps]# rm -rf *  #删除tomcat的测试页面
[root@qfedu.com webapps]# cp /root/memtest.war .
2.启动
[root@qfedu.com webapps]# /application/tomcat/bin/startup.sh

站点主动解压部署

[root@qfedu.com webapps]# ls
memtest  memtest.war

浏览器访问:

http://10.0.0.17:8080/memtest/meminfo.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2HthMBH-1634979006964)(assets/1190037-20171127162004050-628167729-1580798155807.png)]

2、自定义默认网站目录

上面访问的网址为 http://10.0.0.3:8080/memtest/meminfo.jsp

现在想访问格式为http://10.0.0.3:8080/meminfo.jsp

方法一

将 meminfo.jsp 或其他程序放在 tomcat/webapps/ROOT目录下即可。因为默认网站根目录为 tomcat/webapps/ROOT

[root@qfedu.com webapps]# /application/tomcat/bin/shutdown.sh
[root@qfedu.com webapps]# mkdir ROOT
[root@qfedu.com webapps]# cp -r memtest/* ROOT/
[root@qfedu.com webapps]# ls
memtest  memtest.war  ROOT

[root@qfedu.com webapps]# /application/tomcat/bin/startup.sh

方法二

[root@qfedu.com ~]# vim /application/tomcat/conf/server.xml +150
…… #添加上这一行
        <Context path="" docBase="/application/tomcat/webapps/test" debug="0" reloadable="false" crossContext="true"/>
……
[root@qfedu.com webapps]# rm -rf memtest memtest.war
[root@qfedu.com webapps]# mkdir test
[root@qfedu.com webapps]# cp -r ROOT/* test/
[root@qfedu.com webapps]# rm -rf ROOT/

修改配置文件后,要重启服务

[root@qfedu.com ~]# /application/tomcat/bin/shutdown.sh 
[root@qfedu.com ~]# /application/tomcat/bin/startup.sh  
3、部署开源站点(jpress)

jpress官网:http://jpress.io

下载地址:https://github.com/JpressProjects/jpress

1、安装配置数据库
[root@qfedu.com ~]# yum -y install mariadb-server
[root@qfedu.com ~]# systemctl start mariadb.service
2、配置数据库
[root@qfedu.com ~]# mysql
create database jpress DEFAULT CHARACTER SET utf8;
grant all on jpress.* to jpress@'localhost' identified by '123456';
flush privileges;
exit
3、jpress 站点上线
1.准备jpress-v3.2.4.war并上传到服务器中
[root@qfedu.com ~]# /application/tomcat/bin/shutdown.sh 
[root@qfedu.com webapps]# pwd
/application/tomcat/webapps
[root@qfedu.com webapps]# cp /root/jpress-v3.2.4.war .  #将war包拷贝到当前目录

启动tomcat

[root@qfedu.com ~]# /application/tomcat/bin/startup.sh 
4、浏览器访问

浏览器访问: http://10.0.0.17:8080/jpress-web-newest/install

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e7Rc3a6I-1634979006965)(assets/1190037-20171127162126425-251381726.png)]

填写数据库信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCaUhDic-1634979006965)(assets/1190037-20171127162135190-1727193752.png)]

设置站点名称等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEq6D58G-1634979006965)(assets/1190037-20171127162142753-1410863007.png)]

安装完成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLFOB5GN-1634979006966)(assets/1190037-20171127162149956-1281737675.png)]

8、Tomcat 安全优化

1、telnet 管理端口保护(强制)
类别配置内容及说明标准配置备注
telnet管理端口保护1.修改默认的8005管理端口为不易猜测的端口(大于1024);2.修改SHUTDOWN指令为其他字符串;1.以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;
2、ajp 连接端口保护(推荐)
类别配置内容及说明标准配置备注
Ajp 连接端口保护1.修改默认的ajp 8009端口为不易冲突的大于1024端口;2.通过iptables规则限制ajp端口访问的权限仅为线上机器;<Connector port="8528"protocol=“AJP/1.3” />以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;;保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;
3、 禁用管理端(强制)
类别配置内容及说明标准配置备注
禁用管理端1. 删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件;2. 删除{Tomcat安装目录}/webapps下默认的所有目录和文件;3.将tomcat 应用根目录配置为tomcat安装目录以外的目录;<Host name=“localhost” appBase=“/application/work/webapps”对于前段web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重;
4、降权启动(强制)
类别配置内容及说明标准配置备注
降权启动1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发;避免一旦tomcat 服务被入侵,黑客直接获取高级用户权限危害整个server的安全;
[root@qfedu.com ~]# useradd tomcat
[root@qfedu.com ~]# mkdir /home/tomcat -p
[root@qfedu.com ~]# cp -a /application/tomcat /home/tomcat/tomcat8_1
[root@qfedu.com ~]# chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
[root@qfedu.com ~]# su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
Using CATALINA_BASE:   /home/tomcat/tomcat8_1
Using CATALINA_HOME:   /home/tomcat/tomcat8_1
Using CATALINA_TMPDIR: /home/tomcat/tomcat8_1/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /home/tomcat/tomcat8_1/bin/bootstrap.jar:/home/tomcat/tomcat8_1/bin/tomcat-juli.jar
Tomcat started.
[root@qfedu.com ~]# ps -ef|grep tomcat
5、文件列表访问控制(强制)
类别配置内容及说明标准配置备注
文件列表访问控制1.conf/web.xml文件中default部分listings的配置必须为false;listingsfalsefalse为不列出目录文件,true为允许列出,默认为false;
6、版本信息隐藏(强制)
类别配置内容及说明标准配置备注
版本信息隐藏1.修改conf/web.xml,重定向403、404以及500等错误到指定的错误页面;2.也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向;403/forbidden.jsp404/notfound.jsp500/systembusy.jsp在配置中对一些常见错误进行重定向,避免当出现错误时tomcat默认显示的错误页面暴露服务器和版本信息;必须确保程序根目录下的错误页面已经存在;
7、Server header重写(推荐)
类别配置内容及说明标准配置备注
Server header重写在HTTP Connector配置中加入server的配置;server=“webserver当tomcat HTTP端口直接提供web服务时此配置生效,加入此配置,将会替换http 响应Server header部分的默认配置,默认是Apache-Coyote/1.1
8、访问限制(可选)
类别配置内容及说明标准配置或操作备注
访问限制通过配置,限定访问的ip来源<Valve className=“org.apache.catalina.valves.RemoteAddrValve” allow=“61.148.18.138,61.135.165.130*” deny=“*.*.*.*”/>通过配置信任ip的白名单,拒绝非白名单ip的访问,此配置主要是针对高保密级别的系统,一般产品线不需要;
9、起停脚本权限回收(推荐)
类别配置内容及说明标准配置或操作备注
起停脚本权限回收去除其他用户对Tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限;chmod -R 744 tomcat/bin/*防止其他用户有起停线上Tomcat的权限;
10、访问日志格式规范(推荐)
类别配置内容及说明标准配置或操作备注
访问日志格式规范开启Tomcat默认访问日志中的Referer和User-Agent记录开启Referer和User-Agent是为了一旦出现安全问题能够更好的根据日志进行问题排查;
11、附录:建议配置及标准执行方案
1、配置部分(${ CATALINA_HOME }conf/server.xml)
<Server port="8527" shutdown="dangerous">

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" server="webserver"/> 

<!-- Define an AJP 1.3 Connector on port 8528 -->
<!--Define an accesslog --> 
<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" resolveHosts="false"/>

    <Connector port="8528" protocol="AJP/1.3" />
2、配置部分(${ CATALINA_HOME }conf/web.xml或者WEB-INF/web.xml)
vim /application/tomcat/conf/web.xml

<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param></web-app>标签前面添加:

<error-page>
    <error-code>403</error-code>
    <location>/forbidden.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/notfound.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/systembusy.jsp</location>
</error-page>
3、删除如下 tomcat 的默认目录和默认文件
tomcat/webapps/*
tomcat/conf/tomcat-user.xml
4、去除其他用户对tomcat起停脚本的执行权限
[root@qfedu.com ~]# chmod 744 –R tomcat/bin/*
12、Tomcat 性能优化

tomcat性能取决于 内存大小

1、上策:优化代码

该项需要开发经验足够丰富,对开发人员要求较高

2、中策:jvm优化机制 垃圾回收机制把不需要的内存回收

优化jvm–优化垃圾回收策略

优化 catalina.sh 配置文件。在 catalina.sh 配置文件中添加以下代码

# tomcat分配1G内存模板
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m"

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms800m -Xmx800m -XX:NewSize=400m -XX:MaxNewSize=400m"
# 重启服务
[root@qfedu.com ~]# /application/tomcat/bin/shutdown.sh
[root@qfedu.com ~]# /application/tomcat/bin/startup.sh

修改之前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IBSF7O0u-1634979006966)(assets/1190037-20171127163243831-313808608-1580798155809.png)]

修改之后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h8NJVpFG-1634979006967)(assets/1190037-20171127163252128-1901433795-1580798155809.png)]

3、下策:加足够大的内存

该项的资金投入较大

4、下下策:每天0点定时重启tomcat

使用较为广泛

六、Tomcat部署War包实战

部署Jenkins项目

1、安装 tomcat

Tomcat 服务器在生产环境中主要作为JAVA程序的WEB服务器。我们这里以Tomcat + jenkins 的部署为例来运行 jenkins 服。

1、安装JDK8、并配置JAVA_HOME 等相关信息(新版本jenkins只有jdk8支持)

   JAVA_HOME="/usr/local/jdk"
   CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
   PATH=$PATH:"$JAVA_HOME/bin"

2、安装Tomcat,启动Tomcat 并访问 http://127.0.0.1:8080 (这是使用了tomcat8 做测试)

3、下载jenkins的war包程序 http://mirrors.shu.edu.cn/jenkins/war/2.108/jenkins.war

4、将jenksins.war 放到解压后的tomcat 的 webapps 目录中

5、重启 tomcat,并访问 http://127.0.0.1/jenkins

2、日志格式配置

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data0/www/logs"
               prefix="jenkins-" suffix="-access_log"
               pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>

3、JVM 参数优化

JAVA_OPTS="-Xms4096m -Xmx4096m -XX:NewSize=512m -XX:MaxNewSize=512m"

4、开启GC日志

JAVA_OPTS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log"

[root@qfedu.com ~]# mkdir /data0/logs/ -p  #创建gc日志存放路径

5、开启JMX端口便于监控

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=10028 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=qfedu.com"

6、取消JVM 的默认DNS缓存时间

不缓存DNS记录,避免DNS解析更改后要重启JVM虚拟机

CATALINA_OPTS="$CATALINA_OPTS -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议 视频教程+笔记+课件+资料 虽然在课程中还讲解了部分HTTP协议的技术,但是课程的重点还是NGINX、JVM、Tomcat三相运维与配置技术。课程内容包括了Nginx进阶基础,Nginx配置提升,JVM虚拟机尝试,JVM运维实用排障工具,JVM监控工具,Tomcat配置,Tomcat运维与部署等Web服务器的必备运维部署技术。 ===============课程目录=============== (1)\笔记+课件+资料;目录中文件数:0个 (2)\视频教程;目录中文件数:49个 ├─1.01 HTTP协议-工作原理及消息结构.mp4 ├─1.02 HTTP协议-客户端请求信息及服务端响应信息.mp4 ├─1.03 HTTP协议-请求方法及响应头信息.mp4 ├─1.04 HTTP协议-状态码.mp4 ├─1.05 Nginx进阶基础-Nginx介绍及为什么选择Nginx.mp4 ├─1.06 Nginx进阶基础-IO多路复用及内部技术架构.mp4 ├─1.07 Nginx进阶基础-虚拟主机.mp4 ├─1.08 Nginx进阶基础-虚拟主机.mp4 ├─2.01 Nginx进阶常见配置-虚拟主机+PHP-FPM.mp4 ├─2.02 Nginx进阶-常见配置-反向代理.mp4 ├─2.03 Nginx进阶基础-常见配置-反向代理.mp4 ├─2.04 Nginx进阶基础-upstream.mp4 ├─2.05 Nginx进阶基础-常用配置-会话保持.mp4 ├─2.06 Nginx进阶基础常见配置-动静分离.mp4 ├─2.07 Nginx进阶常见配置-rewrite-概念介绍.mp4 ├─2.08 Nginx进阶常见配置-rewrite实例.mp4 ├─2.09 Nginx进阶常见配置-rewrite实例.mp4 ├─2.10 Nginx进阶常见配置-if指令.mp4 ├─2.11 Nginx进阶常见配置-set及return指令.mp4 ├─2.12 Nginx进阶基础-常见配置-return及break指令.mp4 ├─2.13 Nginx进阶基础-常见配置-location.mp4 ├─3.01 Nginx进阶配置提升-预定义变量及日志详解.mp4 ├─3.02 Nginx进阶配置提升-日志切割及升级.mp4 ├─3.03 Nginx进阶-配置提升-Nginx错误页面.mp4 ├─3.04 Nginx进阶-配置提升-访问控制.mp4 ├─3.05 Nginx进阶-配置提升-流量控制.mp4 ├─3.06 Nginx进阶-提升配置-流量控制.mp4 ├─3.07 Nginx进阶-配置提升-Nginx监控.mp4 ├─3.08 Nginx进阶-配置提升-NginxAlias虚拟目录.mp4 ├─4.01 jvm虚拟机常识-什么是java虚拟机-java如何做到跨平台.mp4 ├─4.02 jvm虚拟机常识-虚拟机结构.mp4 ├─4.03 jvm虚拟机常识-虚拟机堆内存结构.mp4 ├─4.04 jvm虚拟机常识-jvm虚拟机参数类型-常用的jvm参数.mp4 ├─4.05 java细腻及讲解-jvm虚拟机常识-常用垃圾回收算法.mp4 ├─4.06 jvm运维实用排障工具.mp4 ├─4.07 jvm运维实用排障工具-jps-jstack.mp4 ├─4.08 jvm运维实用排障工具-jinfo-jstat.mp4 ├─4.09 jvm运维实用监控工具-virtualvm安装-安装插件.mp4 ├─4.10 jvm运维实用监控工具-如何监控jvm.mp4 ├─5.01 tomcat简介与tomcat基础JDk.mp4 ├─5.02 tomcat&jdk安装.mp4 ├─5.03 tomcat目录介绍-tomcat运维-启动与关闭.mp4 ├─5.04 tomcat运维-tomcat日志说明-tomcat管理功能.mp4 ├─5.05 tomcat运维-server.xml配置文件注释.mp4 ├─5.06 tomcat运维-web站点部署.mp4 ├─5.07 tomcat运维-部署开源站点.mp4 ├─5.08 tomcat运维-tomcat优化.mp4 ├─5.09 tomcat运维-tomcat性能优化.mp4 ├─5.10 tomcat部署war包实战.mp4 (3)\笔记+课件+资料\第1天;目录中文件数:4个 ├─01-第1天-HTTP协议.pdf ├─02-第1天-Nginx进阶基础.pdf ├─第1天-HTTP协议.md ├─第1天-Nginx进阶基础.md (4)\笔记+课件+资料\第2天;目录中文件数:1个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值