day4:tomcat—maven-jdk

一,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 概述

版本全称定义主要用途适用对象
J2SEJava 2 Standard EditionJ2SE 是 Java 的标准版本,提供了核心类库和基础功能,适用于桌面和服务器应用。提供开发桌面应用、命令行应用、图形界面(GUI)应用、控制台应用等。开发桌面程序、简单的服务器应用等。
J2EEJava 2 Enterprise EditionJ2EE 是 Java 的企业版,主要用于开发大型的企业级应用,提供了分布式计算、事务管理和安全功能。用于开发 Web 应用、企业级应用、分布式系统、服务端应用等。开发 Web 应用、大型企业应用、分布式系统等
J2MEJava 2 Micro EditionJ2ME 是 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 11JDK 17
  • 对于需要 最新特性 或希望 提前体验新功能 的开发者,可以选择 非 LTS 版本,如 JDK 12JDK 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 命令呢?

原因总结:
  1. JAVA_HOME 环境变量的作用

    • JAVA_HOME 用来指向 JDK 安装的根目录,例如 /usr/local/jdk-17.0.12
  2. PATH 环境变量的作用

    • PATH 变量定义了操作系统搜索可执行文件的目录。当您将 $JAVA_HOME/bin 加入 PATH 时,系统能够在该目录下查找 Java 的可执行文件(如 javajavac 等)。
  3. 为什么可以执行 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)文件来描述项目的结构、依赖和插件配置,并且可以自动化执行构建、打包、部署等过程。

下载安装

配置仓库

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结合了 cleanverify,不仅清理项目,还会运行所有验证步骤,确保项目构建的有效性。

四,Tomcat安装配置

概述(自带处理动态资源的功能)

Apache Tomcat 是一个轻量级的 Java Web 服务器,专门用于运行 Java Servlets 和 JavaServer Pages(JSP)。它作为一个 Servlet 容器,能够处理 Java Web 应用的请求并生成响应。

主要特点:
  • 支持 Java Servlet 和 JSP 标准。
  • 支持 HTTP 和 AJP 协议。
  • 提供良好的性能和灵活的配置选项。
  • 支持多种 Web 应用部署方式,包括 WAR 文件、目录部署等。

官网:Apache Tomcat® - Welcome!

下载安装

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/

🚧 访问 managerhost-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各自独立,安全隔离

💡 小结

  1. webapps/ 是 Tomcat 部署 Web 应用的核心目录。

  2. 默认有 5 个功能性目录(ROOT/docs/examples/manager/host-manager)。

  3. 支持两种部署方式:解压目录部署和 .war 包自动解压部署。

  4. 配置好权限后可通过 Web 控制台轻松部署。

  5. 项目命名为 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:创建两个应用目录

  1. 在 Tomcat 的 webapps 目录下创建两个应用的目录,分别为 site1site2

    你可以手动上传应用文件到这些目录,或者将应用打包成 .war 文件放入该目录。Tomcat 会自动解压和部署 WAR 包。

    示例:

    /opt/tomcat/webapps/
    ├── site1/        # 应用1的目录
    └── site2/        # 应用2的目录
    
  2. 如果你使用 .war 文件,可以将它们直接放到 webapps 目录下:

    /opt/tomcat/webapps/
    ├── site1.war     # 应用1的 WAR 包
    └── site2.war     # 应用2的 WAR 包
    

步骤 3:修改 server.xml 配置

  1. 打开 Tomcat 的 server.xml 配置文件,路径通常是 /opt/tomcat/conf/server.xml

  2. <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.comwww.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:验证部署

  1. 打开浏览器,访问 http://www.site1.com,你应该能够看到 site1 应用的内容。

  2. 打开浏览器,访问 http://www.site2.com,你应该能够看到 site2 应用的内容。

步骤 7:调试与优化

  • 查看 Tomcat 日志:如果出现任何问题,查看 Tomcat 的日志文件(位于 /opt/tomcat/logs)来排查错误。

  • 检查防火墙配置:确保 8080 端口没有被防火墙阻止(如果你访问的是 Tomcat 的默认端口)。

  • 优化内存配置:根据需要调整 Tomcat 的内存配置,优化性能。

总结步骤

  1. webapps 目录下创建两个应用目录或上传应用 WAR 包。

  2. 修改 server.xml 配置,添加两个虚拟主机配置,分别指向不同的应用目录。

  3. 配置 DNS 或 /etc/hosts 文件,将 www.site1.comwww.site2.com 指向 Tomcat 服务器的 IP。

  4. 重启 Tomcat 服务使配置生效。

  5. 通过浏览器访问 http://www.site1.comhttp://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 目录等。

  • 每个实例通常通过 不同的端口号 来区分,例如:80808081 等。

  • 每个实例可以独立配置 JVM 参数、日志文件、内存限制等。

优点:
  • 完全隔离:每个 Tomcat 实例独立运行,彼此之间的资源完全隔离。

  • 灵活性高:每个实例可以单独配置 JVM 参数、日志、线程池等,更具灵活性。

  • 适用于大规模和高负载场景:如果应用流量很大,或者需要不同的配置,可以选择多个 Tomcat 实例来部署。

缺点:
  • 资源消耗大:每个 Tomcat 实例都需要独立的内存和 CPU 资源,相比于虚拟主机,多个实例的资源消耗会比较大。

  • 配置复杂:需要为每个实例配置独立的环境,管理起来较为繁琐。

配置示例:

假设你要部署两个独立的 Tomcat 实例:

  1. 实例1 监听端口 8080,应用部署在 webapps1 目录。

  2. 实例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.shcatalina.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 &quot;%r&quot; %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.xmlserver.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 在处理高并发请求时具备较高的稳定性和性能。

如果有其他特定问题,欢迎继续提问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值