企业级web应用服务器--Tomcat(三)
一、常见配置详解
1、端口8005/tcp安全配置管理
在conf/server.xml有以下内容
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
<Server port="8005" shutdown="SHUTDOWN">
8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。
此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成 0, 会使用随机端口,如:36913
port设为-1等无效端口,将关闭此功能
此行不能被注释,否则无法启动tomcat服务
范例:
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">
范例:修改8005/tcp端口管理命令
[root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port
LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
LISTEN 0 100 *:8080
*:*
LISTEN 0 128 [::]:22
[::]:* LISTEN 0 1
[::ffff:127.0.0.1]:8005 *:* LISTEN 0
100 *:8009
*:*
[root@centos8 ~]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN #执行命令关闭tomcat
Connection closed by foreign host.
[root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port
LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
LISTEN 0 128 [::]:22
[::]:*
[root@centos8 tomcat]#vim conf/server.xml
<Server port="8005" shutdown="syk">
[root@centos8 tomcat]#systemctl start tomcat
[root@centos8 tomcat]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[root@centos8 tomcat]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port
LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
LISTEN 0 100 *:8080
*:*
LISTEN 0 128 [::]:22
[::]:*
LISTEN 0 1 [::ffff:127.0.0.1]:8005
*:*
LISTEN 0 100 *:8009
*:*
[root@centos8 tomcat]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
syk
Connection closed by foreign host.
[root@centos8 tomcat]#ss -ntl
State Recv-Q Send-Q Local Address:Port
Peer Address:Port
LISTEN 0 128 0.0.0.0:22
0.0.0.0:*
LISTEN 0 128 [::]:22
[::]:*
[root@centos8 tomcat]#
2、显示指定的http服务器版本信息
默认不显示tomcat的http的Server头信息, 可以指定tomcat的http的Server头信息为相应的值
#conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" Server="SOME STRING"/>
范例:
[root@centos8 ~]#curl -I 127.0.0.1:8080
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 17 Jul 2020 08:32:52 GMT
#修改配置,指定想显示的tomcat版本
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" Server="WangServer"/>
......
[root@centos8 ~]#systemctl restart tomcat
[root@centos8 ~]#curl 127.0.0.1:8080 -I
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 17 Jul 2020 08:34:17 GMT
Server: WangServer
3、其它配置
conf/server.xml中可以配置service,connector, Engine,Host等
(1)service配置
一般情况下,一个Server实例配置一个Service,name属性相当于该Service的ID。
<Service name="Catalina">
(2)连接器配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差
(3)引擎配置
<Engine name="Catalina" defaultHost="localhost">
(4)defaultHost 配置
defaultHost指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy
4、多虚拟主机配置
1)多虚拟主机配置说明
name 必须是主机名,用主机名来匹配
appBase 当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径
unpackWARs 是否自动解压war格式
autoDeploy 热部署,自动加载并运行应用
(1)虚拟主机配置过程
再添加和配置一个新的虚拟主机,并将myapp部署到/data/webapps目录下
vim conf/server.xml
#在文件最后面增加下面内容
<Host name="web1.syk.top" appBase="/data/webapps/" unpackWARs="True"
autoDeploy="false">
#虚拟主机专有访问日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web1_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s
%b" />
</Host>
#以下行是自带的不需要修改
</Engine>
</Service>
</Server>
#或者如果不加日志也可以用下面简化写法
<Host name="web1.syk.top" appBase="/data/webapps/" unpackWARs="True"
autoDeploy="false"/>
(2)准备虚拟主机的数据目录
常见虚拟主机根目录
# mkdir /data/webapps/ROOT -pv
# chown -R tomcat.tomcat /data/webapps
# echo web1.syk.top > /data/webapps/ROOT/index.html
(3)测试
刚才在虚拟主机中主机名定义node1.syk.top,所以需要主机在本机手动配置一个域名解析。如果是windows,修改在C:\Windows\System32\drivers\etc下的hosts文件,需要管理员权限。
使用http://web1.syk.top:8080/访问查看
2)案例:tomcat实现多虚拟主机
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#vim conf/server.xml
[root@centos8 tomcat]#tail conf/server.xml
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#添加了以下四行
<Host name="node1.syk.top" appBase="/data/webapps1">
</Host>
<Host name="node2.syk.top" appBase="/data/webapps2">
</Host>
</Engine>
</Service>
</Server>
#对每个虚拟主机,准备数据
[root@centos8 ~]#mkdir /data/webapps{1,2}/ROOT -pv
mkdir: created directory '/data/webapps1/ROOT'
mkdir: created directory '/data/webapps2/ROOT'
[root@centos8 ~]#cat /data/webapps1/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]#cat /data/webapps2/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]#
#设置权限
[root@centos8 ~]#chown -R tomcat.tomcat /data/webapps{1,2}/
#准备虚拟主机的名称解析
[root@centos8 ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
centos8.localdomain
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.8 node1.syk.top node2.syk.top
[root@centos8 ~]#curl http://node1.syk.top:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node1.syk.top:8080/
</body>
</html>
[root@centos8 ~]#curl http://node2.syk.top:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node2.syk.top:8080/
</body>
</html>
5、基于web方式的Host Manager虚拟主机管理
可以通过tomcat的管理页面点下面Host Manager按钮进入管理虚拟主机的页面
![](https://img2022.cnblogs.com/blog/2225806/202205/2225806-20220518170328453-1792220637.png)
默认Host Manager 管理页被禁用,会出现下面提示,解决方法类似于3.4.4.6
![](https://img2022.cnblogs.com/blog/2225806/202205/2225806-20220518170426302-1778268765.png)
1) 允许本机访问
配置如下
[root@centos8 tomcat]#vim conf/tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/> #3.4.4.6添加的内容
<role rolename="admin-gui" /> #添加新的role
<user username="admin" password="123456" roles="manager-gui,admin-gui"/> #再
加新role
</tomcat-users>
[root@centos8 tomcat]#systemctl restart tomcat
重启Tomcat后,点击"Host Manager"按钮
![](https://img2022.cnblogs.com/blog/2225806/202205/2225806-20220518170733347-53822767.png)
2)允许远程主机访问
但通过远程访问地址仍无法访问Host Manager管理页面
默认无法通过网络远程访问Host Manager管理页面,默认会出现以下界面
![](https://img2022.cnblogs.com/blog/2225806/202205/2225806-20220518171048437-64461702.png)
[root@centos8 tomcat]#vim webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apach
e\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.
(?:Linked)?HashMap"/>
</Context>
无需重启服务,直接访问,输入前面的用户和密码,即可登录成功
3)创建新的虚拟主机
可以管理虚拟主机
#创建虚拟主机前,必须先创建相关目录,否则创建虚拟机不成功
[root@centos8 ~]#mkdir /data/node1/ROOT/
[root@centos8 ~]#echo node1.syk.top > /data/node1/ROOT/index.html
[root@centos8 ~]#chown -R tomcat.tomcat /data/node1/
![](https://img2022.cnblogs.com/blog/2225806/202205/2225806-20220518171507709-1955274081.png)
6、Context 配置
1)Centext 配置方式
Context作用:
路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
应用独立配置,例如单独配置应用日志、单独配置应用访问控制
#路径映射
<Context path="/test" docBase="/data/test" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
说明:
path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先更高
docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用。
Centext实现过程
将~/projects/myapp/下面的项目文件复制到/data/下,可以修改一下index.jsp 区别一下
# cp -r ~/projects/myapp /data/myapp-v1
# vim /data/myappv1/index.jsp
# cd /data
# ln -sv myapp-v1 test
注意:这里特别使用了软链接,原因方便后期版升级或回滚,如是是版本升级,需要将软链接指向myappv2,重新启动。如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就
可以实现回滚。
修改conf/server.xml设置context
Tomcat的配置文件server.xml中修改如下,重启Tomcat生效
<Host name="node1.syk.top" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true" >
<Context path="/test" docBase="/data/test" reloadable="true" />
</Host>
测试
使用http://node1.syk.top:8080/test/
7、Valve组件
valve(阀门)组件可以定义日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
示例:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>
范例:虚拟主机上利用context实现虚拟目录
#在前面范例的基础上实现,继续创建node1.syk.top虚拟主机下的物理子目录
[root@centos8 ~]#mkdir /data/webapps1/app1/
[root@centos8 ~]#echo /data/webapps1/app1/index.html >
/data/webapps1/app1/index.html
[root@centos8 ~]#curl http://node1.syk.top:8080/app1/
/data/webapps1/app1/index.html
#利用context实现node1.syk.top虚拟主机下的虚拟子目录
[root@centos8 tomcat]#vim conf/server.xml
[root@centos8 tomcat]#tail conf/server.xml
</Host>
<Host name="node1.syk.top" appBase="/data/webapps1">
#加下面六行
<Context path="/app1" docBase="/data/app1" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="node1.syk.top_app1" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.7"/>
</Context>
</Host>
<Host name="node2.syk.top" appBase="/data/webapps2">
</Host>
</Engine>
</Service>
</Server>
[root@centos8 tomcat]#systemctl restart tomcat
#因数据没有准备好,出现下面错误
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
curl: (7) Failed to connect to node1.syk.top port 8080: Connection refused
#准备数据目录
[root@centos8 tomcat]#mkdir /data/app1-v1
[root@centos8 tomcat]#echo /data/app1-v1/index.html > /data/app1-v1/index.html
[root@centos8 tomcat]#ln -s /data/app1-v1/ /data/app1
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
curl: (7) Failed to connect to node1.syk.top port 8080: Connection refused
#数据目录准备好,还需要重新启动服务,才能访问
[root@centos8 tomcat]#systemctl restart tomcat
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
/data/app1-v1/index.html
[root@centos7 ~]#curl -I http://node1.syk.top:8080/app1/
HTTP/1.1 403
Content-Type: text/html;charset=utf-8
Content-Language: en
Transfer-Encoding: chunked
Date: Tue, 14 Jul 2020 06:48:54 GMT
#可以看到此目录单独的访问日志
[root@centos8 ~]#cat /usr/local/tomcat/logs/node1.syk.top_app1.2020-07-14.log
10.0.0.8 - - [14/Jul/2020:14:36:01 +0800] "GET /app1/ HTTP/1.1" 200 330
10.0.0.7 - - [14/Jul/2020:14:48:07 +0800] "GET /app1/ HTTP/1.1" 403 618
范例: 基于前面环境,实现软件升级和回滚功能
#升级版本
[root@centos8 tomcat]#mkdir /data/app1-v2
[root@centos8 tomcat]#echo /data/app1-v2/index.html > /data/app1-v2/index.html
[root@centos8 tomcat]#rm -f /data/app1
#删除软链接,仍然可以访问旧版本
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
/data/app1-v1/index.html
#重新服务后,出现错误
[root@centos8 tomcat]#systemctl restart tomcat
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
curl: (7) Failed to connect to node1.syk.top port 8080: Connection refused
#新建软链接,指向新版,仍需重启服务才生效
[root@centos8 tomcat]#ln -s /data/app1-v2/ /data/app1
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
curl: (7) Failed to connect to node1.syk.top port 8080: Connection refused
[root@centos8 tomcat]#systemctl restart tomcat
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
/data/app1-v2/index.html
#软件降级或回滚
[root@centos8 tomcat]#rm -f /data/app1
[root@centos8 tomcat]#ln -s /data/app1-v1/ /data/app1
[root@centos8 tomcat]#systemctl restart tomcat
[root@centos8 tomcat]#curl http://node1.syk.top:8080/app1/
/data/app1-v1/index.html