Tomcat基础《一》----WEB技术
1.1Tomcat
1.1.1历史
起始于SUN的一个Servlet的参考实现项目Java Web Server,作者是James Duncan Davidson,后将项目贡献给了ASF。和ASF现有的项目合并,并开源成为顶级项目,官网http://tomcat.apache.org/
Tomcat仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
著名图书出版商O’Reilly约稿该项目成员,Davidson希望使用一个公猫作为封面,但是公猫已经被另一本书使用,书出版后封面是一只雪豹。
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2和JSP1.1规范。
Tomcat 4.x发布时,内建了Catalina(Servlet容器)和Jasper(JSP engine)等。
商用的有IBM WebSphere、Oracle WebLogic(原属于BEA公司)、Oracle Oc4j、Glassfish、JBoss等。
开源实现有Tomcat、Jetty、Resin。
1.1.2安装
可以使用CentOS7 yum源自带的安装。yum源中是Tomcat 7.0版本。安装完通过浏览器可以观察一下首页。
# yum install tomcat tomcat-admin-webapps tomcat-webapps
# systemctl start tomcat.service
# ss -tanl
LISTEN 0 100 :::8009
LISTEN 0 100 :::8080
采用Apache官网下载,下载8.x.x
# tar xf apache-tomcat-8.5.42.tar.gz -C /usr/local
# cd /usr/local
# ln -sv apache-tomcat-8.5.42/ tomcat
[[email protected] local]#ll
total 0
drwxr-xr-x 9 root root 220 Jan 16 20:28 apache-tomcat-8.5.42
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 libexec
drwxr-xr-x. 2 root root 21 Jan 12 22:00 sbin
drwxr-xr-x. 5 root root 49 Dec 5 21:43 share
drwxr-xr-x. 2 root root 6 Apr 11 2018 src
lrwxrwxrwx 1 root root 21 Jan 16 20:30 tomcat -> apache-tomcat-8.5.42/
# cd tomcat
# cd bin
# ./catalina.sh --help
# ./catalina.sh version
# ./catalina.sh start
# ss -tanlp
# ./catalina.sh stop
# ./startup.sh
# ./shutdown.sh
useradd -r java 建立系统账号
上例中,启动身份是root,如果使用普通用户启动可以使用
# useradd -r java
# chown -R java.java ./*
# su - java -c '/usr/local/tomcat/bin/catalina.sh start'
# ps -aux | grep tomcat
[[email protected] 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
Tomcat started.
[[email protected] tomcat]#ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] tomcat]#ps aux |grep tomcat
root 16792 2.0 8.3 3006864 155360 pts/0 Sl 21:09 0: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 16987 0.0 0.0 112712 968 pts/0 S+ 21:12 0:00 grep --color=auto tomcat
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4kzN1UTMxEjM2ETMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#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
[[email protected] tomcat]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[[email protected] tomcat]#useradd -r duanxin
[[email protected] tomcat]#
[[email protected] tomcat]#id duanxin
uid=997(duanxin) gid=995(duanxin) groups=995(duanxin)
[[email protected] tomcat]#su - duanxin -c "/usr/local/tomcat/bin/catalina.sh start"
su: warning: cannot change directory to /home/duanxin: No such file or directory
-bash: /usr/local/tomcat/bin/catalina.sh: Permission denied #权限不够,因为是用root安装的
[[email protected] tomcat]#chown -R duanxin.duanxin /usr/local/tomcat/* #给对应的权限
[[email protected] tomcat]#su - duanxin -c "/usr/local/tomcat/bin/catalina.sh start"
su: warning: cannot change directory to /home/duanxin: No such file or directory
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
Tomcat started.
[[email protected] tomcat]#ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] tomcat]#
1.1.3目录说明
1.1.4配置文件
1.1.5组件分类
顶级组件
Server,代表整个Tomcat容器
服务类组件
Service,组织Engine和Connector,里面只能包含一个Engine
连接器组件
Connector(8080 8009),有HTTP、HTTPS、AJP协议的连接器
容器类
Engine、Host、Context(路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内定义。
集群类组件
listener、cluster
2.1Tomcat内部组成
由上述组件就构成了Tomcat,如下图
AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。只能和apache配合,nginx是没有的。
核心组件
- Tomcat启动一个Server进程。可以启动多个Server,但一般只启动一个
-
创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
每个Service中,是Engine和其连接器Connector的关联配置,可以多个,但是端口别冲突
-
可以为这个Server提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的
端口。其作用就是处理来自客户端的不同的连接请求或响应
-
Service内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
Engine对请求头做了分析,将请求发送给相应的虚拟主机
如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
Engine上的缺省虚拟主机可以修改
- Host定义虚拟主机,虚拟主机有name名称,通过名称匹配
- Context定义应用程序单独的路径映射和配置
<?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>
举例:
假设来自客户的请求为:http://localhost:8080/test/index.jsp
浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
Engine匹配到名为localhost的Host。即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机
localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
Host匹配到路径为/test的Context
path=/test的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet
Context匹配到URL PATTERN为*.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和
HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
Context把执行完了之后的HttpServletResponse对象返回给Host
Host把HttpServletResponse对象返回给Engine
Engine把HttpServletResponse对象返回给Connector
Connector把HttpServletResponse对象返回给浏览器端
3.1应用部署
3.1.1根目录
Tomcat中默认网站根目录是CATALINA_BASE/webapps/
在Tomcat中部署主站应用程序和其他应用程序,和之前WEB服务程序不同。
nginx
假设在nginx中部署2个网站应用eshop、bbs,假设网站根目录是/var/www/html,那么部署可以是这样的。
eshop解压缩所有文件放到/var/www/html/目录下。
bbs的文件放在/var/www/html/bbs下。
Tomcat
Tomcat中默认网站根目录是CATALINA_BASE/webapps/
在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。
将eshop解压后的文件放到这个ROOT中。
bbs解压后文件都放在CATALINA_BASE/webapps/bbs目录下。
每一个虚拟主机的目录都可以使用appBase配置自己的站点目录,里面都可以使用ROOT目录作为主站目录。
3.1.2JSP WebApp目录结构
主页配置:一般指定为index.jsp或index.html
WEB-INF/:当前WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
META-INF/:类似于WEB-INF
classes/:类文件,当前webapp需要的类
lib/:当前应用依赖的jar包
3.1.3主页实验
默认情况下,/usr/local/tomcat/webapps/ROOT/下添加一个index.html文件,观察访问到了什么?
将/usr/local/tomcat/conf/web.xml中的下面标签内容(默认页),复制到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下
[[email protected] ~]#cat /usr/local/tomcat/conf/web.xml #查看最后几行
<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 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<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>
[[email protected] ~]#cat /usr/local/tomcat/webapps/ROOT/index.html
<h1>Hello kaivi</h1>
#访问
[[email protected] ~]#curl 192.168.32.7:8080
<h1>Hello kaivi</h1>
3.1.4webapp归档格式
.war:WebApp打包
.jar:EJB类打包文件
.rar:资源适配器类打包文件
.ear:企业级WebApp打包
传统应用开发测试后,通常打包为war格式,这种文件部署到了Tomcat的webapps下,还可以自动展开。
3.1.5部署Deploy
部署:将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上。
自动部署Auto Deploy:Tomcat发现多了这个应用就把它加载并启动起来
手动部署
冷部署:将webapp放到指定目录,才去启动Tomcat
热部署:Tomcat服务不停止,需要依赖manager、ant脚本、tcd(tomcat clientdeployer)等工具
反部署undeploy:停止webapp的运行,并从JVM上清除已经加载的类,从Tomcat应用目录中移除部署的文件
启动start:是webapp能够访问
停止stop:webapp不能访问,不能提供服务,但是JVM并不清除它
3.2.1实验
1、添加一个文件,test.jsp
[[email protected] ~]#cat /usr/local/tomcat/webapps/ROOT/test.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>
后面的内容是服务器端动态生成字符串,最后拼接在一起 #文本一部分
<%
out.println("hello jsp for kaivi"); #输出
%>
<br> #换行 ,和上面的文本连接一起
<%=request.getRequestURL()%> #请求对象 把URL打印出来 动态的
</body>
</html>
先把test.jsp放到ROOT下去,试试看,访问http://YourIP:8080/test.jsp 。
立即可以看到,这是通过路径映射找到相应的test.jsp后,转换成test_jsp.java,在编译成test_jsp.class。
/usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp下有转换后的文件。
[[email protected] jsp]#pwd
/usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp
[[email protected] jsp]#ll
total 68
-rw-r----- 1 duanxin duanxin 18182 Jun 5 2019 index_jsp.class
-rw-r----- 1 duanxin duanxin 30078 Jun 5 2019 index_jsp.java
-rw-r----- 1 duanxin duanxin 5796 Jan 17 14:09 test_jsp.class
-rw-r----- 1 duanxin duanxin 5080 Jan 17 14:09 test_jsp.java
2、添加一个应用
模拟部署一个应用 和ROOT同级即可
# cd
常见开发项目目录组成
# mkdir projects/myapp/{WEB-INF,classes,lib} -pv
mkdir: 已创建目录 "projects"
mkdir: 已创建目录 "projects/myapp"
mkdir: 已创建目录 "projects/myapp/WEB-INF"
mkdir: 已创建目录 "projects/myapp/classes"
mkdir: 已创建目录 "projects/myapp/lib"
常见应用首页,内容就用上面的test.jsp
# vim projects/myapp/index.jsp
[[email protected] ~]#cat projects/myapp/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>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("hello jsp for kaivi and duanxin"); #打印的内容
%>
<br>
<%=request.getRequestURL()%> #打印的URL
</body>
</html>
手动复制项目目录到webapps目录下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/ #注意权限即可
使用http://YourIP:8080/myapp/访问试试看
3.2.2配置详解
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"> #安全 只能本机访问 ::ffff:127.0.0.1:8005
<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>
8005是Tomcat的管理端口,默认监听在127.0.0.1上。SHUTDOWN这个字符串接收到后就会关闭此Server。
# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
[[email protected] ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] ~]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
[[email protected] ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
这个管理功能建议禁用,改shutdown为一串猜不出的字符串。
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28"> #修改端口或者hash
<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>
用户认证
配置文件是conf/tomcat-users.xml。
打开tomcat-users.xml,我们需要一个角色manager-gui。可直接到错误网页复制粘贴,只需要修改对应的账号以及口令即可
<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"/>
<user username="wayne" password="wayne" roles="manager-gui"/> #修改对应的账号以及口令
</tomcat-users>
Tomcat启动加载后,这些内容是常驻内存的。如果配置了新的用户,需要重启Tomcat。
访问manager app的时候告诉403,提示中告诉去manager的context.xml中修改
文件路径/usr/local/tomcat/webapps/manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<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" /> #需要增加对应的ip地址段
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionF
ilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
看正则表达式就知道是本地访问了,由于当前访问地址是192.168.x.x,可以修改正则为
重启,再次测试,成功。需要输入配置的账号以及口令
实验操作
[[email protected] tomcat]#cat conf/tomcat-users.xml |tail -10
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<user username="kaivi" password="duanxin" roles="manager-gui"/>
</tomcat-users>
但是依旧还不能访问,需要修改提示中告诉去manager的context.xml中修改
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim webapps/manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.*" /> #增加对应的ipv4地址段
需要重启才能访问:
访问Host Manager 依旧访问不了,和上面同样配置即可
[[email protected] tomcat]#cat conf/tomcat-users.xml |tail -10
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="kaivi" password="duanxin" roles="manager-gui,admin-gui"/> #注意书写 可以参考上面的格式
</tomcat-users>
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim webapps/host-manager/META-INF/context.xml #这个是host-manager文件配置
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.*" />
需要重启才能访问:
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#bin/shutdown.sh
[[email protected] tomcat]#bin/startup.sh
需要输入认证的账号以及密码:
这些操作要在服务启动之前做好,不然重启可能耽误业务
一般情况下,一个Server实例配置一个Service,name属性相当于该Service的ID。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> #跳转问题 通过代理找她
连接器配置。
redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启
HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差。
引擎配置。
defaultHost指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
#自动解压 自动部署 只需要修改appBase 这个参数 相对路径是 Catelina
虚拟主机配置。
name必须是主机名,用主机名来匹配。
appBase,当前主机的网页根目录,是相对于CATALINA_HOME,也可以使用绝对路径
unpackWARs是否自动解压war格式
autoDeploy 热部署,自动加载并运行应用
3.2.3虚拟主机配置实验
尝试再配置一个虚拟主机,并将myapp部署到/data/webapps目录下
常见虚拟主机根目录
# mkdir /data/webapps -pv
mkdir: 已创建目录 "/data"
mkdir: 已创建目录 "/data/webapps"
# cp -r ~/projects/myapp/ /data/webapps/ROOT
# pwd
/usr/local/tomcat
# bin/shutdown.sh
# bin/startup.sh
刚才在虚拟主机中主机名定义node1.magedu.com,所以需要主机在本机手动配置一个域名解析。
如果是windows,修改在C:\Windows\System32\drivers\etc下的hosts文件,需要管理员权限。
使用http://node1.magedu.com:8080/访问试试看。
也可以在tomcat的host-manager中观察。
实验操作:
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim conf/server.xml
<Host name="www.likai.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true">
window 10 的hosts DNS域名解析:
C:\Windows\System32\drivers\etc\hosts
192.168.32.7 www.likai.com
3.2.4Context配置
Context作用:
路径映射
应用独立配置,例如单独配置应用日志、单独配置应用访问控制
path指的是访问的路径
docBase,可以是绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable,true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载,性能消耗很大。生成环境中,会使用false来禁用。
将~/projects/myapp/下面的项目文件复制到/data/下
# cp -r ~/projects/myapp /data/myappv1
# cd /data
# ln -sv myappv1 test
可以修改一下index.jsp好区别一下。
Tomcat的配置文件server.xml中修改如下
<Host name="node1.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true" >
<Context path="/test" docBase="/data/test" reloadable="false" />
</Host>
使用http://node1.magedu.com:8080/test/
注意:这里特别使用了软链接,原因就是以后版本升级,需要将软链接指向myappv2,重启Tomcat。
如果新版上线后,出现问题,重新修改软链接到上一个版本的目录,并重启,就可以实现回滚。
实验操作:
[[email protected] ~]#cp projects/myapp/ /data/myappv1 -r
[[email protected] ~]#cd /data/
[[email protected] data]#ln -sv myappv1/ test
‘test’ -> ‘myappv1/’
[[email protected] data]#ll
drwxr-xr-x 5 root root 64 Jan 17 16:02 myappv1
lrwxrwxrwx 1 root root 8 Jan 17 16:02 test -> myappv1/
drwxr-xr-x 3 root root 18 Jan 17 15:45 webapps
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim conf/server.xml
[[email protected] tomcat]#cat conf/server.xml |tail -10
</Host>
<Host name="www.likai.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/test" reloadable="false" /> #增加路径
</Host>
</Engine>
</Service>
</Server>
重启访问即可
[[email protected]centos7mini tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#bin/shutdown.sh
[[email protected] tomcat]#bin/startup.sh
只能通过域名访问test:
4.1常见部署方式
standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐。
反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat
LNMT:Linux + Nginx + MySQL + Tomcat
LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更适合
LNMT:Linux + Nginx + MySQL + Tomcat
多级代理
LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
4.1.1Nginx和Tomcat实践
nginx安装
从epel源安装nginx
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum install nginx -y
# cd /etc/nginx
# vim nginx.conf
# nginx -t
全部反向代理测试
# 全部反向代理测试
location / {
proxy_pass http://127.0.0.1:8080; # 不管什么请求,都会访问后面的localhost虚拟主机
}
http://192.168.142.151/或者http://www.likai.com/全部代理给了自定义的虚拟主机
注意:www.likai.com需要配置解析,可以通过nginx -t测试。
# 全部反向代理测试
location / {
# proxy_pass http://127.0.0.1:8080; # 不管什么请求,都会访问后面的localhost虚拟主机
proxy_pass http://www.likai.com:8080; # 修改服务器的/etc/hosts
}
动静分离代理
location / {
root /data/webapps/ROOT;
index index.html;
}
# ~* 不区分大小写
location ~* \.(jsp|do)$ {
proxy_pass http://www.likai.com:8080; # /etc/hosts
}
在/data/webapps/ROOT目录下增加一个index.html。
http://192.168.32.7/和http://192.168.32.17/index.jsp测试一下看看。
但是实际上Tomcat不太适合做动静分离,用它来管理程序的图片不好做动静分离部署。
实验操作:
[[email protected] ~]#vim /etc/nginx/nginx.conf
location / {
# proxy_pass http://127.0.0.1:8080;
index index.html; #静态页面
root /data/webapps/ROOT;
}
location ~* \.(jsp|do)$ { #动态页面
proxy_pass http://www.likai.com:8080;
}
[[email protected] ROOT]#pwd
/data/webapps/ROOT
[[email protected] ROOT]#vim index.html
[[email protected] ROOT]#cat index.html
HELLO nginx ~~~
4.1.2应用管理
# 全部反向代理
location / {
proxy_pass http://127.0.0.1:8080; # 不管什么请求,都会访问后面的localhost虚拟主机
}
点击Tomcat首页的右上角的“Manager App”按钮,弹出登录对话框。
管理界面
Applications 应用程序管理,可以启动、停止、重加载、反部署、清理过期session
Deploy 可以热部署,也可以部署war文件。
点击Tomcat首页的右上角的“Manager App”按钮,弹出登录对话框。
Host Manager虚拟主机管理
配置如下
<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"/>
<role rolename="admin-gui" />
<user username="wayne" password="wayne" roles="manager-gui,admin-gui"/>
</tomcat-users>
重启Tomcat,点击“Host Manager”按钮
可以新增虚拟主机。
4.1.3httpd和Tomcat实践
# yum install httpd -y
# httpd -M
# httpd -M | grep proxy
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
httpd配置
proxy_http_module模块代理配置
<VirtualHost *:80> #80端口 就代理
ServerName node1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/ #代理去哪里
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
ProxyRequests:Off关闭正向代理。
ProxyPass:反向代理指令
ProxyPassReverse:保留代理的response头不重写(个别除外)
ProxyPreserveHost:On开启。让代理保留原请求的Host首部
ProxyVia:On开启。代理的请求响应时提供一个response的via首部
# vim /etc/httpd/conf.d/http-tomcat.conf
# httpd -t
# systemctl start httpd
# /usr/local/tomcat/bin/startup.sh
http://192.168.142.151/
http://node1.magedu.com/
http://node1.magedu.com/index.jsp
实验操作:
[[email protected] tomcat]#cat /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
ServerName www.likai.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
[[email protected] tomcat]#httpd -t
Syntax OK
systemctl start httpd
这个的原因是因为httpd配置DocumentRoot没有修改
以上3个URL看到了不同的页面,说明ProxyPreserveHost On 起了作用。
设置ProxyPreserveHost Off 再看效果,说明什么?
这个会导致到默认的主机上去,从而不会代理到自己定义的虚拟主机上面
proxy_ajp_module模块代理配置
<VirtualHost *:80>
ServerName node1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8009/ #ajp协议修改 后面的端口要指到8009上面去 二进制协议
</VirtualHost>
查看Server Status可以看到确实使用的是ajp连接了。
相对来讲,AJP协议基于二进制比使用HTTP协议的连接器效率高些。
网站架构不是一天建成的,都是演化来的。不是最新最时髦的架构,而是最合适的,能驾驭的
了、成本可控的架构。
实验操作:
[[email protected] tomcat]#vim /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
ServerName www.likai.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8009/
</VirtualHost>
[[email protected] tomcat]#httpd -t
Syntax OK
[[email protected] tomcat]#systemctl reload httpd