Java应用服务Tomcat实战指南
一、Tomcat简介
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
目前Tomcat最新版本为9.0.7。Java容器还有resin、weblogic(收费的)等。
二、Tomcat安装
2.1、软件准备
Java能在所有系统上跑依赖的就是JDK
JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html
Tomcat下载:http://tomcat.apache.org/
man 中文软件包下载:https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/
因为jdk和Tomcat的版本对运维来说没什么区别,提供本文使用的软件下载地址:
==链接: https://pan.baidu.com/s/1o7UyOGE 密码: ih33==
2.2、部署java环境
下载到本地然后上传到Linux服务器上
# 上传man中文软件包 MacBookPro:~ mac$ scp ~/Desktop/manpages-zh-1.5.1.tar.gz root@10.0.0.3:/tmp/ root@10.0.0.3's password: manpages-zh-1.5.1.tar.gz 100% 1919KB 112.4MB/s 00:00 100% 338MB 151.8MB/s 00:02 # 上传JDK MacBookPro:~ mac$ scp ~/Desktop/jdk-10_linux-x64_bin.tar.gz root@10.0.0.3:/tmp/ root@10.0.0.3's password: jdk-10_linux-x64_bin.tar.gz
Linux上操作
[root@CloudBility tmp]# mkdir -p /application/tools/ [root@CloudBility tmp]# mv /tmp/jdk-10_linux-x64_bin.tar.gz /application/tools/ [root@CloudBility tmp]# mv /tmp/manpages-zh-1.5.1.tar.gz /application/tools/ [root@CloudBility tools]# tar xf jdk-10_linux-x64_bin.tar.gz -C /application/ [root@CloudBility tools]# ln -s /application/jdk-10/ /application/jdk [root@CloudBility tools]# sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile #sed -i.ori '$a' -i.ori 表示修改文件前备份一个以ori结尾的,$a表示在最后一行追加 \n表示换行 [root@CloudBility tools]# source /etc/profile #→出现下面结果证明部署成功 [root@CloudBility tools]# java -version java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
2.3、安装Tomcat目录
默认端口8080
# 上传Tomcat MacBookPro:~ mac$ scp ~/Desktop/apache-tomcat-9.0.7.tar.gz root@10.0.0.3:/application/tools/ root@10.0.0.3's password: apache-tomcat-9.0.7.tar.gz 100% 9295KB 155.2MB/s 00:00 [root@CloudBility ~]# cd /application/tools/ [root@CloudBility tools]# tar xf apache-tomcat-9.0.7.tar.gz -C /application/ [root@CloudBility tools]# ln -s /application/apache-tomcat-9.0.7/ /application/tomcat [root@CloudBility tools]# echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile [root@CloudBility tools]# source /etc/profile [root@CloudBility tools]# chown -R root.root /application/jdk/ /application/tomcat/ [root@CloudBility tools]# tail -4 /etc/profile export JAVA_HOME=/application/jdk #定义了java的家目录 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH #定义了java的环境变量 export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar #定义了Java的CLASSPATH环境变量,CLASSPATH和PATH变量不同,CLASSPATH环境变量的作用是指定的Java类所在的目录(或许它的意思就是PATH of Class)。 export TOMCAT_HOME=/application/tomcat #定义了Tomcat的家目录
tomcat 目录结构
[root@CloudBility tools]# cd /application/tomcat/ [root@CloudBility tomcat]# tree -L 1 . ├── bin # 用以启动、关闭Tomcat或者其它功能的脚本(.bat文件(bat是批处理文件,在windows和linux上都可以使用.)和.sh文件) ├── conf # 用以配置Tomcat的XML及DTD文件 ├── lib # (库文件)存放web应用能访问的JAR包 ├── LICENSE # 公告 ├── logs # Catalina和其它Web应用程序的日志文件 ├── NOTICE # 通知 ├── RELEASE-NOTES # 发行说明 ├── RUNNING.txt # 运行说明 ├── temp # 临时文件 ├── webapps # Web应用程序根目录(类似我们nginx的html目录的功能或httpd的) └── work # 用以产生有JSP编译出的Servlet的.java和.class文件 [root@CloudBility tomcat]# cd webapps/ [root@CloudBility webapps]# ll 总用量 20 drwxr-x---. 14 root root 4096 4月 17 07:50 docs # 帮助文档 drwxr-x---. 6 root root 4096 4月 17 07:50 examples # web应用实例 drwxr-x---. 5 root root 4096 4月 17 07:50 host-manager # 主机管理 drwxr-x---. 5 root root 4096 4月 17 07:50 manager # 管理 drwxr-x---. 3 root root 4096 4月 17 07:50 ROOT # 默认网站根目录
2.4、启动Tomcat
# 启动程序/application/tomcat/bin/startup.sh # 关闭程序/application/tomcat/bin/shutdown.sh # 启动 [root@CloudBility webapps]# /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. # 查看Java进程 [root@CloudBility webapps]# ps -ef|grep java|grep -v grep root 1844 1 7 07:57 pts/0 00:00:04 /application/jdk/bin/java -Djava.util.logging.config.file=/application/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 /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start # 查看Java端口 [root@CloudBility webapps]# netstat -lntup|grep java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1844/java tcp 0 0 :::8009 :::* LISTEN 1844/java tcp 0 0 :::8080 :::* LISTEN 1844/java
本地浏览器查看
http://10.0.0.3:8080
站点目录下的程序都在ROOT文档中,我们的首页就是index.jsp java写的一个网页文件。 [root@CloudBility webapps]# cd ROOT/ [root@CloudBility ROOT]# ls asf-logo-wide.svg bg-nav.png index.jsp tomcat.gif tomcat.svg bg-button.png bg-upper.png RELEASE-NOTES.txt tomcat.png WEB-INF bg-middle.png favicon.ico tomcat.css tomcat-power.gif
http://10.0.0.3:8080/docs/ #就是我们wedapps目录下的docs目录
http://10.0.0.3:8080/examples/ #就是我们wedapps目录下的examples目录
2.5、关闭Tomcat
[root@CloudBility webapps]# /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 NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED [root@CloudBility webapps]# !ps ps -ef|grep java|grep -v grep [root@CloudBility webapps]# !n netstat -lntup|grep java
2.6、Tomcat日志
[root@CloudBility webapps]# cd /application/tomcat/logs/ [root@CloudBility logs]# ls catalina.2018-04-17.log host-manager.2018-04-17.log localhost_access_log.2018-04-17.txt catalina.out localhost.2018-04-17.log manager.2018-04-17.log # Tomcat实时日志 [root@CloudBility logs]# tailf catalina.out
这里需要留意catalina.out 的大小,我在工作中都会做日志切割。如果文件太大,一定要要选择清空文件而不是删除文件,删除文件是需要重启才生效的,因为日志是保存在内存中的。
2.7、Tomcat配置文件
[root@CloudBility logs]# cd /application/tomcat/conf/ [root@CloudBility conf]# ll 总用量 228 drwxr-x---. 3 root root 4096 4月 17 07:57 Catalina -rw-------. 1 root root 13531 4月 4 03:56 catalina.policy -rw-------. 1 root root 7202 4月 4 03:56 catalina.properties -rw-------. 1 root root 1400 4月 4 03:56 context.xml -rw-------. 1 root root 1149 4月 4 03:56 jaspic-providers.xml -rw-------. 1 root root 2313 4月 4 03:56 jaspic-providers.xsd -rw-------. 1 root root 3850 4月 4 03:56 logging.properties -rw-------. 1 root root 7511 4月 4 03:56 server.xml # 主配置文件 -rw-------. 1 root root 2164 4月 4 03:56 tomcat-users.xml # Tomcat管理用户配置文件 -rw-------. 1 root root 2633 4月 4 03:56 tomcat-users.xsd -rw-------. 1 root root 170202 4月 4 03:56 web.xml
2.8、Tomcat 安全管理
测试功能,生产环境不要用。
http://10.0.0.7:8080/
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。
[root@CloudBility conf]# vim tomcat-users.xml # 新增如下三行配置 [root@CloudBility conf]# tail -4 tomcat-users.xml <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> </tomcat-users> #重启服务器 /application/tomcat/bin/shutdown.sh /application/tomcat/bin/startup.sh
为了安全,我们都会把docs examples host-manager manager 目录全部删除,ROOT目录删除一下所有目录文件,但是保留ROOT目录。这是为了最安全的。
[root@CloudBility conf]# cd /application/tomcat/webapps/ [root@CloudBility webapps]# rm docs/ examples/ host-manager/ manager/ -fr [root@CloudBility ROOT]# rm /application/tomcat/webapps/ROOT/* -fr [root@CloudBility ROOT]# tree -L 1 /application/tomcat/webapps/ /application/tomcat/webapps/ └── ROOT
2.9、server.xml组件类别详解
[root@CloudBility conf]# cd /application/tomcat/conf/ # 查看配置文件 [root@CloudBility conf]# vim server.xml #<Server port="8005" shutdown="SHUTDOWN"> #来自 server.xml配置文件,字符可以自定义 发送shuntdown后面的字符串SHUTDOWN到8005端口即可关闭tomcat。 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 这个是用来跟httpd交流的,AJP是他们之间的协议。 # 测试:可以看到目前的Java应用是开启的 [root@CloudBility conf]# netstat -lntup|grep java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 2134/java tcp 0 0 :::8009 :::* LISTEN 2134/java tcp 0 0 :::8080 :::* LISTEN 2134/java # telnet 测试发送 SHUTDOWN [root@web02 conf]# telnet 127.0.0.1 8005 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. SHUTDOWN # 输入SHUTDOWN之后就关闭了 Connection closed by foreign host. [root@CloudBility conf]# netstat -lntup|grep java #可以看到已经关闭了
2.10、server.xml组件类别详解
顶级组件:位于整个配置的顶层,如server。 容器类组件:可以包含其它组件的组件,如service、engine、host、context。 连接器组件:连接用户请求至tomcat,如connector。 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。 <!-- 这两个符号中间的都是注释文本 -->
配置文件详解
<?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:接收用户请求,类似于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指定超时的时间数(以毫秒为单位) --> <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表示一个虚拟主机 name指定主机名 appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。 unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 autoDeploy:在tomcat启动时,是否自动部署。 xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。 xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 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的情况下改变应用程序 --> <Context path="" docBase="" debug=""/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>