二:Tomcat 配置基础(单机 Tomcat 相关配置)
实际中基本不会用到 standalone 的模式,因为用户不会直接访问 Tomcat,而是访问负载均衡,再由 Nginx 等负载均衡应用来转发需要 tomcat 处理的动态请求,再由负载均衡转发 tomcat 响应给客户端;
该文档旨在了解和熟悉各功能的实现方式;
2.1:部署一个应用
2.1.1:创建 test 应用
- 创建工程目录:
[root@node105 ~]# mkdir /projects/testapp -pv
mkdir: created directory ‘/projects’
mkdir: created directory ‘/projects/testapp’
- 编辑 testapp 的欢迎页 index.jsp:
[root@node105 ~]# vim /projects/testapp/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>testapp</title>
</head>
<body>
<%
out.println("Welcome to testapp");
%>
<br>
<%=request.getRequestURL()%>
</body>
</html>
2.1.2:部署 test 应用
- 将 test 应用拷贝到 webapps:
[root@node105 ~]# cp /projects/testapp /usr/local/tomcat/webapps/ -r
2.1.3:访问 test 应用
- 浏览器访问 testapp 欢迎页:http://192.168.1.105:8080/testapp/
2.2:Tomcat 欢迎页
2.2.1:测试欢迎页加载顺序
- 配置 con/web.xml 中的 welcome-file-list,将其加载顺序设置为:index.html -> index.htm > index.jsp(默认就是此顺序);
- webapps/ROOT 中添加 index.html,访问主页,查看是否访问的是 index.html;
- 查看 conf/web.xml 的欢迎页全局配置:
[root@node105 tomcat]# vim conf/web.xml
……
<web-app>
……
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 新增 index.html:
[root@node105 tomcat]# vim webapps/ROOT/index.html
<h1> Welcom Page (index.html) </h1>
- 访问测试:
2.2.2:测试 web.xml 的专有覆盖全局
webapp 的专有 web.xml 会覆盖 conf/web.xml 中的全局配置;
-
配置 webapp 的专有 web.xml:
设置欢迎页加载顺序为:index.jsp -> index.htm -> index.html;
[root@node105 tomcat]# vim webapps/ROOT/WEB-INF/web.xml
……
<web-app>
……
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
- 重新访问:
2.2.3:为 testapp 添加专有的 web.xml
- 为 testapp 添加 index.html 欢迎页:
[root@node105 ~]# cd /usr/local/tomcat/
[root@node105 tomcat]# vim webapps/testapp/index.html
<h1> Welcom testapp index.html </h1>
-
访问测试:
testapp 默认会调用全局配置;
- 为 testapp 创建自己专用的 web.xml:
[root@node105 tomcat]# mkdir webapps/testapp/WEB-INF
[root@node105 tomcat]# cp webapps/ROOT/WEB-INF/web.xml webapps/testapp/WEB-INF
-
再次访问 testapp 欢迎页:
此次调用自己专有的 web.xml;
2.3:shutdown 安全加固
2.3.1:默认 shutdown 配置的安全隐患
- 默认配置:
[root@node105 tomcat]# vim conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
- 查看 8005 的监听地址:
[root@node105 tomcat]# ss -tnl | grep 8005
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
-
Telnet 本机的 8005 端口,传送 SHUTDOWN 指令:
发送 SHUTDOWN 后会直接关闭 Tomcat 进程实例;
[root@node105 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@node105 tomcat]# ps -ef | grep tomcat | grep -v grep
[root@node105 tomcat]#
所以在实际应用中,要将管理端口更改为其它端口,或设置 shutdown 指令为随机字符串;
2.3.2:设置 shutdown 为随机字符串
-
生成随机字符串:
生成 /etc/issue 的 md5 值;
[root@node105 tomcat]# md5sum /etc/issue
f078fe086dfc22f64b5dca2e1b95de2c /etc/issue
- 配置 server.xml
[root@node105 tomcat]# vim conf/server.xml
<Server port="8005" shutdown="f078fe086dfc22f64b5dca2e1b95de2c">
- 启动 Tomcat
[root@node105 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/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
-
再次 telnet 并发送 SHUTDOWN:
无法关闭 Tomcat 进程;
[root@node105 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@node105 tomcat]# ps -ef | grep tomcat | grep -v grep
root 8116 1 1 15:58 pts/0 00:00:03 /usr/java/default/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@node105 tomcat]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
f078fe086dfc22f64b5dca2e1b95de2c
Connection closed by foreign host.
[root@node105 tomcat]#
[root@node105 tomcat]#
[root@node105 tomcat]# ps -ef | grep tomcat | grep -v grep
[root@node105 tomcat]#
修改 shutdown= 为随机字符串后,启动Tomcat时,8005和8009端口启动很慢,解决办法:
[root@node105 tomcat]# vim /usr/java/default/jre/lib/security/java.security securerandom.source=file:/dev/urandom
2.4:Tomcat 管理功能配置
在 Tomcat 的 index.jsp 欢迎页中有三个超链接,分别为:
- Server Status:实例状态信息;
- Manager App;该 Tomcat 下的各 webapp 管理;
- Host Manager;虚拟主机管理;
默认配置下是不能访问的,需要添加拥有 manager-gui 和 admin-gui 角色的相应用户;
2.4.1:GlobalNamingResources
用户和角色是在 conf/tomcat-users.xml 中定义的,而调用此配置文件的相关配置是在 server.xml 中的 GlobalNamingResources 配置断种定义的。
- 配置示例:
<Server port="8005" shutdown="SHUTDOWN"> …… <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <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> </Server>
2.4.2:查看管理页面的报错与提示信息
- “Server Status”:
- “Manager App”:
- “Host Manager”:
- 由提示信息得知:
“Server Status” 和 “Manager App” 页面需要拥有 manager-gui 角色权限的用户才能访问;
“Host Manager” 页面需要拥有 admin-gui 角色权限的用户才能访问;
2.4.3:配置管理角色与用户
- 编辑 conf/tomcat-users.xm,添加 manager-gui 和 admin-gui 角色,并将这两个角色赋予管理用户:
[root@node105 tomcat]# vim conf/tomcat-users.xml
……
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="jerome" password="jerome" roles="manager-gui,admin-gui"/>
</tomcat-users>
-
编辑 webapps/manager/META-INF/context.xml,添加允许访问 manager 应用的 IP 地址:
经测试,manager 应用提供 “Server Status” 和 “Manager App” 页面;
添加 192.168.1 网段的 IP 地址允许访问;
[root@node105 tomcat]# vim webapps/manager/META-INF/context.xml
……
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.1\.\d+" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$
1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
-
编辑 webapps/host-manager/META-INF/context.xml,添加允许访问 host-manager 应用的 IP 地址:
host-manager 应用提供 “Host Manager” 页面;
[root@node105 tomcat]# vim webapps/host-manager/META-INF/context.xml
……
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.1\.\d+" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$
1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
2.4.4:访问管理页面
- “Server Status”:
- “Manager App”:
- “Host Manager”:
2.5:Host 虚拟主机配置
目前的 Tomcat 只有一个虚拟主机,即 localhost;
添加一个 Host,指定其应用目录为 /data/webapps,并将 Tomcat 的 sample.war 部署到其中;
2.5.1:创建应用目录并部署 sample.war
- 创建应用目录以及 ROOT:
[root@node105 ~]# mkdir -pv /data/webapps/ROOT
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/webapps’
mkdir: created directory ‘/data/webapps/ROOT’
- 部署 sample.war 到 /data/webapps/ROOT:
[root@node105 ~]# cd /data/webapps/ROOT
[root@node105 ROOT]# jar xf /root/sample.war
[root@node105 ROOT]# ll
total 8
-rw-r--r-- 1 root root 376 Jul 30 2007 hello.jsp
drwxr-xr-x 2 root root 23 Jul 30 2007 images
-rw-r--r-- 1 root root 636 Jul 30 2007 index.html
drwxr-xr-x 2 root root 24 Jul 30 2007 META-INF
drwxr-xr-x 4 root root 44 Jul 30 2007 WEB-INF
2.5.2:添加虚拟主机
添加一个名为 node105.yqc.com 的 Host;
- 编辑 conf/server.xml,添加 Host 配置:
[root@node105 tomcat]# vim conf/server.xml
……
</Host>
<Host name="node105.yqc.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true" />
……
- 重启 Tomcat:
[root@node105 tomcat]# su java -c "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/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@node105 tomcat]# su java -c "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/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
-
查看虚拟主机管理页面:
显示已添加成功;
2.5.3:访问 sample 应用
-
编辑客户端 PC 的 HOSTS 文件:
C:\Windows\System32\drivers\etc\HOSTS
192.168.1.105 node105.yqc.com
-
访问测试:
http://node105.yqc.com:8080/
2.6:Context 配置
为 node105.yqc.com 虚拟主机添加一个 testapp 应用,设置其路径为 /data/testapp;
P.S.
node105.yqc.com 的应用目录为 /data/webapps,如果不配置 Context,那么访问 http://node105.yqc.com:8080/testapp,就会到 /data/webapps/testapp 查找应用文件;
2.6.1:部署 testapp
-
拷贝 testapp 应用到 /data 下,并创建软链接:
使用软链接访问应用程序,可以更好地进行版本更新和回退;
[root@node105 ~]# cp -r /usr/local/tomcat/webapps/testapp/ /data/testapp_v1
[root@node105 ~]# ln -sv /data/testapp_v1/ /data/testapp
‘/data/testapp’ -> ‘/data/testapp_v1/’
[root@node105 ~]# ll /data
total 0
lrwxrwxrwx 1 root root 17 Dec 9 18:20 testapp -> /data/testapp_v1/
drwxr-xr-x 3 root root 53 Dec 9 18:20 testapp_v1
drwxr-xr-x 3 root root 17 Dec 9 17:44 webapps
2.6.2:添加 Context 配置
- 编辑 conf /server.xml,为 node105.yqc.com 添加 Context 配置:
[root@node105 tomcat]# vim conf/server.xml
……
<Host name="node105.yqc.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true" >
<Context path="/testapp" docBase="/data/testapp" reloadable="false" />
</Host>
……
- 重启 Tomcat:
[root@node105 tomcat]# su java -c "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/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@node105 tomcat]#
[root@node105 tomcat]# su java -c "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/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
2.6.3:访问 testapp
- 编辑 node105.yqc.com 的 testapp 欢迎页,以区分 localhost 的 testapp:
[root@node105 ~]# vim /data/testapp/index.html
<h1> Welcom node105-testapp index.html </h1>
- 浏览器访问 http://node105.yqc.com:8080/testapp/
这里是虚拟主机 node105.yqc.com 提供的 testapp 应用,不是之前的 localhost 虚拟主机提供的;
- localhost 的 testapp 应用: