tomcat实例:运行中的tomcat进程,可以运行多个进程
server:每一个实例对应一个server
engine:tomcat的核心组件,用于运行jsp或者servlet代码,并不能自己去接收用户请求
connector:连接器,负责分析接收响应用户请求(自己并不能处理请求,请求service映射为engine中运行的代码)
http连接器,ajp连接器
service:connector与engine相互并不能打交道,而是由service将两者进行关联
一个连接器只能属于一个engine,但一个engine能关联多个连接器
一个service只能包含一个engine组件和一个或多个connector组件
host:类似httpd中的虚拟主机
context:类似于httpd的alias
注意:每个组件都由类实现,有些组件的实现还不止一种
顶级类组件:server
服务类组件:service
容器类组件:可以部署webapp的组件,engine,host,context
连接器组件:connector
被嵌套类的组件:value,logger,realm
tomcat运行模式:
standalone:通过内置的web server(http connector)来接收客户端的请求
proxy:由专门的web server服务器响应客户端额请求
in-process:部署于同一主机
network:部署于不同主机
tomcat的安装
1、安装java环境,也就是按照jdk:
rpm -ivh jdk-8u144-linux-x64.rpm
[root@node1 java]# pwd
lrwxrwxrwx 1 root root 16 Aug 6 21:25 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Aug 6 21:25 jdk1.8.0_144
lrwxrwxrwx 1 root root 22 Aug 6 21:25 latest -> /usr/java/jdk1.8.0_144
/usr/java 默认按照位置
设置java环境变量:
[root@node1 java]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
[root@node1 java]# source /etc/profile.d/java.sh
[root@node1 java]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
2、安装tomcat软件
wget
tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-8.5.16 tomcat
[root@node1 local]# cat /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
source /etc/profile.d/tomcat.sh
启动tomcat:
[root@node1 bin]# sh catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/latest
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 71124/java
tcp 0 0 :::8009 :::* LISTEN 71124/java
监听在8080端口
java webapps:
有特定的组织形式,层次型的目录结构,主要包含servlet代码文件,jsp文件,类文件、部署描述符文件等
/usr/local/tomcat/webapps/app1/
webapps是网站根目录
WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml
META-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的context.xml
classes/:此webapp的私有类
lib:此webapp的私有类,被打包为jar格式类
index.jsp:webapp的主页
手动添加一个测试应用程序:
1、创建webapp特有的目录结构
[root@node1 webapps]# mkdir myapp/{WEB-INF,META-INF,classes,lib} -pv
mkdir: created directory `myapp'
mkdir: created directory `myapp/WEB-INF'
mkdir: created directory `myapp/META-INF'
mkdir: created directory `myapp/classes'
mkdir: created directory `myapp/lib'
[root@node1 webapps]# touch myapp/index.jsp
[root@node1 webapps]# tree myapp/
myapp/
├── classes
├── index.jsp
├── lib
├── META-INF
└── WEB-INF
2、编写jsp文件
访问:
在webapps同级目录有个work目录:
[root@node1 tomcat]# tree work/
work/
└── Catalina
└── localhost
└── estore
├── org
│ └── apache
│ └── jsp
│ ├── index_jsp.class
│ ├── index_jsp.java
│ ├── login_jsp.class
│ ├── login_jsp.java
│ ├── loginOut_jsp.class
│ ├── loginOut_jsp.java
│ ├── register_jsp.class
│ ├── register_jsp.java
│ ├── validatecode_jsp.class
│ └── validatecode_jsp.java
└── SESSIONS.ser
在所有的webapp应用程序的编译过程都在此目录进行编译
部署webapp相关的操作:
deploy:部署,将webapp的源文件放置于目录,并配置tomcat服务器能够基于context.xml文件
中定义的路径来访问此webapp;将其特有类通过class loader装在至tomcat
两种方式:
自动部署:auto deploy
手动部署:
1、冷部署:把webapp复制到指定位置,而后才启动tomcat
2、热部署,在tomcat不停止服务器的情况下部署,需要借助部署工具ant等
undeploy:反部署,停止webapp应用程序,并从tomcat实例中拆除其部分文件和部署名
stop:停止tomcat服务,用户无法访问服务,webapp应用程序还在tomcat部署目录中
start:启动处于停止状态的webapp应用程序
redeploy:重新部署
创建多个host:
1、创建webapps目录,并创建必备目录
mkdir /data/webapps -pv
cd /data/webapps/
mkdir {WEB-INF,META-INF,classes,lib} -pv
mkdir /data/logs 自定义webapps日志
vim index.jsp 编辑测试页
[root@node1 webapps]# cat index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
<% out.println("Hello world."); %>
</body>
</html>
2、一个新的webapps目录结构
[root@node1 data]# tree webapps/
webapps/
├── classes
├── index.jsp
├── lib
├── META-INF
└── WEB-INF
3、配置server.xml
<Host name="www.hcstart.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/data/webapps" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="www.hcstart.com_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
Host组件中appBase是网站的根,,但是实际的是如果docBase与appBase不相同那么表示映射或者别名性质,最终网站以docBase为准
Context组件中,path指明url位置路径,空表示就是url的根/
docBase是webapps目录的一个映射或者别名
如果修改:
<Host name="www.hcstart.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
<Context path="/myapp" docBase="/data/webapps/myapp" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="www.hcstart.com_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@node1 webapps]# cat myapp/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP Test Page</title>
</head>
<body>
<% out.println("Myapp Test Page."); %>
</body>
</html>
然后访问各自目录:
1、首先访问网站的根目录:
404报错
2、访问
3、修改
<Host name="www.hcstart.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="myapp" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="www.hcstart.com_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
docBase="myapp",这里使用的是映射别名,实际是/data/webapps/myapp, 所以访问http://www.hcstart.com:8080映射到了myapp下面,并没有访问appBase="/data/webapps"这个下面的index.jsp
当访问http://www.hcstart.com:8080/myapp的时候appBase="/data/webapps"这是网站的根,然后寻找下面的myapp目录,然后读取index.jsp
所以两者访问一致
4、部署一个webapp:
<Host name="www.hcstart.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/data/webapps" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="www.hcstart.com_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
然后将war包丢进/data/webapps,会自动解压,并且自动部署
[root@node1 webapps]# pwd
/data/webapps
[root@node1 webapps]# ll
total 7372
drwxr-xr-x 2 root root 4096 Aug 8 09:48 classes
drwxr-x--- 10 root root 4096 Aug 8 11:02 estore
-rw-r--r-- 1 root root 7520739 Aug 8 10:49 estore.war
-rw-r--r-- 1 root root 202 Aug 8 09:51 index.jsp
drwxr-xr-x 2 root root 4096 Aug 8 09:48 lib
drwxr-xr-x 2 root root 4096 Aug 8 09:48 META-INF
drwxr-xr-x 2 root root 4096 Aug 8 09:48 WEB-INF
重启catalina.sh,然后访问:
如果再在webapps目录下创建myapp,并且将war包丢进myapp,那么访问时将会报错
总结:war包只能放置在webapps目录下面,如果自动解包,自动部署,那么将不会报错
结合nginx:
location / {
root html; index index.html index.htm; proxy_pass http://www.hcstart.com:8080; }[root@node1 html]# ls -l estore/
total 168-rw-r----- 1 root root 3051 Aug 8 13:51 404.jsp-rw-r----- 1 root root 2890 Aug 8 13:51 500.jsp-rw-r----- 1 root root 1112 Aug 8 13:51 add_good.jsp-rw-r----- 1 root root 482 Aug 8 13:51 admin_index.jsp-rw-r----- 1 root root 953 Aug 8 13:51 buyorcart.jsp-rw-r----- 1 root root 5065 Aug 8 13:51 cart.jsp-rw-r----- 1 root root 2288 Aug 8 13:51 confirm.jspdrwxr-x--- 3 root root 4096 Aug 8 13:51 data-rw-r----- 1 root root 584 Aug 8 13:51 goods_admin.jsp-rw-r----- 1 root root 11016 Aug 8 13:51 goods_detail.jsp-rw-r----- 1 root root 1762 Aug 8 13:51 goods.jspdrwxr-x--- 7 root root 4096 Aug 8 13:51 imagesdrwxr-x--- 2 root root 4096 Aug 8 13:51 inc-rw-r----- 1 root root 43682 Aug 8 13:51 index.jspdrwxr-x--- 2 root root 4096 Aug 8 13:51 js-rw-r----- 1 root root 3421 Aug 8 13:51 login.jsp-rw-r----- 1 root root 219 Aug 8 13:51 loginOut.jspdrwxr-x--- 2 root root 4096 Aug 8 13:51 META-INF-rw-r----- 1 root root 3459 Aug 8 13:51 orders_detail.jsp-rw-r----- 1 root root 2946 Aug 8 13:51 orders.jsp-rw-r----- 1 root root 4047 Aug 8 13:51 orders_submit.jsp-rw-r----- 1 root root 4080 Aug 8 13:51 pay.jsp-rw-r----- 1 root root 576 Aug 8 13:51 pay_success.jsp-rw-r----- 1 root root 5645 Aug 8 13:51 register.jspdrwxr-x--- 4 root root 4096 Aug 8 13:51 themesdrwxr-x--- 5 root root 4096 Aug 8 13:51 upload-rw-r----- 1 root root 1836 Aug 8 13:51 validatecode.jspdrwxr-x--- 4 root root 4096 Aug 8 13:51 WEB-INF[root@node1 html]# pwd/usr/local/nginx/html开启nginx的80服务: