Tomcat 的安装与运行
Tomcat:常用的基于java的web应用服务器
本课程中所有的Java代码最终都需要部署到Tomcat中运行
Tomcat的配置文件是XML的
互联网公司基本上服务端程序都是跑在类Unix平台
Tomcat:源代码为Java;为开源软件
安装:the Apache Software Foundation(Apache软件基金会)出品:制作开源软件的非盈利组织;
1. 依赖JDK(源代码为Java)
2. 下载: http://tomcat.apache.org/
编译好的二进制包 apache-tomcat-version.tar.gz
在目录下 tar xzvf filename
3. 配置环境变量 CATALINA_HOME
CATALINA是Tomcat的一个组件,该组件会调用用户的Java代码
(本机目录/Users/shenglin/Develop/apache-tomcat-8.5.9)
export CATALINA_HOME=directory // temporarily config
4. 验证安装是否成功
启动Tomcat
类Unix平台: $CATALINA_HOME/bin/startup.sh 或
$CATALINA_HOME/bin/catalina.sh start
使用chrome验证Tomcat是否安装成功
Tomcat的默认端口是8080
在chrome地址栏里输入127.0.0.1:8080 加载后显示的便是tomcat默认主界面
--> Tomcat安装成功
Tomcat的资源:
静态资源(HTML页面)
动态资源(通过代码生成页面 --> Servlet )
--> e.g.
background:饭馆网站(卖豆浆)
创建Soymilk.html
<html> <body> <h1>Soy Milk</h1> </body> </html>
创建 WEB-INF/classes 目录在该目录下创建com.netease包
functionality:卖面条
创建NoodleServlet.java
package com.netease; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class NoodleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); String vegetable = request.getParameter("vegetable"); if(vegetable == null) { vegetable = "Tomato"; } writer.println("<html><body>"); writer.println("<h1> Noodle with " + vegetable + "</h1>"); writer.println("</body></html>"); } }
在WEB-INF下创建配置文件web.xml
创建完成<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0"> <display-name>Restaurant</display-name> <servlet> <servlet-name>noodles</servlet-name> <servlet-class> com.netease.NoodleServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>noodles</servlet-name> <url-pattern>/noodles</url-pattern> </servlet-mapping> </web-app>
开始编译class NoodleServlet.java
javac -cp $CATALINA_HOME/lib/servlet-api.jar NoodleServlet.java
(记得开启Tomcat)找到apache-tomcat的目录--webapps
将restaurant放入webapps文件夹中
hierarchy:
在chrome里尝试访问restaurant
1. 豆浆页面(静态HTML)
地址栏输入:http://127.0.0.1:8080/Restaurant/Soymilk.html
It works!
2. 面条页面(动态Java)
地址栏输入:http://127.0.0.1:8080/Restaurant/noodles
what if: http://127.0.0.1:8080/Restaurant/noodles?vegetable=Pear
Works as well!
关闭Tomcat
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/catalina.sh stop
验证Tomcat是否关闭
chrome中输入上述地址,This site can't be reached.
Tomcat的组成,架构与配置部署
组成
bin/ --- 可执行文件(如startup.sh, shutdown.sh)
由于Tomcat为Java程序,故启动时可以加入参数
JVM启动参数配置 --> 通过环境变量的方式:
环境变量JAVA_OPTS
常用参数
e.g.-server 告诉JVM该应用为服务器应用,使JVM做一些自动优化
-Xms512m 调整JVM中初始堆内存大小
-Xmx512m 调整JVM中最大堆内存大小
之后正常启动Tomcat即可 startup.sh
conf/ --- 配置文件
重要的配置文件 server.xml
<Server> <Service> <Connector>
用于接受用户请求
</Connector> <Engine> 一个Service只能用有个Engine,用于处理Connector接收到的请求 <Host> 虚拟主机 <Context>
将Context之外包裹着的一层一层称为Container(容器)一个Context其实就是一个Web应用 </Connext> </Host> <Engine> <Service> <Server>
对应的组件实现:
Connector -- 实现组件 Coyote(实现多种Connector,默认为BIO Connector)
Container -- 具体实现的组件 Catalina(之前的配置里也指的是这个)
请求处理的流程
浏览器 --- Connector ---> Container
浏览器 <--- Connector --- Container
浏览器发一个请求,请求被Connector处理(进行socket操作,从socket读取数据,对请求进行解析)
解析后的请求内容被Container(Catalina)处理,做出对应响应
响应通过Connector传递给浏览器
(Connector:完成网络相关处理
Container:执行Web应用的代码)
Connector参数配置:
port 端口号
address 监听网络请求的地址
protocol 默认HTTP/1.1
connectionTimeout 客户端连接超时时间(ms)(若客户端不关闭连接也不发送请求(此时服务器端资源被占))
acceptCount系统繁忙时(没有空闲线程存在时),新的请求需要排队,配置队列的最大值(默认为100)。若队长超过100,则请求会被拒绝。
maxConnections connector能支持的同时最大连接数(线程池中线程的数量)(达到最大值时,将没有空闲线程处理新请求)
(弹性)线程池:事先创建一定数目的线程(由于线程的创建和销毁是比较耗时的),当有任务时,从池中取出,用完后再放回池内
最小空闲线程数:minSpareThreads(当没有任务时,等待任务的线程数)
最大线程数:maxThreads
e.g.
服务器端开发NB: 改动configuration文件之前的备份
@Matt ➜ conf cp server.xml server.xml.bak
修改server.xml文件中的conf(需重启Tomcat才会生效)线程池:
在server.xml中已将port改为8181,已将minSpareThreads和maxThreads改为1
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1" minSpareThreads="1"/>
<Connector port="8181" protocol="HTTP/1.1" connectionTimeout="200000" executor="tomcatThreadPool" redirectPort="8443" />
重启后效果
使用curl发送请求(和使用chrome的效果是一样的)
lib/ --- Tomcat的依赖库
logs/ --- 日志
日志的作用:记录Tomcat的运行情况(问题定位和调试)
日志分类:
系统运行日志:Tomcat的运行信息和状态
应用日志:servlet课程中讲解
访问日志:记录HTTP访问请求
如何配置访问日志:
server.xml
directory:存放日志的目录
prefix:日志文件名前缀
suffix:日志文件名后缀
fileDateFormat="yyyy-MM-dd.HH." 时间戳格式(默认yyyy-MM-dd.)
rotatable="true" 将日志文件切割(切割依据fileDateFormat指定的时间戳)
pattern:日志格式
%m:method
%a:client ip
%t:time
%s:status code
%b:byte sent
%{User-Agent}i :user agent
,etc.
输出的log文件e.g.
temp/ --- 临时文件夹(web应用执行时产生的临时文件)
work/ --- 供web应用使用(一般用来放置Tomcat运行过程中产生的一些文件)
webapps/ --- 默认的应用部署目录
如何在Tomcat中部署Web应用
手动部署:将web应用拷贝到webapps/目录下
常用部署:将web应用做成一个应用包(War包),方便共享。
e.g.
总结
Tomcat的安装
Tomcat的启动与停止
Tomcat的目录结构
Tomcat的配置文件
server.xml与Tomcat的架构
Tomcat的常见配置项
Connector的配置
线程池的配置
日志的配置
部署Web应用