Apache架构模型
Prefork
定义:Prefork是一种多进程模型,服务器在启动时会创建多个子进程,每个子进程都可以独立处理客户端的请求。
优点:
进程间相互独立,一个进程崩溃不会影响其他进程。
适合长连接和持久连接的处理。
缺点:
资源消耗大,每个进程都需要独立的内存空间和资源。
进程间通信(IPC)复杂,上下文切换开销较大。
适用场景:适合连接数不是特别多,但每个连接都需要消耗较多资源的场景。
Worker
定义:Worker指的是在服务器中负责处理实际工作的进程或线程。在Prefork模型中,每个子进程都是一个Worker;在多线程模型中,每个线程也是一个Worker。
优点:
可以根据负载动态调整Worker的数量,提高资源利用率。
相对于多进程模型,多线程模型的上下文切换和通信开销较小。
缺点:
线程安全问题需要特别注意,不当的同步可能导致竞态条件或死锁。
单个线程的崩溃可能影响整个进程的稳定性。
适用场景:适合需要大量并发处理,但每个连接处理相对简单快速的场景。
Event
定义:Event驱动模型是一种非阻塞I/O模型,服务器通过事件通知机制来异步处理I/O操作,通常与多线程或协程结合使用。
优点:
高效地处理大量并发连接,尤其是对于短连接和非持久连接。
资源消耗相对较低,因为不需要为每个连接创建独立的进程或线程。
非阻塞I/O可以提高I/O操作的响应速度。
缺点:
编程模型相对复杂,需要合理设计事件处理逻辑。
对于长连接和持久连接的处理不如Prefork模型直观。
适用场景:适合需要处理大量并发短连接,且每个连接处理相对简单快速的场景。
总结梳理与对比
资源消耗:Prefork > Worker > Event。Prefork由于每个连接都需要独立的进程,资源消耗最大;Worker通过多线程可以减少资源消耗;Event模型通过非阻塞I/O和事件通知机制,可以在较少的资源消耗下处理大量并发连接。
适用场景:Prefork适合连接数不多但每个连接需要较多资源的场景;Worker适合需要大量并发处理的场景;Event适合处理大量并发短连接的场景。
JDK
Java SE API:Java基础类开发接口
JRE:Java运行时环境,包含JVM+Java核心类库
JDK:Java软件开发工具包。JDK包含JRE
安装
官网下载地址:https://www.oracle.com/java/technologies/downloads/
----------------------------------------二进制安装
[root@wenzi ~]#ls
jdk-11.0.19_linux-x64_bin.tar.gz
[root@wenzi ~]#tar -xf jdk-11.0.19_linux-x64_bin.tar.gz -C /usr/local/
[root@wenzi ~]#cd /usr/local/
[root@wenzi local]#ln -s jdk-11.0.19/ jdk
[root@wenzi local]#vim /etc/profile.d/jdk.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk/
export PATH=$JAVA_HOME/bin:$PATH
[root@wenzi local]#. /etc/profile.d/jdk.sh
[root@wenzi local]#java -version
java version "11.0.19" 2023-04-18 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.19+9-LTS-224)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.19+9-LTS-224, mixed mode)
[root@wenzi local]#jps #列出在你的 Java 虚拟机(JVM)上运行的所有 Java 进程
1591 Jps
Tomcat
介绍
Tomcat是一个免费的、开放源代码的Web应用服务器,属于轻量级应用服务器。它是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
安装
安装Tomcat前需要先配置JDK
官方下载地址:https://tomcat.apache.org/download-80.cgi
----------------------------------------二进制安装
[root@wenzi ~]#ls
apache-tomcat-9.0.75.tar.gz jdk-11.0.19_linux-x64_bin.tar.gz
[root@wenzi ~]#tar -xf apache-tomcat-9.0.75.tar.gz -C /usr/local/
[root@wenzi ~]#ln -s /usr/local/apache-tomcat-9.0.75 /usr/local/tomcat
[root@wenzi ~]#echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@wenzi ~]#. /etc/profile.d/tomcat.sh
[root@wenzi ~]#catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
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.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Server version: Apache Tomcat/9.0.75
Server built: May 4 2023 13:04:05 UTC
Server number: 9.0.75.0
OS Name: Linux
OS Version: 5.15.0-92-generic
Architecture: amd64
JVM Version: 11.0.19+9-LTS-224
JVM Vendor: Oracle Corporation
启动tomcat。startup.sh 或 catalina.sh start
[root@wenzi ~]#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/local/jdk/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@wenzi ~]#ss -tnlp
LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=1871,fd=53))
LISTEN 0 100 *:8080 *:* users:(("java",pid=1871,fd=43))
查看进程,tomcat默认是以root身份启动的
[root@wenzi ~]#ps aux | grep tomcat
root 1871 1.1 4.9 2541888 97060 pts/0 Sl 21:17 0:02 /usr/local/jdk//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
关闭tomcat,shutdown.sh 或 catalina.sh start
[root@wenzi ~]#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/local/jdk/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
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.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
开启tomcat后通过端口号8080可访问默认首页
配置Service文件
[root@wenzi ~]#useradd -r -s /sbin/nologin tomcat
[root@wenzi ~]#vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/usr/local/jdk
[root@wenzi ~]#chown -R tomcat:tomcat /usr/local/tomcat/
[root@wenzi ~]#vim /lib/systemd/system/tomcat.service
[Unit]
Description=This is tomcat service
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@wenzi ~]#systemctl daemon-reload
文件结构
目录
- bin:服务启动、停止等相关程序和文件
- conf:配置文件
- lib:库目录
- logs:日志目录
- webapps:应用程序,应用部署目录
- work:jsp编译后的结果文件,建议提前预热访问。升级应用后,删除此目录数据才能更新
当启动tomcat后,访问默认首页后,可见首页文件已被编译。
[root@wenzi ~]#ls /usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp/
index_jsp.class index_jsp.java
配置文件
在tomcat安装目录的conf子目录中,有以下配置文件
- server.xml:主配置文件
- web.xml:每个webapp只有“部署”后才能被访问,部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置来覆盖全局文件
- context.xml:定义了所有web应用都需要加载的Context,此文件为所有的webapps提供默认配置,每个web应用也可以使用自己专属配制,它通常由专用的配置文件context.xml来定义,存放在WEB-INF/目录,覆盖全局文件
- tomcat-users.xml:用户认证的账号和密码文件
- catalina.policy:当使用security选项启动tomcat时,用于为tomcat设置安全策略
- Catalina.properties:tomcat环境变量的配置,用于设定加载器路径,及一些与JVM调优相关参数
- logging.properties:tomcat日志系统相关配置,可修改日志级别和日志路径
日志文件
catalina
catalina.out:标准输出和标准错误。包含tomcat运行自己输出的日志以及应用里向console输出的日志。此日志文件默认不会切割,需要人为切割,避免文件过大影响性能。
catalina.YYYY-MM-DD.log:tomcat自己运行的一些日志,除此还会输出到catalina.out。但应用向console输出的日志不会输出到catalina.YYYY-MM-DD.log中,它是tomcat启动、暂停时的运行日志
localhost
localhost.YYYY-MM-DD.log:主要是应用初始化(listen,filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,也记录部分tomcat启动、暂停时的运行日志,没有catalina.YYYY-MM-DD.log全面
localhost_access_log.YYYY-MM-DD.txt:访问tomcat的日志,请求时间和资源,状态码都有记录
host-manager.YYYY-MM-DD.log
存放tomcat的自带的manager项目的日志信息
manager.YYYY-MM-DD.log
tomcat manager项目专有的日志文件
tomcat访问日志格式
[root@wenzi ~]#tail /usr/local/tomcat/conf/server.xml
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" /> #此符号"在html中表示双引号
</Host>
</Engine>
</Service>
</Server>
查看访问日志
[root@wenzi ~]#tail /usr/local/tomcat/logs/localhost_access_log.2024-03-01.txt
192.168.28.1 - - [01/Mar/2024:00:36:02 +0800] "GET / HTTP/1.1" 200 11230
实现json格式日志。中间从 pattern="开始至/>中间无换行
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
<!-- pattern="%h %l %u %t "%r" %s %b" /> -->#注释原日志格式
[root@wenzi ~]#systemctl restart tomcat.service
[root@wenzi ~]#tail -f /usr/local/tomcat/logs/localhost_access_log.2024-03-01.txt
{"clientip":"192.168.28.1","ClientUser":"-","authenticated":"-","AccessTime":"[01/Mar/2024:01:05:20 +0800]","method":"GET / HTTP/1.1","status":"200","SendBytes":"11230","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}
格式化显示结果
{
"clientip": "192.168.28.1",
"ClientUser": "-",
"authenticated": "-",
"AccessTime": "[01/Mar/2024:01:05:20 +0800]",
"method": "GET / HTTP/1.1",
"status": "200",
"SendBytes": "11230",
"Query?string": "",
"partner": "-",
"AgentVersion": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
组件
组件分层和分类
顶级组件
Server,代表整个tomcat容器,一台主机可以启动多个tomcat实例,需要保证端口不冲突
服务类组件
Service,实现分层Engine和Connector,建立两者之间关联关系,service只能包含一个Engine
连接器组件
Connector,与HTTP(默认端口8080/tcp),HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连机器。AJP(Apache Jserv protocol)是一种基于tcp的二进制通讯协议
容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可嵌入其它组件,内部配置如何运行应用程序
内嵌类
可以内嵌到其它组件内,valve、logger、realm、loader、manager等
集群类
listener、cluster
Tomcat内部组成
Server:服务器,Tomcat运行的进程示实例,一个Server中可有多个service,但通常就一个
Service:服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine
Connector:连接器,负责客户端的HTTP,HTTPS、AJP等协议连接,一个Connector只属于某一个Engine
Engine:引擎,用来响应并处理用户请求,一个Engine可绑定多个Connector
Host:虚拟主机,可实现多虚拟主机,例如使用不同的主机投划分
Context: 应用上下文,配置特定url路径映射和目录的映射关系:url --> directory
核心组件
-
Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例,但一般只启动一个
-
创建一个Service提供服务。 可以创建多个Service,但-般也只创建一个;每个Service中, 是Engine和其连接器Connector的关联配置
-
可以为这个Service提供多个连接器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="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context >
<Context />
</Host>
</Engine>
</Service>
</Server>
Tomcat处理请求过程
设客户的请求为:http://localhost:8080/test/index.jsp
- 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
- Connector把该请求交给它所在的Service的Engine来处理, 并等待Engine的响应
- Engine获得请 求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
- Engine匹配到名为localhost的Host。 如果匹配不到,就把请求交给该Engine中的defaultHost处理
- 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对象, 作为参数调用spServlet的doGet或doPost方法。
Java应用部署
根目录结构
特殊变量
CATALINA_HOME:指Tomcat安装的根路径
CATALINA_BASE:指特定的Tomcat实例在运行时配置的根路径。如果在一台tomcat中配置多个Tomcat实例,可用CATALINA_BASE属性。如后面tomcat配置多网站时使用的启动脚本ins.sh中设定的export CATALINA_BASE=“/usr/local/tomcat/webapp1”
当CATALINA_HOME和CATALINA_BASE两个属性同时存在且两者路径不同,则CATALINA_HOME路径包含的是静态资源,例如.jar文件,或者二进制文件;CATALINA_BASE路径包含的是配置文件、log日志文件、部署的应用程序和其它运行时所需的资源。
Tomcat中默认网站根目录是$CATALINA_BASE/webapps/
在Tomcat中部署主站应用程序和其它应用程序,与nginx不同
在nginx中
假设在nginx中部署2个网站应用eshop、forum,若网站根目录是/data/www/html,部署位置如下:eshop解压缩所有文件放到/data/www/html/目录下,forum的文件放到/data/www/html/forum/下,则网站链接有如下对应关系:
http://localhost/ 对应eshop的应用,即/data/www/html/
http://localhost/forum/ 对应forum的应用,即/data/www/html/forum
在tomcat中
Tomcat中默认网站根目录是 C A T A L I N A B A S E / w e b a p p s / , CATALINA_BASE/webapps/, CATALINABASE/webapps/,CATALINA_BASE/webapps/下的每一个目录都对应一个web应用;在tomcat的webapps目录中有个非常特殊的目录ROOT,它就是网站默认根目录。
若将eshop的文件放在 C A T A L I N A B A S E / w e b a p p s / R O O T 中, f o r u m 的文件放到 CATALINA_BASE/webapps/ROOT中,forum的文件放到 CATALINABASE/webapps/ROOT中,forum的文件放到CATALINA_BASE/webapps/forum目录中,则网站链接有如下对应关系:
http://localhost/ 对应eshop,即$CATALINA_BASE/webapps/ROOT/
http://localhost/forum/ 对应forum,即$CATALINA_BASE/webapps/forum/
若同时存在 C A T A L I N A B A S E / w e b a p p s / R O O T / f o r u m 和 CATALINA_BASE/webapps/ROOT/forum和 CATALINABASE/webapps/ROOT/forum和CATALINA_BASE/webapps/forum,仍以$CATALINA_BASE/webapps/forum优先生效
每一个虚拟主机都可以使用appBase指令配置自己的站点目录,使用appBase目录下的ROOT目录作为主站目录。
JSP WebApp目录结构
$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的
- 主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
- WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
- META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
- classes/:类文件,当前webapp需要的类
- lib/:当前应用依赖的jar包
主页设置
修改全局配置的默认主页文件
默认情况下 tomcat 会在$CATALINA_BASE/webapps/ROOT/目录下按index.html、index.htm、index.jsp 次序查找文件,找到第一个则进行显示。
[root@wenzi ~]#tail /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>
WebApp的专用配置文件
针对主站点根目录设置专用配置文件
[root@wenzi ~]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<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_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
#########新增内容
<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>
针对特定APP目录设置专用配置文件
现有网站web1
[root@wenzi ~]#cp -a webapps/ROOT/WEB-INF/ webapps/web1/
[root@wenzi ~]#echo "This is web1" > /usr/local/tomcat/webapps/web1/test.html
[root@wenzi ~]#echo "index.html" > /usr/local/tomcat/webapps/web1/index.html
[root@wenzi ~]#echo "index.htm" > /usr/local/tomcat/webapps/web1/index.htm
[root@wenzi ~]#echo "test.html" > /usr/local/tomcat/webapps/web1/test.html
[root@wenzi ~]#tree /usr/local/tomcat/webapps/web1/
/usr/local/tomcat/webapps/web1/
├── WEB-INF
│ └── web.xml
├── index.htm
├── index.html
└── test.html
[root@wenzi ~]#vim /usr/local/tomcat/webapps/web1/WEB-INF/web.xml
<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_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
#########新增内容
<welcome-file-list>
<welcome-file>test.html</welcome-file> #默认访问test.html
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
#########
</web-app>
[root@wenzi ~]#chown -R tomcat:tomcat /usr/local/tomcat/webapps/web1/
[root@wenzi ~]#curl http://192.168.28.60:8080/web1/
test.html
总结
- webApp的专有配置优先于系统的全局配置
- 修改系统的全局配置文件,需要重新启动服务生效
- 修改 webApp的专有配置,无需重启即可生效
应用部署
WebApp应用归档格式
- .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
- .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
- .rar:资源适配器类打包文件,目前已不常用
- .ear:企业级WebApp打包,目前已不常用
传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动解包和部署上线。
#关键配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
虚拟主机名 从webapps目录加载web应用 自动解压找到的war包 自动部署找到的web应用
部署方式
将webapp的源文件放置到目标目录,通过web.xml和context.xml文件中配置的路径就可以访问该webapp,通过类加载器加载其特有的类和依赖的类到JVM上,即:最终用户可以通过浏览器访问该应用
一、自动部署
Tomcat一旦发现多了一个web应用APP.war包,默认会自动把它解压缩,加载并启动起来
二、手动部署
冷部署:将webapp放到指定目录,才去启动Tomcat服务
热部署:Tomcat服务不停止,需要依赖manager、ant脚本等工具
三、反部署
停止webapp运行,并从JVM上清除已加载的类,从tomcat应用目录移除部署的文件
常见配置
8005安全配置
- 8005:主要用于接收SHUTDOWN命令以关闭Tomcat服务器,且默认配置为仅允许本地访问。
- 8009:通常用于AJP(Apache JServ Protocol)连接,允许Tomcat与其他HTTP服务器(如Apache或Nginx)进行集成。旧版本有,新版本无
- 8080:Tomcat的默认HTTP连接端口
其中8005管理功能建议禁用,方法:
- 将SHUTDOWN改为一串复杂度极高的字符串实现
- 设置port为0,系统将自动使用随机端口
- 设置port为-1无效端口,将关闭此功能。
配置文件 conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">
显示指定http服务器版本信息
配置文件 conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
Server="MyServer"
/>
其它配置
conf/server.xml中可配置Service、Connector、Engine、Host等
一、Service配置
通常一个Server实例配置一个Service,name属性相当于该Service的ID
<Service name="Catalina">
二、连接器配置
redirectPort,如果访问HTTPS协议,自动转向这个连接器。但大多数时候,Tomcat并不会开启HTTPS,因为Tomcat往往部署在内部,HTTPS性能较差
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
三、引擎配置
<Engine name="Catalina" defaultHost="localhost">
四、默认虚拟主机
指向内部定义某虚拟主机。缺省虚拟主机可以改动,默认localhost
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
多虚拟主机配置
说明
name:必须是主机名,用主机名来匹配
appBase:当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径
unpackWARs:是否自动解压war格式
autoDeploy:热部署,自动加载并运行应用
-------------------------------配置新增虚拟主机
vim conf/server.xml
#新增第一台虚拟主机
<Host name="www.web1.com" appBase="/data/webapps1" unpackWARs="true" autoDeploy="true">
#可配置单独日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web1_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" /> #此符号"在html中表示双引号
</Host>
#新增第二台虚拟主机
<Host name="www.web2.com" appBase="/data/webapps2" unpackWARs="true" autoDeploy="true">
#可配置单独日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" /> #此符号"在html中表示双引号
</Host>
-------------------------------准备虚拟主机的数据目录
mkdir -pv /data/webapps{1,2}/ROOT
chown -R tomcat:tomcat /data/webapps{1,2}/
echo "This is web1" > /data/webapps1/ROOT/index.html
echo "This is web2" > /data/webapps2/ROOT/index.html
改端口为80
修改conf/server.xml文件
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
修改Service文件中tomcat程序执行身份,因为非root用户不可使用特权端口(1024以下的端口);
tomcat默认使用root用户运行进程,将以下内容注释掉
[Service]
#User=tomcat
#Group=tomcat
也可以通过iptables实现端口重定向或DNAT
iptables -t nat -A PREROUTING -p tcp --dport 80 --j REDIRECT --to-port 8080
Context配置
Context作用
路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
应用独立配置,例如单独配置应用日志、单独配置应用访问控
映射路径
添加在<Host>...</Host>中间
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先级更高
docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用
实现过程
cp -r ~/projects/myapp /data/myapp-v1
cd /data
ln -s myapp-v1 test
#使用软链接,方便后期版本升级或回滚。若是升级,将软链接指向myapp-v2,重新启动;若是回滚,将软链接指向上一个版本,重新启动
value组件
可以定义日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
可以根据客户端远程IP地址进行限制访问
禁止所有以10.0.0.开头的IP访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>
path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先级更高
docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用
##### 实现过程
```bash
cp -r ~/projects/myapp /data/myapp-v1
cd /data
ln -s myapp-v1 test
#使用软链接,方便后期版本升级或回滚。若是升级,将软链接指向myapp-v2,重新启动;若是回滚,将软链接指向上一个版本,重新启动
value组件
可以定义日志
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
可以根据客户端远程IP地址进行限制访问
禁止所有以10.0.0.开头的IP访问
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="10\.0\.0\.\d+"/>