Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
tomcat依赖于JDK工具包,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
官网下载地址https://www.oracle.com/java/technologies/downloads/archive/
直接安装即可,如果使用压缩包安装则需要自己配置环境变量
# 解压安装JDK
mkdir -p /usr/java
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/java
# 配置环境变量
vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/jdk1.8.0_60
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOMECLASSPATHPATH
# 测试
source /etc/profile.d/java.sh
java -version
tomcat官网地址:https://dlcdn.apache.org/tomcat/tomcat-8
[root@localhost ~]# wget -c https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.84/bin/apache-tomcat-8.5.84.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg apache-tomcat-8.5.84.tar.gz jdk-8u144-linux-x64.rpm
# 下载好后解压到/usr/local目录下
# tomcat解压就能使用
[root@localhost ~]# tar xf apache-tomcat-8.5.84.tar.gz -C /usr/local/
[root@localhost ~]# ls /usr/local/
apache-tomcat-8.5.84 bin etc games include lib lib64 libexec sbin share src
# 建立一个软连接
[root@localhost ~]# ln -sv /usr/local/apache-tomcat-8.5.84/ /usr/local/tomcat
‘/usr/local/tomcat’ -> ‘/usr/local/apache-tomcat-8.5.84/’
软链接的好处:
1、减少输入
2、方便升级
目录及其功能:
[root@localhost ~]# cd /usr/local/tomcat/
[root@localhost tomcat]# tree -L 1
.
├── bin # 存放tomcat管理脚本,二进制文件
├── BUILDING.txt
├── conf # tomcat配置文件存放目录
├── CONTRIBUTING.md
├── lib # web应用调用的jar包存放路径
├── LICENSE
├── logs # tomcat日志存放目录,catalina.out 为主要输出日志
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp # 存放临时文件
├── webapps # web程序存放目录
└── work # 存放编译产生的.java和.class文件
7 directories, 7 files
[root@localhost tomcat]# tree -L 1 /usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/
├── docs # tomcat 帮助文档
├── examples # web应用实例
├── host-manager # 主机管理
├── manager # 管理
└── ROOT # 默认站点根目录
5 directories, 0 files
[root@localhost tomcat]# tree -L 1 /usr/local/tomcat/conf
/usr/local/tomcat/conf
├── catalina.policy
├── catalina.properties
├── context.xml
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties
├── server.xml # tomcat主配置文件
├── tomcat-users.xml # tomcat管理用户配置文件
├── tomcat-users.xsd
└── web.xml
0 directories, 10 files
启动程序
[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
# 查看服务是否启动成功
# 查看进程
[root@localhost tomcat]# ps -ef | grep java
root 6752 1 3 14:51 pts/0 00:00:05 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 6928 1445 0 14:53 pts/0 00:00:00 grep --color=auto java
# 可查看端口8080是否开启
[root@localhost tomcat]# netstat -lnupt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 6752/java
浏览器使用IP加端口即可访问默认主页
启动脚本
[root@localhost tomcat]# vi /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 保存后测试
[root@localhost tomcat]# systemctl daemon-reload
[root@localhost tomcat]# /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@localhost tomcat]# ps -ef | grep java
root 7740 1445 0 15:07 pts/0 00:00:00 grep --color=auto java
[root@localhost tomcat]# systemctl start tomcat
[root@localhost tomcat]# ps -ef | grep java
root 7769 1 99 15:07 ? 00:00:02 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 7786 1445 0 15:07 pts/0 00:00:00 grep --color=auto java
[root@localhost tomcat]# systemctl stop tomcat
[root@localhost tomcat]# ps -ef | grep java
root 7846 1445 0 15:08 pts/0 00:00:00 grep --color=auto java
Tomcat日志–解决启动慢
发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session ID是通过SHA1算法计算得到的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥。
查看是否有足够的熵来用于产生随机数
[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail
282
推荐解决方法:
yum install rng-tools -y # 安装rngd服务(熵服务,增大熵池)
systemctl start rngd # 启动服务
systemctl enable rngd # 开机自启
[root@localhost~]# systemctl enable --now rngd
[root@localhost~]# cat /proc/sys/kernel/random/entropy_avail
2980
注意:不要在生产环境使用 ! ! !
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户。
报403错误,无法使用
1、配置tomcat-users.xml文件
[root@localhost conf]# vim /usr/local/tomcat/conf/tomcat-users.xml
"admin-gui"/>
"admin-script"/>
"manager-gui"/>
"manager-jmx"/>
"manager-script"/>
"manager-status"/>
"tomcat" password="tomcat" roles="admin-gui,manager-gui,managerjmx,manager-script,manager-status,admin-script"/>
</tomcat-users> #前面加上以上几行,注意,此句在文本末尾,且不要添加到注释里面去。
注意:不要在生产环境使用 ! ! !
2、允许访问Manager App
[root@localhost ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
"org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
allow="^.*"/>#修改网段范围
3、允许访问Host Manager
[root@localhost ~]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
"org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
allow="^.*"/>#修改网段范围
修改完成后,重启tomcat;
登录即可(用户名密码都为tomcat)
注意:不要在生产环境使用 ! ! !
server.xml组件类别:
顶级组件:位于整个配置的顶层,如server。
容器类组件:可以包含其它组件的组件,如service、engine、host、context。
连接器组件:连接用户请求至tomcat,如connector。
被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。
server.xml组件介绍:
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连接至数据库中查找认证用户。
Connector主要参数说明:
参数 | 参数说明 |
---|---|
connector | 接收用户请求,类似于httpd的listen配置监听端口. |
port | 指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。 |
address | 指定连接器监听的地址,默认为所有地址(即0.0.0.0) |
protocol | 连接器使用的协议,支持HTTP和A JP。A JP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用A JP协议)。 |
minProcessors | 服务器启动时创建的处理请求的线程数 |
maxProcessors | 最大可以创建的处理请求的线程数 |
enableLookups | 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 |
redirectPort | 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 |
acceptCount | 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 |
connectionTimeout | 指定超时的时间数(以毫秒为单位) |
host参数说明:
参数 | 参数说明 |
---|---|
host | 表示一个虚拟主机 |
name | 指定主机名 |
appBase | 应用程序基本目录,即存放应用程序的目录.一般为appBase=“webapps” ,相对于CATALINA_HOME而言的,也可以写绝对路径。 |
unpackWARs | 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 |
autoDeploy | 在tomcat启动时,是否自动部署。 |
xmlValidation | 是否启动xml的校验功能,一般xmlValidation=“false”。 |
xmlNamespaceAware | 检测名称空间,一般xmlNamespaceAware=“false”。 |
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的情况下改变应用程序 |
通过两种方式,第一种方式是直接将程序目录放在webapps目录下面
第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。
部署开源站点jpress
下载地址:https://github.com/JpressProjects/jpress
# 安装配置数据库
[root@bbs ~]# yum install mariadb-server -y
[root@bbs ~]# systemctl enable --now mariadb
[root@bbs ~]# mysql
MariaDB [(none)]> create database jpress default character set utf8;
MariaDB [(none)]> grant all on jpress.* to jpress@'localhost' identified by '123456';
接下来下载好war包后直接放在指定目录下即可,会自动解压
[root@bbs ~]# mv jpress-web-newest.war /usr/local/tomcat/webapps/
[root@bbs ~]# cd /usr/local/tomcat/webapps
[root@bbs webapps]# ll
total 20316
drwxr-x--- 15 root root 4096 Dec 26 10:27 docs
drwxr-x--- 7 root root 99 Dec 26 10:27 examples
drwxr-x--- 6 root root 79 Dec 26 10:27 host-manager
drwxr-x--- 7 root root 102 Dec 26 14:35 jpress-web-newest
-rw-r--r-- 1 root root 20797013 Oct 10 12:52 jpress-web-newest.war
drwxr-x--- 6 root root 114 Dec 26 10:27 manager
drwxr-x--- 3 root root 223 Dec 26 10:27 ROOT
浏览器访问 http://IP:8080/jpress-web-newest/install
安装完毕之后,重启tomcat即可访问
访问后台:http://IP:8080/jpress-web-newest/admin/login
需修改server.xml文件
[root@localhost ~]# cd /usr/local/tomcat/conf/
# 备份
[root@localhost conf]# cp server.xml{,.bak}
[root@localhost conf]# vim server.xml
# 添加内容示例
"www.a.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/web/a" path="" reloadable="flase" />
"org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
"www.b.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/web/b" path="" reloadable="flase" />
"org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
虚拟主机目录与文件准备
[root@bbs conf]# mkdir -p /web/{a,b}
[root@bbs conf]# vim /web/a/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP a page</title>
</head>
<% out.println("Welocome to test site,http://www.a.com");%>
</body>
</html>
[root@bbs conf]# cp /web/a/index.jsp /web/b/
[root@bbs conf]# vim /web/b/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
JSP a page</title>
</head>
<% out.println("Welocome to test site,http://www.b.com");%>
</body>
</html>
[root@bbs conf]# systemctl restart tomcat
客户端hosts文件添加dns解析
(注:windows下hosts文件目录为C:\Windows\System32\drivers\etc\hosts)
tomcat_IP www.a.com www.b.com
测试:
使用域名:8080,即可访问
虽然tomcat已经有了这些服务,但常引入 Apache 或者其他的一些专门的HTTP 服务器原因有下面几个:
这是最常见的方式。JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK本身提供了一个监控以及管理的页面jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置。
编译生成mod_jk模块
在apache中加载mod_jk并对其进行配置
在tomcat中修改配置以使其能接受mod_jk的转发
编译生成mod_jk.so
[root@bbs ~]# wget -c https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz --no-check-certificate
[root@bbs ~]# tar xf tomcat-connectors-1.2.48-src.tar.gz -C /usr/local/src/
[root@bbs ~]# cd /usr/local/src/tomcat-connectors-1.2.48-src/native/
[root@bbs native]# yum install httpd-devel -y
[root@bbs native]# yum install gcc gcc-c++ make -y
[root@bbs native]# ./configure --with-apxs
[root@bbs native]# make && make install
# 查看是否编译成功
[root@bbs ~]# find / -name mod_jk.so
/usr/lib64/httpd/modules/mod_jk.so
/usr/local/src/tomcat-connectors-1.2.48-src/native/apache-2.0/.libs/mod_jk.so
/usr/local/src/tomcat-connectors-1.2.48-src/native/apache-2.0/mod_jk.so
创建测试页面
# 静态页面
[root@bbs ~]# vim /var/www/html/index.html
static_page_from_apache</h1>
[root@bbs ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
dynamic_page_from_tomcat</h1>
[root@bbs ~]# systemctl restart httpd
通过浏览器访问IP可得到静态测试界面,IP:8080/test.jsp可查看到动态测试页面
当然用域名访问也是一样的
配置jk模块
# 官方模板文件位置
[root@bbs ~]# cd /usr/local/src/tomcat-connectors-1.2.48-src/conf/
[root@bbs conf]# ll
total 20
-rw-r--r-- 1 root bin 4924 Feb 21 2020 httpd-jk.conf
-rw-r--r-- 1 root bin 1461 Feb 21 2020 uriworkermap.properties
-rw-r--r-- 1 root bin 5963 Feb 21 2020 workers.properties
JK 的配置最关键的三个文件,分别是
httpd.conf:Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息
workers.properties:到 Tomcat 服务器的连接定义文件
uriworkermap.properties:URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。
# 创建相关的配置文件
[root@bbs conf]# vim /etc/httpd/conf.d/mod_jk.conf
#JkWorkersFile 路径根据实际情况填写
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
#根据实际情况自己定义即可,就是将什么样的请求转发给worker1处理
#JkMount /* worker1
JkMount /*.jsp worker1
JkMount /servlet/* worker1
JkMount /*.do worker1
JkMount /*.action worker1
#JkMount /*.class worker1
#JkMount /*.jar worker1
JkMount /jkstatus status
[root@bbs conf]# vim /etc/httpd/conf/workers.properties
#路径根据实际情况修改
workers.tomcat_home=/usr/local/tomcat/
workers.java_home=/usr/java/jdk1.8.0_144
worker.list=worker1
# Set properties for worker1 下面的都可以不用修改,感兴趣可以搜索相关含义
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
#worker.worker1.cachesize=10
#worker.worker1.cache_timeout=600
#worker.worker1.socket_keepalive=1
#worker.worker1.socket_timeout=300
worker.list = status
worker.status.type=status
注意,8009端口默认关闭,需手动打开
[root@bbs conf]# netstat -lnupt | grep 8009
[root@bbs conf]# cd /usr/local/tomcat/conf
[root@bbs conf]# vim server.xml
# /8009 搜索端口,删除注释即可
tomcat8.5.84版本经测试失败 -_-
回退到8.5.20版本测试成功
8.5.20版本默认8009端口打开,无需更改
无需加端口即可直接访问
JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到tomcat 的连接进行设置,如下图所示:
至此,tomcat的一些基本内容就大致了解完毕了
tomcat从安装到基本的了解和使用,以及web站点的配置部署等。
(本文为作者简单学习笔记,若有错误之处,感谢大佬指正!)