一,java项目部署过程
- 编译:使用javac命令将.java源文件编译成.class宇节码文件
- 打包:使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式,如.jar文件,或者.war文件(用于web应用)
- 部署:将打包后的文件复制到服务器上指定的目录中,可能是Tomcat、JBoss、wildFly等应用服务器的deployments目录
二,jdk概述与安装配置
概述
JDK(Java Development Kit,Java 开发工具包)是开发 Java 应用程序所需的核心工具集合。它包含了运行 Java 应用程序和开发 Java 程序的各种工具和库。JDK 包括了 JRE(Java Runtime Environment,Java 运行时环境)和开发工具,如 编译器(javac
)、调试工具(jdb
)以及其他必要的工具和库。
J2SE, J2EE, J2ME 概述
版本 | 全称 | 定义 | 主要用途 | 适用对象 |
---|---|---|---|---|
J2SE | Java 2 Standard Edition | J2SE 是 Java 的标准版本,提供了核心类库和基础功能,适用于桌面和服务器应用。 | 提供开发桌面应用、命令行应用、图形界面(GUI)应用、控制台应用等。 | 开发桌面程序、简单的服务器应用等。 |
J2EE | Java 2 Enterprise Edition | J2EE 是 Java 的企业版,主要用于开发大型的企业级应用,提供了分布式计算、事务管理和安全功能。 | 用于开发 Web 应用、企业级应用、分布式系统、服务端应用等。 | 开发 Web 应用、大型企业应用、分布式系统等 |
J2ME | Java 2 Micro Edition | J2ME 是 Java 的微型版,主要用于开发嵌入式设备、移动设备、有限资源环境下的应用。 | 用于开发手机、嵌入式设备、物联网设备和其他资源受限的应用。 | 开发移动设备、嵌入式设备等应用。 |
JDK 版本选择指南
JDK 版本 | 适用场景 | 版本类型 | 建议选择的情况 |
---|---|---|---|
JDK 8 | 适合老旧项目、已使用 Lambda 表达式和 Stream API 的项目 | LTS(长期支持) | 如果你的项目基于 Java 8,或依赖于旧版 API,选择 JDK 8。 |
JDK 11 | 企业级应用、Web 服务、微服务架构等 | LTS(长期支持) | 适合现代化应用,支持微服务,长期稳定更新。 |
JDK 17 | 大型项目、长期支持、性能优化 | LTS(长期支持) | 对于新项目和生产环境中的长期应用,JDK 17 是首选。 |
JDK 12+ | 新特性、试验性功能、快速更新的应用 | 非 LTS(短期支持) | 对于快速追求新特性的开发,适合实验性和开发中应用。 |
推荐做法:
- 对于 生产环境 和 长期维护的项目,优先选择 LTS 版本,如 JDK 8, JDK 11 或 JDK 17。
- 对于需要 最新特性 或希望 提前体验新功能 的开发者,可以选择 非 LTS 版本,如 JDK 12、JDK 14 等,但需要注意这些版本会定期更新,且没有长期支持。
特性(运行在jvm上)
-
跨平台性: JDK 支持跨平台开发,Java 程序可以在不同的操作系统(Windows、Linux、macOS 等)上运行,无需修改代码。运行在jvm上
-
内存管理: JDK 提供了自动内存管理,包含垃圾回收机制,这大大简化了开发者的工作。
-
多线程支持: JDK 提供了内建的多线程支持,使得开发者可以高效地利用多核处理器。
-
丰富的库和 API: JDK 包含了大量的类库和 API,可以帮助开发者完成各种任务,例如网络通信、图形用户界面(GUI)开发、数据库操作等。
-
安全性: JDK 提供了多种安全特性,包括加密机制、安全类库、身份验证等,帮助开发者构建安全的应用程序。
-
支持最新的 Java 标准: JDK 支持 Java 的最新版本,包括最新的语言特性和标准库。
安装
yum安装
#查看是否安装java
rpm -qa java
#查看jdk的相关安装包
yum -y list java*
#安装jdk
yum install -y java-11-openjdk.x86_64
#测试验证(不需要配置环境变量)
java -version
源码安装(因为仓库不提供oracle的java)
#卸载之前的jdk
rpm -qa| grep java
yum remove java* -y
#下载JDK安装包:Java Archive Downloads - Java SE 17(这个版本 x64 Compressed Archive)
wget https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.tar.gz
#上传源码包的centos机
# 解压缩源码包
tar -xf jdk-17_linux-x64_bin.tar.gz -C /usr/locat/
cd /usr/local/jdk-17.0.12/bin
# 测试
./java -version
配置(学了这么久我还不会自己配,现在开始学吧)
打开 /etc/profile
文件: 使用 vim
或任何文本编辑器打开 /etc/profile
文件:
sudo vim /etc/profile
在文件的最后面添加环境变量设置: 在文件的末尾添加以下内容:
# 设置 JAVA_HOME 和更新 PATH
export JAVA_HOME=/usr/local/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH
注意:
export JAVA_HOME=/usr/local/jdk-17.0.12
这行设置了JAVA_HOME
环境变量为您的 JDK 安装路径。export PATH=$JAVA_HOME/bin:$PATH
这行将 Java 的bin
目录加入到系统的PATH
环境变量中,这样您就可以在任何地方通过命令行调用 Java。
保存并退出 vim
: 按 Esc
键,然后输入 :wq
保存并退出。
使修改生效: 运行以下命令使 /etc/profile
文件的修改立即生效:
source /etc/profile
测试 Java 环境变量是否配置成功: 运行以下命令,查看 Java 版本来验证配置是否正确:
java -version
没有明确设置 java
这个变量,为什么仍然可以直接运行 java --version
命令呢?
原因总结:
-
JAVA_HOME
环境变量的作用:JAVA_HOME
用来指向 JDK 安装的根目录,例如/usr/local/jdk-17.0.12
。
-
PATH
环境变量的作用:PATH
变量定义了操作系统搜索可执行文件的目录。当您将$JAVA_HOME/bin
加入PATH
时,系统能够在该目录下查找 Java 的可执行文件(如java
、javac
等)。
-
为什么可以执行
java
命令:java
命令是 JDK 安装目录下的一个可执行文件,通常位于$JAVA_HOME/bin/java
。- 通过将
$JAVA_HOME/bin
添加到PATH
环境变量中,操作系统能够在$JAVA_HOME/bin
目录中找到java
命令。 - 结果就是您不需要显式设置
java
变量,系统能够自动找到并执行它。
关键点:
- 设置
JAVA_HOME
后,$JAVA_HOME/bin
目录会被添加到PATH
中,操作系统就能在该目录中找到 Java 可执行文件。 - 您可以通过执行
java -version
来确认java
命令是否正确运行,因为操作系统会根据PATH
来查找java
可执行文件。
命令
javac【编译】 文件.java #将源码编译为字节码文件
class wenjian{ public static void main(String[] args){ System.out.println("文件"); } }
java【运行】 编译后的文件 #执行这个文件
三,maven安装装置使用
概述
Maven 是一个项目管理工具,主要用于 Java 项目的构建、管理和依赖管理。它基于 POM(Project Object Model)文件来描述项目的结构、依赖和插件配置,并且可以自动化执行构建、打包、部署等过程。
下载安装
- 访问 Apache Maven 官网下载页面:Download Apache Maven – Maven
- 选择适合的版本下载,例如:
apache-maven-3.x.x-bin.tar.gz
或apache-maven-3.x.x-bin.zip
。 - wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz(复制命令可能报错,我认为应该是csdn给链接加了什么,复制链接浏览器打开就可以了)
- 选择适合的版本下载,例如:
- 解压文件
- tar -xzvf apache-maven-3.x.x-bin.tar.gz -C /usr/local/
- 设置环境变量
- vim /etc/profile
- source /etc/profile
- mvn -version 验证一下
配置仓库
Maven 默认使用中央仓库来下载依赖包,但我们通常会配置自己的本地仓库或私有仓库,以便在离线或代理时使用。配置文件为:apache-maven-3.9.9/conf/settings.xml(建议先备份在修改)
1. 配置本地仓库
默认情况下,Maven 会将依赖下载到本地仓库,即
~/.m2/repository
目录。如果你想自定义本地仓库的位置,可以通过修改 Maven 的配置文件settings.xml
来实现。步骤 1:修改
settings.xml
打开 Maven 配置文件
settings.xml
,该文件位于 Maven 安装目录下的conf
文件夹中,或位于用户的~/.m2/
目录下。修改或添加以下配置:
<localRepository>自己设置存放位置</localRepository>(注意:不写这句就是默认)
步骤 2:保存并退出
- 保存
settings.xml
文件后,Maven 会将所有依赖下载到你指定的目录中,而不是默认的~/.m2/repository
。2. 配置远程仓库
Maven 默认会连接 Maven Central Repository 来下载依赖包。你可以在
settings.xml
文件中配置其他远程仓库,例如私有仓库或镜像仓库。步骤 1:配置远程仓库
你可以在
settings.xml
文件中添加自定义远程仓库的配置信息:<mirrors> <!-- 定义镜像列表 --> <mirror> <!-- 定义单个镜像 --> <id>alimaven</id> <!-- 镜像的唯一标识 --> <name>aliyun maven</name> <!-- 镜像的名称 --> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <!-- 镜像的URL --> <mirrorOf>central</mirrorOf> <!-- 指定这个镜像替代的仓库 --> </mirror> </mirrors>
步骤 2:添加远程仓库
你还可以在项目的
pom.xml
文件中添加远程仓库,以便 Maven 下载依赖时从指定的仓库获取。<repositories> <repository> <id>example-repo</id> <url>https://repo.example.com/maven2</url> </repository> </repositories>
本地仓库(Local Repository)主要用于存储从远程仓库下载的依赖包以及项目构建过程中生成的构件(例如 .jar
、.war
文件)。本地仓库的作用是缓存这些依赖,以便在以后进行构建时可以避免重复从远程仓库下载,提高构建效率和稳定性。(简单的说,本地仓库会存下远程仓库下载过得资源,并且下次直接先去本地看,没有在远程)
常用命令
mvn工程相关命令,需要在项目pom.xml同级的目录中运行
mvn clean:清理项目,删除
target/
目录中的所有文件(即编译生成的文件和构建产物)。解释:
clean
目标用于移除所有由 Maven 构建产生的文件,确保每次构建都从一个干净的状态开始。- 通常在执行构建前执行
clean
命令,避免使用旧的构建结果或缓存的文件。mvn validate:验证项目是否正确,是否有缺失的依赖。
mvn compile:编译源代码,生成
.class
文件。【在项目含有pom.xml的同一目录中】解释:
compile
目标将项目中的所有源代码编译为.class
文件,这些文件会被存放在target/classes/
目录下。- 这一步骤不会打包生成 JAR 文件,只是编译源代码。
mvn test:自动扫描并执行位于
src/test/java
目录下的所有测试类,并显示测试结果。mvn package:将编译后的代码打包成可部署的格式,如 JAR、WAR 或其他格式。
解释:
package
目标会将编译后的代码和资源文件打包成项目配置中指定的格式(例如 JAR 或 WAR 文件)。该文件会存放在target/
目录下。- 如果
pom.xml
中配置了打包成 JAR 文件,那么执行此命令后会生成一个.jar
文件。mvn install:将打包好的项目安装到本地 Maven 仓库中。
解释:
install
目标会将打包好的项目(JAR、WAR、EAR 等)安装到本地 Maven 仓库(通常是~/.m2/repository
)中。- 这使得其他项目可以引用这个已构建的项目作为依赖。
- 在执行
mvn install
后,本地仓库中会存储项目构建的产物,以便其他项目进行依赖。mvn deploy:将项目的构建产物上传到远程 Maven 仓库。
解释:
deploy
目标会将构建产物(JAR、WAR、EAR 等)上传到配置的远程 Maven 仓库。这通常用于共享构建产物,供其他开发者或项目使用。deploy
命令通常是在项目完成构建并准备发布时使用,它会将产物发布到中央仓库或私有仓库。
安装数据库mysql(先看tomcat安装)
安装mysql数据库
#安装wget yum install -y wget #下载mysql官方源 wget https://repo.mysql.com/mysql57-community-release-el7.rpm #安装刚刚下载好的yum包 yum -y install mysql57-community-release-el7.rpm #配置密钥(报错就关了检测,或者--nogpgcheck) rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 #列出所有版本 yum repolist all |grep mysql #安装yum配置工具 yum -y install yum-utils #禁用8.0版本 yum-config-manager --disable mysql80-community #启用5.7版本 yum-config-manager --enable mysql57-community #检测启动版本 yum repolist enabled |grep mysql #安装服务端,客户端 yum -y install mysql-community-server mysql #设置开机启动 systemctl enable mysqld --now #检测mysql安装 ls /var/lib/mysql #获取首次登录密码 grep 'password' | /var/log/mysqld.log #登录mysql mysql -u root -p'密码' #修改过mysql密码 use mysql alter user 'root'@'localhost' identified by '密码,有复杂度'
maven命令
命令 功能说明 mvn clean
清理项目,删除 target
目录中的所有文件,通常用于准备重新构建项目。mvn compile
编译项目的源代码,输出到 target/classes
目录。mvn test
编译项目并执行测试,通常会查找 src/test/java
中的单元测试并运行。mvn package
编译项目并将其打包为可发布的格式(如 JAR、WAR 或 EAR 文件),存储在 target/
目录下。mvn install
将构建产物(如 JAR、WAR 文件)安装到本地仓库 ~/.m2/repository
,用于项目间的本地依赖。mvn deploy
将构建成果上传到远程仓库(如 Nexus 或 Artifactory),用于共享构建产物。 mvn validate
验证项目结构是否正确,确保所有必要的文件和配置存在。 mvn site
生成项目报告和文档(如 Javadoc、单元测试报告等)。 mvn clean install
先执行 clean
清理操作,再执行install
,用于重新构建并安装项目到本地仓库。mvn dependency:tree
显示项目的依赖树,帮助你查看项目依赖的库及其版本。 mvn dependency:resolve
解析并显示项目的所有依赖项,列出所有依赖的库文件。 mvn exec:java
执行项目中的主类,通常用于启动一个 Java 应用程序。 mvn help:effective-pom
显示有效的 POM 文件,帮助你查看 Maven 如何解析 pom.xml
文件及其依赖项。mvn clean verify
结合了 clean
和verify
,不仅清理项目,还会运行所有验证步骤,确保项目构建的有效性。
四,Tomcat安装配置
概述(自带处理动态资源的功能)
Apache Tomcat 是一个轻量级的 Java Web 服务器,专门用于运行 Java Servlets 和 JavaServer Pages(JSP)。它作为一个 Servlet 容器,能够处理 Java Web 应用的请求并生成响应。
主要特点:
- 支持 Java Servlet 和 JSP 标准。
- 支持 HTTP 和 AJP 协议。
- 提供良好的性能和灵活的配置选项。
- 支持多种 Web 应用部署方式,包括 WAR 文件、目录部署等。
下载安装
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.104/bin/apache-tomcat-9.0.104.tar.gz
解压:tar -zxvf apache-tomcat-<version>.tar.gz
设置环境变量:
export CATALINA_HOME=/xxx/tomcat-版本
export PATH=$CATALINA_HOME/bin:$PATH
开启访问,ip:8080
配置文件详解
Tomcat 配置文件位于 conf
目录下,主要的配置文件有:
1. server.xml
这是 Tomcat 的主配置文件,定义了整个服务器的行为,包括端口、线程池、虚拟主机等配置。
常见配置项:
-
Connector:配置 Tomcat 监听的端口,例如 HTTP 端口、AJP 端口等。
-
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
port
:监听的端口号(默认为 8080)。connectionTimeout
:连接超时时间,单位为毫秒。redirectPort
:当启用 SSL 时,会自动重定向的端口。
- Host:配置虚拟主机,可以在同一台服务器上运行多个应用。
-
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/path/to/your/application"/> </Host>
name
:主机名(通常是localhost
)。appBase
:Web 应用的基础目录,通常是webapps
。unpackWARs
:是否自动解压 WAR 文件。
2. web.xml
web.xml
是每个 Java Web 应用的配置文件,位于 WEB-INF
目录下,定义了应用的 Servlet、过滤器、监听器等。
常见配置项:
- Servlet 配置:
-
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
servlet-name
:Servlet 的名称。servlet-class
:Servlet 类的完整路径。url-pattern
:Servlet 映射的 URL。
3. context.xml
该文件配置每个 Web 应用的相关设置,通常位于应用的 META-INF/context.xml
中。
常见配置项:
- 数据源配置:
-
<Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="user" password="password" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" />
📘 Tomcat 的
webapps
目录详解与部署机制Apache Tomcat 是流行的 Java Web 应用服务器。其核心就是通过
webapps/
目录来部署和运行 Web 应用。
📂 一、
webapps
目录作用与默认内容Tomcat 安装完成后,
webapps/
是默认的 Web 应用部署目录,Tomcat 启动时会自动扫描该目录下的.war
包或解压后的项目,并进行部署。🔍 默认包含的五个目录:
目录名 说明 访问地址 ROOT/ 默认 Web 应用(即首页)如果你把自己的项目命名为 ROOT.war
,它也会部署在这个路径上。http://localhost:8080/
docs/ Tomcat 官方文档 http://localhost:8080/docs/
examples/ JSP / Servlet 示例项目 http://localhost:8080/examples/
manager/ 图形化界面,可以上传
.war
、重启项目、卸载项目等。默认是禁止匿名访问的,需要设置用户权限(
conf/tomcat-users.xml
)http://localhost:8080/manager/
host-manager/ 虚拟主机管理界面,适用于多站点部署。一般开发环境用得少,但在生产时用于多项目隔离部署。 http://localhost:8080/host-manager/
🚧 访问
manager
和host-manager
时需要设置用户权限。👨🔧 配置权限(示例):
编辑
conf/tomcat-users.xml
添加:<role rolename="manager-gui"/> <user username="admin" password="admin123" roles="manager-gui"/>
🚀 二、部署 Java Web 项目的两种方式
Tomcat 支持以下两种部署方式,均基于
webapps/
:✅ 1. 解压部署(Exploded Deployment)
直接将项目目录(包含
WEB-INF/
、index.jsp
等)复制进webapps/
。cp -r myapp/ /usr/local/tomcat/webapps/
项目结构示例:
webapps/ └── myapp/ ├── index.jsp └── WEB-INF/ └── web.xml
访问方式:
http://localhost:8080/myapp/
✅ 2. WAR 包部署(Archive Deployment)
将项目打成
.war
文件(如myapp.war
),直接放入webapps/
目录:cp myapp.war /usr/local/tomcat/webapps/
Tomcat 启动时会自动解压生成
myapp/
文件夹。访问方式:
http://localhost:8080/myapp/
✨ 三、部署小贴士(ENJOY版)
场景 建议方式 原因 快速测试小项目 解压部署 快速修改,无需重打包 标准化运维上线 WAR 包部署 可控、版本清晰、支持 CI/CD 部署首页项目 命名为 ROOT.war
可被映射到 /
根路径多站点部署 配合 host-manager
各自独立,安全隔离
💡 小结
webapps/
是 Tomcat 部署 Web 应用的核心目录。默认有 5 个功能性目录(ROOT/docs/examples/manager/host-manager)。
支持两种部署方式:解压目录部署和
.war
包自动解压部署。配置好权限后可通过 Web 控制台轻松部署。
项目命名为
ROOT
可设置为默认首页。
Tomcat启动与关闭
cd /path/to/tomcat/bin
./startup.sh命令行运行./shutdown.sh命令行关闭
Tomcat 启动原理(进阶理解)
startup.sh
实际上是调用catalina.sh start
的脚本包装。
catalina.sh
调用 JVM 加载org.apache.catalina.startup.Bootstrap
类,初始化 Tomcat。默认监听
8080
端口,配置在conf/server.xml
文件中。<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
检查是否运行
ps -ef | grep tomcat 或者查看端口监听情况: netstat -ntlp | grep 8080
排查错误
💥 出错优先看
问题 可能原因 解决方法 启动后页面打不开 端口被占用、防火墙阻拦 改端口、开防火墙 JAVA_HOME
未设置脚本无法找到 Java 配置环境变量: export JAVA_HOME=...
日志显示 permission denied
无执行权限 chmod +x *.sh
logs/
目录!
多实例部署
好的,下面是一个简化的 Tomcat 多实例部署 的 二实例案例。我们将创建两个独立的实例,分别运行在不同的端口上。
步骤 1: 下载并解压 Tomcat
假设你已经下载了 Tomcat 安装包。
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.54/bin/apache-tomcat-9.0.54.tar.gz tar -zxf apache-tomcat-9.0.54.tar.gz -C /opt mv /opt/apache-tomcat-9.0.54 /opt/tomcat
步骤 2: 创建两个实例目录
mkdir -p /opt/instances/instance1 mkdir -p /opt/instances/instance2
步骤 3: 复制 Tomcat 核心文件到两个实例
我们将 Tomcat 的核心文件复制到每个实例目录中。
cp -r /opt/tomcat/* /opt/instances/instance1/ cp -r /opt/tomcat/* /opt/instances/instance2/
步骤 4: 配置每个实例的端口
编辑每个实例的
server.xml
文件,设置不同的端口。实例 1 (
/opt/instances/instance1/conf/server.xml
)<Connector port="8081" protocol="HTTP/1.1" ... />
实例 2 (
/opt/instances/instance2/conf/server.xml
)<Connector port="8082" protocol="HTTP/1.1" ... />
步骤 5: 启动两个实例
分别设置
CATALINA_BASE
环境变量,启动两个实例。启动实例 1
export CATALINA_HOME=/opt/tomcat export CATALINA_BASE=/opt/instances/instance1 $CATALINA_BASE/bin/startup.sh
启动实例 2
export CATALINA_HOME=/opt/tomcat export CATALINA_BASE=/opt/instances/instance2 $CATALINA_BASE/bin/startup.sh
步骤 6: 访问实例
实例 1 通过
http://localhost:8081
访问实例 2 通过
http://localhost:8082
访问步骤 7: 停止实例
每个实例都可以独立停止:
停止实例 1
$CATALINA_BASE/bin/shutdown.sh
停止实例 2
$CATALINA_BASE/bin/shutdown.sh
总结
通过以上步骤,你可以成功地在一台机器上部署 两个独立的 Tomcat 实例,每个实例使用不同的端口来访问。每个实例都有自己的配置、日志和 Web 应用目录,可以并行运行互不干扰。
多虚拟主机部署
步骤 1:准备工作
确保你已经安装并配置好了 Tomcat,并且能正常启动。
步骤 2:创建两个应用目录
在 Tomcat 的
webapps
目录下创建两个应用的目录,分别为site1
和site2
。你可以手动上传应用文件到这些目录,或者将应用打包成
.war
文件放入该目录。Tomcat 会自动解压和部署 WAR 包。示例:
/opt/tomcat/webapps/ ├── site1/ # 应用1的目录 └── site2/ # 应用2的目录
如果你使用
.war
文件,可以将它们直接放到webapps
目录下:/opt/tomcat/webapps/ ├── site1.war # 应用1的 WAR 包 └── site2.war # 应用2的 WAR 包
步骤 3:修改
server.xml
配置
打开 Tomcat 的
server.xml
配置文件,路径通常是/opt/tomcat/conf/server.xml
。在
<Engine>
标签内添加两个<Host>
配置,每个<Host>
配置对应一个虚拟主机。示例配置:
<Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <!-- 默认的 Engine 配置 --> <Engine name="Catalina" defaultHost="localhost"> <!-- 第一个虚拟主机配置 --> <Host name="www.site1.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/" docBase="site1" /> </Host> <!-- 第二个虚拟主机配置 --> <Host name="www.site2.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/" docBase="site2" /> </Host> </Engine> </Service> </Server>
解释:
<Host name="www.site1.com">
:指定虚拟主机的域名。
docBase="site1"
:指定该虚拟主机应用目录为webapps/site1
。
<Host name="www.site2.com">
:指定第二个虚拟主机的域名。
docBase="site2"
:指定第二个虚拟主机应用目录为webapps/site2
。步骤 4:配置 DNS 或
/etc/hosts
你需要确保通过 DNS 或本地的
/etc/hosts
文件使得www.site1.com
和www.site2.com
指向你的服务器 IP。在本地机器上配置(使用
/etc/hosts
文件)编辑本地的
/etc/hosts
文件,添加如下内容:192.168.1.100 www.site1.com 192.168.1.100 www.site2.com
其中
192.168.1.100
是你 Tomcat 服务器的 IP 地址。步骤 5:重启 Tomcat
配置完成后,需要重启 Tomcat 以使配置生效。
# 停止 Tomcat /opt/tomcat/bin/shutdown.sh # 启动 Tomcat /opt/tomcat/bin/startup.sh
步骤 6:验证部署
打开浏览器,访问
http://www.site1.com
,你应该能够看到site1
应用的内容。打开浏览器,访问
http://www.site2.com
,你应该能够看到site2
应用的内容。步骤 7:调试与优化
查看 Tomcat 日志:如果出现任何问题,查看 Tomcat 的日志文件(位于
/opt/tomcat/logs
)来排查错误。检查防火墙配置:确保 8080 端口没有被防火墙阻止(如果你访问的是 Tomcat 的默认端口)。
优化内存配置:根据需要调整 Tomcat 的内存配置,优化性能。
总结步骤
在
webapps
目录下创建两个应用目录或上传应用 WAR 包。修改
server.xml
配置,添加两个虚拟主机配置,分别指向不同的应用目录。配置 DNS 或
/etc/hosts
文件,将www.site1.com
和www.site2.com
指向 Tomcat 服务器的 IP。重启 Tomcat 服务使配置生效。
通过浏览器访问
http://www.site1.com
和http://www.site2.com
,验证两个应用是否正常部署。
区别:虚拟主机 vs 多个实例(Tomcat 实例)
这两者都能实现同一台机器上部署多个网站或应用,但它们在配置、资源使用、隔离性等方面有所不同。
1. 虚拟主机(Virtual Hosts)
虚拟主机是通过在 单个 Tomcat 实例 中配置多个主机(Host)来实现的。每个虚拟主机可以有自己的文档根目录(应用),并且可以通过不同的域名或端口来区分访问。
虚拟主机(Virtual Hosts)在 Tomcat 中的目录,通常是指 webapps 下的子目录或通过 WAR 包 部署的应用。具体来说,Tomcat 使用虚拟主机的
docBase
来指向一个 应用的目录,这个目录通常位于webapps
下,或者是一个通过 WAR 包 部署的应用。工作原理:
在同一个 Tomcat 实例中配置多个 Host。
每个
Host
可以指向不同的应用(比如不同的目录或 WAR 文件)。根据请求的 域名 或 端口号,Tomcat 会选择相应的虚拟主机来处理请求。
优点:
资源节省:只运行一个 Tomcat 实例,节省内存和 CPU 资源。
配置简单:无需启动多个 Tomcat 实例,配置相对简单。
适用于小型应用和低负载场景:对于需要处理多个应用,但流量不大的场景,虚拟主机是一种不错的选择。
缺点:
隔离性差:所有虚拟主机共享同一个 Tomcat 实例的内存、线程池等资源,因此它们之间的资源共享无法做到完全隔离。
配置灵活性有限:一些高级配置(如 JVM 参数、日志管理等)无法为每个虚拟主机单独设置。
配置示例:
在
server.xml
中,可以通过<Host>
标签配置虚拟主机:<Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Engine name="Catalina" defaultHost="localhost"> <!-- 配置第一个虚拟主机 --> <Host name="www.site1.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/" docBase="site1" /> #docBase="site1"表示webapps/site1,如果webapps/site1.war,那么docBase="site1.war" </Host> <!-- 配置第二个虚拟主机 --> <Host name="www.site2.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/" docBase="site2" /> </Host> </Engine> </Service> </Server>
访问:
访问
http://www.site1.com
会加载site1
应用。访问
http://www.site2.com
会加载site2
应用。2. 多个 Tomcat 实例(Multiple Instances)
多个 Tomcat 实例是在同一台机器上启动多个独立的 Tomcat 实例,每个实例都可以独立配置和运行。
工作原理:
每个 Tomcat 实例有自己的 配置文件、内存空间、线程池、端口号、webapps 目录等。
每个实例通常通过 不同的端口号 来区分,例如:
8080
、8081
等。每个实例可以独立配置 JVM 参数、日志文件、内存限制等。
优点:
完全隔离:每个 Tomcat 实例独立运行,彼此之间的资源完全隔离。
灵活性高:每个实例可以单独配置 JVM 参数、日志、线程池等,更具灵活性。
适用于大规模和高负载场景:如果应用流量很大,或者需要不同的配置,可以选择多个 Tomcat 实例来部署。
缺点:
资源消耗大:每个 Tomcat 实例都需要独立的内存和 CPU 资源,相比于虚拟主机,多个实例的资源消耗会比较大。
配置复杂:需要为每个实例配置独立的环境,管理起来较为繁琐。
配置示例:
假设你要部署两个独立的 Tomcat 实例:
实例1 监听端口
8080
,应用部署在webapps1
目录。实例2 监听端口
8081
,应用部署在webapps2
目录。每个实例都有自己独立的
server.xml
配置文件。
实例1的配置:
server.xml
中的<Connector port="8080" />
webapps1
目录用于存放应用实例2的配置:
server.xml
中的<Connector port="8081" />
webapps2
目录用于存放应用访问:
访问
http://localhost:8080
会加载实例1的应用。访问
http://localhost:8081
会加载实例2的应用。3. 虚拟主机与多个实例的区别
特性 虚拟主机(Virtual Hosts) 多个 Tomcat 实例(Multiple Instances) 配置文件 单个 server.xml
配置多个虚拟主机每个实例有独立的 server.xml
配置文件资源隔离 共享同一个 Tomcat 实例的资源(内存、线程等) 完全独立的实例,资源隔离 灵活性 配置相对简单,但不能为每个虚拟主机单独设置 JVM 参数 可以为每个实例设置独立的 JVM 参数和配置 适用场景 适用于小规模、多应用、低流量场景 适用于大规模、高负载、需要隔离的场景 端口配置 可以使用不同的端口或域名来区分不同的虚拟主机 每个实例有不同的端口,完全独立 资源消耗 资源消耗较少,适合多个小应用 每个实例独立占用更多资源 总结:
虚拟主机适用于 小规模、多应用 部署,所有的虚拟主机共享同一个 Tomcat 实例的资源,配置较简单,但缺乏资源隔离。
多个 Tomcat 实例适用于 大规模、高负载 的应用,能够提供完全的资源隔离和更高的灵活性,但需要更多的资源消耗和更复杂的配置。
你可以根据实际的需求选择使用 虚拟主机(同一实例、多应用)还是 多个 Tomcat 实例(完全独立、资源隔离)。
tomcat优化
Tomcat 是一个广泛使用的开源 Java Web 容器,为了提升其性能和稳定性,通常需要进行一些优化。以下是几个常见的 Tomcat 优化建议,帮助提高其处理请求的效率和资源使用的合理性。
1. 调整线程池配置
Tomcat 使用线程池来处理客户端请求。适当调整线程池参数可以有效提高 Tomcat 的性能。
修改
server.xml
中的Connector
配置:在
server.xml
中的<Connector>
标签内,调整以下参数:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="200" minSpareThreads="25" maxConnections="10000" enableLookups="false" disableUploadTimeout="true" acceptCount="100" connectionTimeout="20000" />
参数说明:
maxThreads
:最大线程数,设置为合理的值,避免线程过多导致内存消耗过大。
minSpareThreads
:最小空闲线程数,保持一定数量的空闲线程以便快速响应。
maxConnections
:最大连接数,限制客户端的连接数量。
acceptCount
:连接队列的最大长度,设置连接数超过maxThreads
后等待的最大连接数。2. 优化内存设置
Tomcat 的内存配置对性能影响较大,特别是在负载较高时,合理的内存配置可以提升性能。
修改 JVM 启动参数:
在 Tomcat 启动脚本(如
catalina.sh
或catalina.bat
)中调整 JVM 的堆内存设置:JAVA_OPTS="-Xms1024m -Xmx4096m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseG1GC"
参数说明:
-Xms
:设置初始堆内存大小。
-Xmx
:设置最大堆内存大小。
-XX:PermSize
和-XX:MaxPermSize
:设置永久代内存大小(在 JDK8 之后,永久代被 Metaspace 替代)。
-XX:+UseG1GC
:启用 G1 垃圾回收器,适合大内存和长时间运行的应用。3. 关闭不必要的日志功能
Tomcat 默认启用了访问日志,这可能会对性能产生一定的影响,尤其是在高并发场景下。
禁用访问日志:
在
server.xml
中找到<Host>
标签并禁用访问日志配置:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Disable Access Log --> <!--<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> --> </Host>
注意:在生产环境中,还是建议保留日志,但可以考虑优化日志的频率和存储策略。
4. 启用 GZIP 压缩
启用 GZIP 压缩可以减小响应的体积,提高传输速度,特别适用于大文件或文本类型的数据。
在
server.xml
中配置 GZIP 压缩:<Connector port="8080" protocol="HTTP/1.1" maxThreads="200" minSpareThreads="25" maxConnections="10000" enableLookups="false" disableUploadTimeout="true" acceptCount="100" connectionTimeout="20000" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json,application/javascript,application/xml,application/xhtml+xml" />
参数说明:
compression
:启用 GZIP 压缩。
compressableMimeType
:设置需要压缩的 MIME 类型。5. 优化数据库连接池
Tomcat 使用数据库连接池来管理数据库连接。如果数据库连接池配置不当,可能会导致连接瓶颈。
修改
context.xml
中的数据库连接池配置:<Context> <Resource name="jdbc/myDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb?useSSL=false" username="root" password="password" maxTotal="200" maxIdle="50" minIdle="20" maxWaitMillis="10000" /> </Context>
参数说明:
maxTotal
:数据库连接池中的最大连接数。
maxIdle
:最大空闲连接数。
minIdle
:最小空闲连接数。
maxWaitMillis
:获取连接的最大等待时间。6. 调整文件上传和下载配置
大文件上传或下载可能导致 Tomcat 的性能下降,可以通过配置优化文件上传和下载操作。
修改
web.xml
配置文件:<servlet> <servlet-name>fileUpload</servlet-name> <servlet-class>org.apache.commons.fileupload.servlet.FileUploadServlet</servlet-class> <multipart-config> <max-file-size>10485760</max-file-size> <!-- 10MB --> <max-request-size>20971520</max-request-size> <!-- 20MB --> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet>
参数说明:
max-file-size
:上传单个文件的最大大小。
max-request-size
:上传请求的最大大小。7. 禁用 JMX 远程连接
如果不需要远程监控或管理,禁用 JMX 连接可以减少一些不必要的开销。
修改
catalina.sh
:在启动脚本中禁用 JMX 远程连接:
# JMX remote monitoring #JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
8. 启用访问控制和安全设置
为了防止 DoS(拒绝服务攻击)和其他安全威胁,可以设置一些基本的安全措施。
禁用 Tomcat 管理界面和主机管理器:
在
context.xml
和server.xml
中禁用或限制对管理界面的访问:<Context path="/manager" docBase="webapps/manager" /> <Context path="/host-manager" docBase="webapps/host-manager" />
禁用不必要的应用,可以减少攻击面。
9. 使用更高效的垃圾回收策略
在生产环境中,尤其是长期运行的服务器,选择适当的垃圾回收策略对性能至关重要。
JVM 参数:
启用 G1 垃圾回收器,适合大内存环境:
JAVA_OPTS="-Xms1024m -Xmx4096m -XX:+UseG1GC"
总结
Tomcat 优化是一个综合性的工作,涉及内存管理、连接池配置、日志管理、压缩、文件上传等多个方面。根据你的应用场景和需求,可以选择性地调整相关参数,确保 Tomcat 在处理高并发请求时具备较高的稳定性和性能。
如果有其他特定问题,欢迎继续提问!