首页 > 系统相关 >Linux云计算 |【第二阶段】OPERATION-DAY5

Linux云计算 |【第二阶段】OPERATION-DAY5

时间:2024-08-18 10:24:38浏览次数:10  
标签:Tomcat tomcat local DAY5 proxy Linux OPERATION root usr

主要内容:

Tomcat概述、Tomcat部署安装、Tomcat应用案例(虚拟主机、地址重写、SSL加密站点、Tomcat日志)、Tomcat集群,maven应用

一、Tomcat概述

Apache Tomcat(简称 Tomcat)是一个开源的 Java Servlet 容器,由 Apache 软件基金会开发和维护。它实现了 Java Servlet 和 JavaServer Pages(JSP)规范,为 Java 应用程序提供了一个轻量级的、高性能的 Web 服务器环境。Tomcat 不仅可以作为独立的 Web 服务器运行,还可以与其他 Web 服务器(如 Apache HTTP Server)集成,提供更强大的功能和性能。

1)Java概述

Java 是一种广泛使用的编程语言,由 Sun Microsystems(后被 Oracle 收购)于 1995 年推出。Java 语言具有跨平台性、面向对象、简单性、安全性等特点,广泛应用于企业级应用、移动应用、嵌入式系统、Web 开发等领域。

Java体系:

  • Jave SE(标准版)
  • Java EE(企业版)

2)JDK 和 JRE

JDK(Java Development Kit):

Java 开发工具包,包含了 Java 编译器(javac)、Java 运行时环境(JRE)、调试工具(如 jdb)、文档生成工具(如 javadoc)等,是开发 Java 应用程序的必备工具。

JRE(Java Runtime Environment):

Java 运行时环境,包含了 Java 虚拟机(JVM)、Java 类库(如 java.lang、java.util 等),是运行 Java 应用程序的必备环境。

3)Java Servlet概述

Java Servlet 是 Java 技术中用于处理 Web 请求和响应的标准组件。Servlet 运行在 Servlet 容器(如 Tomcat)中,可以接收和处理客户端(通常是浏览器)的 HTTP 请求,并生成动态的 HTTP 响应。Servlet 提供了一种基于组件的、可扩展的 Web 应用开发方式,使得开发者可以专注于业务逻辑的实现,而不必关心底层的网络通信细节。

常见Servlet容器:

  • IBM       websphere
  • Oracle    weblogic
  • Apache   tomcat(免费)
  • Redhet   Jboss

二、Tomcat 部署安装

前提条件:

1)安装部署JDK(jdk1.8)

2)安装tomcat

3)启动tomcat

4)测试服务器

Tomcat配置文件及目录

- /usr/local/tomcat                      //安装目录

- /usr/local/tomcat/conf/             //配置文件目录

- /usr/local/tomcat/bin/               //主程序目录

- /usr/local/tomcat/lib/                //库文件目录

- /usr/local/tomcat/webapps/     //网页目录

- /usr/local/tomcat/work/            //自动编译目录(jsp代码转换servlet)

- /usr/local/tomcat/logs/             //日志目录

- /usr/local/tomcat/temp/            //临时目录

Tomcat进程管理

  • 命令:/usr/local/tomcat/bin/startup.sh     //启动服务
  • 命令:/usr/local/tomcat/bin/shutdown.sh   //关闭服务

例如:安装部署Tomcat服务器

步骤1:使用RPM安装JDK基础环境

[root@proxy ~]# yum -y install java-1.8.0-openjdk    //安装JDK
[root@proxy ~]# yum -y install java-1.8.0-openjdk-devel   //JDK依赖包(War包)
[root@proxy ~ROOT]# java -version    //查看JAVA版本
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

步骤2:安装tomcat

[root@proxy ~]# cd lnmp_soft/
[root@proxy lnmp_soft]# ls
apache-tomcat-8.0.30.tar.gz  nginx-1.17.6         varnish-5.2.1.tar.gz
apache-tomcat-9.0.6.tar.gz   nginx-1.17.6.tar.gz  vpn
[root@proxy lnmp_soft]# tar -xf apache-tomcat-8.0.30.tar.gz    //解压压缩包
[root@proxy lnmp_soft]# cp -r apache-tomcat-8.0.30 /usr/local/tomcat   //拷贝压缩包到安装目录
[root@proxy lnmp_soft]# ls /usr/local/tomcat/
bin   lib      logs    RELEASE-NOTES  temp     work
conf  LICENSE  NOTICE  RUNNING.txt    webapps

因tomcat由Java编写,无需./configure源码编译安装,直接解压复制到相应目录即可使用;

步骤3:启动tomcat服务

[root@proxy ~]# /usr/local/tomcat/bin/startup.sh     //脚本开启tomcat服务
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

步骤4:查看服务端口信息(8080 8009 8005)

[root@proxy ~]# netstat -anptul | grep java    //查看java监听的端口
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      4598/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      4598/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      4598/java

由于Tomcat由Java编写。在netstat命令查看时,无法找到以tomcat名的服务;需使用java为服务名查询;

测试:浏览器访问默认首页http://192.168.2.5:8080/

tomcat服务运行正常需使用3个端口:

8005关闭Tomcat程序使用、8009开发者使用、8080为网页端口(tomcat不占用80端口) 


注意:tomcat存在服务不成功问题,与随机字符有关,因默认tomcat启动需要从/dev/random读取大量的随机数据,默认该设备生成随机数据的速度很慢,导致8005端口启动非常慢,最终服务启动失败;可使用下面的命令用urandom替换random;

查看随机字符设备:

[root@proxy ~]# ls /dev/random     //存储随机字符(与当日输入命令产生有关)
/dev/random
[root@proxy ~]# ls /dev/urandom    //已存储海量的随机字符
/dev/urandom
  • 解决方案1:随意输入命令例如ls、touch等。则可以产生随即字符(随机,不可靠)
  • 解决方案2:修改软链接方式,使用已生成海量的随机字符的设备
[root@proxy ~]# mv /dev/random /dev/random.bak    //备份random
[root@proxy ~]# ln -s /dev/urandom /dev/random
[root@proxy ~]# ll /dev/random
lrwxrwxrwx. 1 root root 12 4月  15 10:22 /dev/random -> /dev/urandom
[root@proxy ~]# killall java
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh
  •  解决方案3:安装rng-tools工具
[root@proxy ~]# yum install rng-tools
[root@proxy ~]# systemctl start rngd
[root@proxy ~]# systemctl enable rngd

步骤5:编写测试html和JSP页面

Tomcat支持静态和动态页面,无需像Nginx一样安装php解释器来识别动态网页;

1)编写测试html页面(静态)

[root@proxy ~]# echo "I am Tomcat" > /usr/local/tomcat/webapps/ROOT/test.html

测试:浏览器访问测试静态页面http://192.168.2.5:8080/test.html

2)编写测试jsp页面(动态)

[root@proxy ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>      //显示服务器当前时间        
</center>
</body>
</html>

测试:浏览器访问测试动态页面http://192.168.2.5:8080/test.jsp

还原操作1:

[root@proxy ~]# cp ~/lnmp_soft/apache-tomcat-8.0.30/conf/server.xml /usr/local/tomcat/conf/server.xml

还原操作2:

[root@proxy ~]# cd ~/lnmp_soft/
[root@proxy lnmp_soft]# killall java
[root@proxy lnmp_soft]# rm -rf /usr/local/tomcat/
[root@proxy lnmp_soft]# cp -r apache-tomcat-8.0.30 /usr/local/tomcat

案例:apache-tomcat-9.0安装步骤

1)安装步骤

  1. 下载并解压 Tomcat

    下载压缩包如 apache-tomcat-9.0.xx.tar.gz,然后解压到希望安装的目录,例如:

    tar -xvzf apache-tomcat-9.0.xx.tar.gz -C /opt
    
  2. 设置环境变量

    为方便使用,可以设置 CATALINA_HOME 环境变量,指向 Tomcat 的安装目录。在 Linux 系统上,可以在 ~/.bashrc 或 ~/.bash_profile 文件中添加以下内容:

    export CATALINA_HOME=/opt/apache-tomcat-9.0.xx
    export PATH=$PATH:$CATALINA_HOME/bin
    

    然后重新加载配置文件:

    source ~/.bashrc
    
  3. 启动 Tomcat

    进入 Tomcat 的 bin 目录,启动 Tomcat 服务器:

    cd $CATALINA_HOME/bin
    ./startup.sh
    

    或者在 Windows 系统上:

    cd %CATALINA_HOME%\bin
    startup.bat
    
  4. 验证安装

    打开浏览器,访问 http://localhost:8080,你应该能看到 Tomcat 的欢迎页面,表示 Tomcat 已经成功安装并运行

  5. 停止 Tomcat

    要停止 Tomcat 服务器,可以运行以下命令:

    cd $CATALINA_HOME/bin
    ./shutdown.sh
    

    或者在 Windows 系统上:

    cd %CATALINA_HOME%\bin
    shutdown.bat

2)配置 Tomcat

  1. 管理用户

    默认情况下,Tomcat 的管理界面是受保护的。需要在 conf/tomcat-users.xml 文件中配置管理用户。例如:

    <tomcat-users>
        <role rolename="manager-gui"/>
        <role rolename="admin-gui"/>
        <user username="admin" password="admin" roles="manager-gui,admin-gui"/>
    </tomcat-users>
    
  2. 配置端口

    默认情况下,Tomcat 使用 8080 端口。如果你需要更改端口,可以编辑 conf/server.xml 文件,找到 <Connector> 标签并修改 port 属性。例如:

    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
  3. 部署应用

    将你的 WAR 文件复制到 webapps 目录下,Tomcat 会自动解压并部署应用。例如:

    cp myapp.war $CATALINA_HOME/webapps

三、Tomcat 虚拟主机

Tomcat 是一个开源的 Java Servlet 容器,用于运行 Java Web 应用程序。Tomcat 的主配置文件是 server.xml,它位于 Tomcat 安装目录的 conf 子目录下。这个文件包含了 Tomcat 服务器的核心配置信息,定义了服务器的基本组件和行为。

1、主配置文件解析

  • 主配置文件:/usr/local/tomcat/conf/server.xml
  • server.xml配置文件框架(严格区分大小写,严禁嵌套虚拟主机)

解释说明: 

<Server>

  • 它代表整个容器,是Tomcat实例的顶层元素,由org.apache.catalina.Server接口定义,它包含一个元素,并且它不能做为任何元素的子元素;
  • <Server> 元素是 server.xml 文件的根元素,代表整个 Tomcat 服务器实例。它包含一个或多个 <Service> 元素。

<Service>

  • 该元素由org.apache.catalina.Service接口定义,它包含一个Engine元素,以及一个或多个Connector,这些Connector元素共享用同一个Engine元素;
  • <Service> 元素定义了一个服务,包含一个或多个 <Connector> 元素和一个 <Engine> 元素。

<Connector>

  • 由Connector接口定义,Connector元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果;
  • <Connector> 元素定义了 Tomcat 如何与客户端进行通信。常见的配置包括 HTTP 连接器和 AJP 连接器。

    例如:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Engine>

  • 由org.apahce.catalina.Engine接口定义,每个Service元素只能有一个Engine元素,处理在同一个Service中所有Connector元素接收到的客户请求;
  • <Engine> 元素定义了处理请求的 Catalina 引擎。它包含一个或多个 <Host> 元素。

<Host>

  • 它由Host接口定义.一个Engine元素可以包含多个Host元素,每个Host的元素定义了一个虚拟主机,它包含了一个或多个Web应用;
  • <Host> 元素定义了一个虚拟主机,包含一个或多个 <Context> 元素。

    例如:

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">
    </Host>

<Context>

  • 它由Context接口定义,是使用最频繁的元素,每个Context代表了运行在虚拟主机上的单个Web应用,一个Host可以包含多个Context元素。
  • <Context> 元素定义了一个 Web 应用程序的上下文。

    例如:

    <Context path="/myapp" docBase="myapp" reloadable="true" />

<Realm>

  • <Realm> 元素定义了用户和角色的存储机制,用于安全认证。

<Valve>

  • <Valve> 元素定义了请求处理过程中的附加处理逻辑,如访问日志记录。

除了 server.xml,Tomcat 还有其他一些重要的配置文件,例如:

  • web.xml:位于 conf 目录下,定义了全局的 Web 应用程序配置。
  • context.xml:位于 conf 目录下,定义了全局的上下文配置。
  • tomcat-users.xml:位于 conf 目录下,定义了 Tomcat 管理界面的用户和角色。

2、Tomcat架构及请求处理流程

Tomcat 的核心架构包括以下几个主要组件:

  • Server:代表整个 Tomcat 服务器实例。
  • Service:包含一个或多个连接器(Connector)和一个引擎(Engine)。
  • Connector:负责处理客户端请求,并将请求传递给适当的容器。
  • Engine:处理请求的顶层容器,包含一个或多个虚拟主机(Host)。
  • Host:代表一个虚拟主机,包含一个或多个上下文(Context)。
  • Context:代表一个 Web 应用程序。

当客户端(如浏览器)发送一个 HTTP 请求到 Tomcat 服务器时,请求的处理流程如下:

连接器(Connector):

  • 连接器监听指定的端口(如 8080),接收客户端的 HTTP 请求。
  • 连接器将请求数据解析为标准的 HTTP 请求格式。

引擎(Engine):

  • 连接器将解析后的请求传递给引擎。
  • 引擎根据请求的域名或 IP 地址,将请求分发到适当的虚拟主机(Host)。

虚拟主机(Host):

  • 虚拟主机根据请求的上下文路径(Context Path),将请求分发到适当的 Web 应用程序(Context)。

上下文(Context):

  • 上下文代表一个具体的 Web 应用程序。
  • 上下文根据请求的 URL 路径,找到对应的 Servlet 或 JSP 页面。

Servlet/JSP:

  • Servlet 或 JSP 页面处理请求,生成响应内容。
  • 响应内容通过相同的组件层次结构返回给客户端。

案例1:Tomcat部署虚拟主机

  • 注意:修改server.xml配置文件,严格区分大小写

步骤1:修改server.xml配置文件,创建虚拟主机

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
...
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">     //添加虚拟主机
</Host>
<Host name="www.a.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">    //修改默认虚拟主机的name,方便做实验对比
...
</Host>

name=“指定域名”;appBase=“指定网页存放路径”;unpackWARs="true"自动解WAR包;autoDeploy="true"自动部署(网页开发)

步骤2:创建虚拟主机对应的页面根路径

[root@proxy ~]# mkdir -p /usr/local/tomcat/web_b/ROOT/
[root@proxy ~]# echo "BBB" > /usr/local/tomcat/web_b/ROOT/index.html
[root@proxy ~]# echo "AAA" > /usr/local/tomcat/webapps/ROOT/index.html

步骤3:重启Tomcat服务

[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh   //关闭服务
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh    //启动服务
[root@proxy ~]# ss -anptul | grep java
tcp    LISTEN     0      1      ::ffff:127.0.0.1:8005                 :::*                   users:(("java",pid=8954,fd=73))
tcp    LISTEN     0      100      :::8009                 :::*                   users:(("java",pid=8954,fd=51))
tcp    LISTEN     0      100      :::8080                 :::*                   users:(("java",pid=8954,fd=46))

步骤4:配置/etc/hosts文件

[root@proxy ~]# vim /etc/hosts
192.168.2.5 www.a.com www.b.com

测试:

[root@proxy ~]# curl www.a.com:8080   //注意访问的端口为8080
AAA
[root@proxy ~]# curl www.b.com:8080
BBB

浏览器访问测试页面http://www.a.com:8080及http://www.b.com:8080

补充:虚拟主机配置文件中的 autoDeploy 和 unpackWARs 功能解释:

  • autoDeploy   自动更新网站功能,有助于开发工程师
  • unpackWARs  自动解war包,通常开发工程师习惯将网站文件打成war包(类似tar包)上传到服务器,但还需要解包很麻烦,但有了这个功能就可以自动解开

例如:测试unpackWARs="true"自动解WAR包(前提是tomcat服务开启)

[root@proxy ~]# yum -y install java-1.8.0-openjdk-devel   //此依赖包中包含可测试的war包
[root@proxy ~]# jar -cf b.war /var/log/    //jar命令压缩b.war包
[root@proxy ~]# ls
anaconda-ks.cfg  b.war  lnmp_soft  lnmp_soft.tar.gz  test.jpg
[root@proxy ~]# cp b.war /usr/local/tomcat/web_b/   //拷贝到虚拟主机网页目录
[root@proxy ~]# cd /usr/local/tomcat/web_b/
[root@proxy web_b]# ls     //war包已被自动解压成目录
b  b.war  ROOT

unpackWARs="true"与autoDeploy="true"在配置文件中可以不写,默认功能开启,不需要重启tomcat服务;若需要将功能关闭,则将“true”改称”false”;


案例2:使用元素,实现“地址跳转”

  • path       匹配输入的地址栏路径
  • docBase   定义默认网站首页路径(针对webapps/ROOT)
  • appBase   指定存放网页目录(针对webapps)

如果不加元素及docbase,默认webapps/ROOT就已经指定了网站首页路径,如果需要修改默认目录首页路径,就需要加;

例如1:修改www.b.com网站的首页目录,docBase""匹配为“空”

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="" />    //使用docBase参数修改默认网站首页路径
</Host>
...
[root@proxy ~]# echo "web_b/ROOT/index.html" > /uar/loacl/tomcat/web_b/ROOT/index.html
[root@proxy ~]# echo "web_b/index.html" > /uar/loacl/tomcat/web_b/index.html
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

测试:当用户访问www.b.com:8080,显示为/uar/loacl/tomcat/web_b目录下的页面内容;

[root@proxy ~]# curl www.b.com:8080
web_b/index.html

例如2:修改www.b.com网站的首页目录,docBase匹配为“ABC”

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="ABC" />   //使用docBase参数修改默认网站首页路径
</Host>
...
[root@proxy ~]# mkdir /usr/local/tomcat/web_b/ABC/
[root@proxy ~]# echo "ABC" > /usr/local/tomcat/web_b/ABC/index.html
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

测试:当用户访问www.b.com:8080,显示为/uar/loacl/tomcat/web_b/ABC目录下的页面内容;

[root@proxy ~]# curl www.b.com:8080 
ABC

例如3:修改www.b.com网站的首页目录。docBase匹配为“/ABC”

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="/ABC" />  //使用docBase参数修改默认网站首页路径
</Host>
...
[root@proxy ~]# mkdir /ABC    //根目录下创建/ABC目录
[root@proxy ~]# echo "/ABC/index.html" > /ABC/index.html
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

— 测试:当用户访问www.b.com:8080,显示为/ABC目录下的页面内容;

[root@proxy ~]# curl www.b.com:8080
/ABC/index.html

当docBase指定带“/”路径的目录后,网页目录匹配将与appBase无关联

例如4:修改www.b.com网站的首页目录,path为“/test”,doBase匹配为“/ABC”

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
    <Context path="/test" docBase="/ABC" />  //使用path参数修改地址栏路径
</Host>
...
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

测试:

  • ① 当用户访问www.b.com:8080/test,显示为/ABC目录下的页面内容;
  • ② 当用户访问www.b.com:8080,显示为/uar/loacl/tomcat/web_b/ROOT目录下的页面内容;
[root@proxy ~]# curl www.b.com:8080
web_b/ROOT/index.html
[root@proxy ~t]# curl www.b.com:8080/test/   //注意访问路径末尾加【/】
/ABC/index.html

例如5:修改www.b.com网站的首页目录,path为“/test”,doBase匹配为“ABC”

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
    <Context path="/test" docBase="ABC" />  //使用path参数修改地址栏路径
</Host>
...
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

测试:

  • ① 当用户访问www.b.com:8080/test,显示为/uar/loacl/tomcat/web_b/ABC目录下的页面内容;
  • ② 当用户访问www.b.com:8080,显示为/uar/loacl/tomcat/web_b/ROOT目录下的页面内容;
[root@proxy tomcat]# curl www.b.com:8080/test/   //注意访问路径末尾加【/】
ABC
[root@proxy tomcat]# curl www.b.com:8080
web_b/ROOT/index.html

练习扩展:

1)访问www.b.com:8080   看到的是/usr/local/tomcat/test01/a/index.html中的内容

2)访问www.b.com:8080/abc/   看到的是/var/www/html/index.html中的内容

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="test01">
    <Context path="" docBase="a" />
    <Context path="/abc" docBase="/var/www/html/" />
</Host>
[root@proxy ~]# mkdir -p /usr/local/tomcat/test01/a/
[root@proxy ~]# echo “I am a” > /usr/local/tomcat/test01/a/index.html
[root@proxy ~]# echo “8080/abc/” /var/www/html/index.html
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh
[root@proxy ~]# curl www.b.com:8080
I am a
[root@proxy ~]# curl www.b.com:8080/abc/
8080/abc/

 


案例3:配置SSL加密站点(端口8443)

1)修改server.xml配置文件,元素,开启tomcat服务的8443功能并添加密钥信息:

  • keystoreFile="定义密钥文件存储路径"
  • keystorePass="密钥库口令"

2)生成私钥证书文件

格式:keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore

  • [-genkeypair]    生成密钥对
  • [-alias]   密钥别名
  • [-keyalg RSA]    定义密钥算法为RSA算法
  • [-keystore]       定义密钥文件存储在/usr/local/tomcat/keystore

例如:配置Tomcat支持SSL加密网站

步骤1:修改配置文件并创建支持加密连接的

默认被注释掉,需关闭注释,添加密钥信息即可

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
 84     <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
 85                maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
 86                clientAuth="false" sslProtocol="TLS"
 87                keystoreFile="/usr/local/tomcat/keystore" keystorePass="123456" />

步骤2:创建加密用的私钥和证书文件

[root@proxy tomcat]# keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore
输入密钥库口令:     //“123456”,配置文件定义的keystorePass
再次输入新口令:     //“123456”
您的名字与姓氏是什么?
  [Unknown]:  AJ
您的组织单位名称是什么?
  [Unknown]:  AJ
您的组织名称是什么?
  [Unknown]:  AJ
您所在的城市或区域名称是什么?
  [Unknown]:  AJ
您所在的省/市/自治区名称是什么?
  [Unknown]:  AJ
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CNA  
CN=AJ, OU=AJ, O=AJ, L=AJ, ST=AJ, C=CNA是否正确?
  [否]:  Y
 
输入 <tomcat> 的密钥口令    //“123456”
(如果和密钥库口令相同, 按回车):  
再次输入新口令:      //“123456”
 
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore /usr/local/tomcat/keystore -destkeystore /usr/local/tomcat/keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

[root@proxy ~]# ls /usr/local/tomcat/    //查看目录下是否有keystore文件
bin   keystore  LICENSE  NOTICE         RUNNING.txt  test01   web_b
conf  lib       logs     RELEASE-NOTES  temp         webapps  work

步骤3:重启服务

[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

验证:

[root@proxy tomcat]# curl -k https://www.b.com:8443    //-k,忽略安全风险
web_b/ROOT/index.html

常见报错:

[root@proxy tomcat]# curl -k https://www.b.com:8443
curl: (28) Operation timed out after 300320 milliseconds with 0 out of 0 bytes received

常见报错:创建的keystore指定存放文件与配置文件指定文件不一致

[root@proxy tomcat]# keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystort
输入密钥库口令:  
keytool 错误: java.lang.Exception: 未生成密钥对, 别名 <tomcat> 已经存在

常见报错:

curl: (7) Failed connect to www.b.com:8443; 拒绝连接


案例4:配置Tomcat日志

  • 日志存放目录:/usr/local/tomcat/logs/
  • 查看localhost虚拟主机的内容:(可生成tomcat日志)
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"    //日志存放目录
prefix="localhost_access_log" suffix=".txt"    //日志文件名,日志扩展名
pattern="%h %l %u %t "%r" %s %b" />   //日志输出格式

从默认localhost虚拟主机中把这段进行复制,适当修改即可

例如:为虚拟主机设置不同的tomcat日志文件

[root@proxy ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="www.b.com" appBase="web_b" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="web_b_log" suffix=".log"
               pattern="%h %l %u %t "%r" %s %b" />
</Host>
...
[root@proxy ~]# /usr/local/tomcat/bin/shutdown.sh
[root@proxy ~]# /usr/local/tomcat/bin/startup.sh

验证:

[root@proxy ~]# ls /usr/local/tomcat/logs/   //查看生成的tomcat日志文件
web_b_log.2021-04-15.log
[root@proxy ~]# curl www.b.com:8080    //通过访问站点,添加日志记录
web_b/ROOT/index.html
[root@proxy ~]# cat /usr/local/tomcat/logs/web_b_log.2021-04-15.log
192.168.2.5 - - [15/Apr/2021:16:33:33 +0800] "GET / HTTP/1.1" 200 22

四、Tomcat集群

使用Nginx反向代理tomcat(修改nginx配置)

例如:配置Tomcat集群

1) 在192.168.4.5主机上配置Nginx调度器

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http{
    upstream toms {
        server 192.168.2.100:8080;
        server 192.168.2.200:8080;
    }
    server  {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass  http://toms;
        }
    }
}

2) 在192.168.2.100和192.168.2.200主机上配置Tomcat调度器

[root@web1 ~]# yum -y install java-1.8.0-openjdk      //安装JDK环境
[root@web1 ~]# tar -xzf  apache-tomcat-8.0.30.tar.gz
[root@web1 ~]# mv apache-tomcat-8.0.30 /usr/local/tomcat

3)启动服务

[root@web1 ~]# /usr/local/tomcat/bin/startup.sh

4) 客户端验证

为防止有数据缓存,可以使用真机的Firefox访问代理服务器,输入Ctrl+F5刷新页面

五、Maven概述

Maven是一个软件项目管理工具,可以对Java项目进行构建、依赖管理;(一般JAVA开发工程师使用工具),它提供了一种标准化的项目结构和构建过程,使得项目的构建和管理变得更加简单和一致;基于项目对象模型(POM),Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

  • Project(项目):Maven 将所有的项目视为一个项目对象模型(Project Object Model,POM),通过 pom.xml 文件来描述项目的元数据、依赖、构建配置等信息。
  • Dependency Management(依赖管理):Maven 通过中央仓库和本地仓库来管理项目的依赖,自动下载和解析所需的库文件。
  • Build Lifecycle(构建生命周期):Maven 定义了一套标准的构建生命周期,包括 clean、compile、test、package、install 等阶段,每个阶段都有特定的目标(goal)。
  • Plugin(插件):Maven 的核心功能通过插件来实现,插件可以扩展 Maven 的功能,执行特定的构建任务。

POM包含了Maven创建项目的基本信息、用于描述项目的构建过程、声明项目依赖等;执行任务或目标时,Maven会在当前目录中查找POM。通过读取POM获取所需的配置信息,然后执行目标。

1)项目结构

Maven 推荐一种标准的项目结构,使得不同项目的目录结构保持一致,便于管理和维护。

my-app/
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   └── resources/
│   └── test/
│       ├── java/
│       └── resources/
└── target/
  • pom.xml:项目的核心配置文件,定义了项目的元数据、依赖、构建配置等。
  • src/main/java:存放项目的源代码。
  • src/main/resources:存放项目的资源文件,如配置文件、静态资源等。
  • src/test/java:存放测试代码。
  • src/test/resources:存放测试资源文件。
  • target:构建输出目录,存放编译后的类文件、打包后的 jar/war 文件等。

2)依赖管理

Maven 通过 pom.xml 文件中的 <dependencies> 标签来管理项目的依赖。依赖可以来自中央仓库、本地仓库或其他远程仓库。例如:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3)构建生命周期

Maven 定义了三个标准的构建生命周期:

  • default(默认):处理项目的部署,包括编译、测试、打包等。
  • clean(清理):清理构建输出目录。
  • site(站点):生成项目文档和报告。

每个生命周期包含一系列的阶段(phase),每个阶段可以绑定一个或多个目标(goal)。例如,mvn clean install 命令会先执行 clean 生命周期的 clean 阶段,然后执行 default 生命周期的 install 阶段。

Maven特点:

① 项目设置遵循统一的规则;

② 任意工程中共享;

③ 依赖管理包括自动更新;

④ 一个庞大且不断增长的库;

⑤ 可扩展,能够轻松编写Java或脚本语言的插件;

⑥ 只需很少或不需要额外配置即可即时访问新功能;

⑦ 基于模型的构建,Maven能够将任意数量的项目构建到预定义的输出类型中,如JAR、WAR或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本;

⑧ 项目信息的一致性站点,使用与构建过程相同的元数据,Maven 能够生成一个网站或PDF,包括您要添加的任何文档,并添加到关于项目开发状态的标准报告中;

⑨ 发布管理和发布单独的输出,Maven将不需要额外的配置,就可以与源代码管理系统(如 Subversion 或 Git)集成,并可以基于某个标签管理项目的发布。它也可以将其发布到分发位置供其他项目使用。Maven能够发布单独的输出,如 JAR包含其他依赖和文档的归档,或者作为源代码  发布;

⑩ 向后兼容性,可以很轻松的从旧版本Maven的多个模块移植到Maven 3中;

⑪ 子项目使用父项目依赖时,正常情况子项目应该继承父项目依赖,无需使用版本号,并行构建。编译的速度能普遍提高20 - 50 %;

⑫ 更好的错误报告,Maven改进了错误报告,它提供了Maven wiki页面的链接,可以点击链接查看错误的完整描述;

优点:

  • 标准化:提供了一种标准的项目结构和构建过程,使得项目的构建和管理变得更加简单和一致。
  • 依赖管理:自动下载和管理项目的依赖,简化了库文件的管理。
  • 插件扩展:通过插件可以扩展 Maven 的功能,执行各种构建任务。
  • 多模块支持:支持多模块项目,便于大型项目的管理和构建。

所需软件包:

  • apache-maven-3.6.3-bin.tar.gz   //maven工具(APAHCE)
  • cms.tar.gz   //JAVA开发写好的网站项目构建文件,但还需要一些依赖程序(POM文件)
  • m2.tar.gz    //释放创建网站需要的阿里云软件包,若服务可以连接外网则不需要该软件包(解压后为隐藏目录.m2)

镜像地址配置文件:/usr/local/maven/conf/settings.xml

例如:使用Maven部署网站系统

首先确保tomcat运行正常,为防止启动服务失败,设置random

[root@localhost 2]# scp maven/* 192.168.2.5:/root
[root@proxy ~]# mv /dev/random /dev/random.bak
[root@proxy ~]# ln -s /dev/urandom /dev/random

步骤1:安装maven工具,以及java环境

1)释放tar包并拷贝到指定目录

[root@proxy ~]# ls
anaconda-ks.cfg                cms.tar.gz        m2.tar.gz
apache-maven-3.6.3-bin.tar.gz  lnmp_soft         shishuocms-2.0.1.war
[root@proxy ~]# tar -xf apache-maven-3.6.3-bin.tar.gz   //释放maven工具
[root@proxy ~]# tar -xf cms.tar.gz     //网站项目构建文件
[root@proxy ~]# tar -xf m2.tar.gz     //网站需要的软件包(隐藏目录.m2)
[root@proxy ~]# mv apache-maven-3.6.3 /usr/local/maven

2)安装java依赖包

[root@proxy ~]# yum -y install java-1.8.0-openjdk  //安装java环境包
[root@proxy ~]# yum -y install java-devel     //安装java开发依赖包
[root@proxy ~]# /usr/local/maven/bin/mvn -v    //查看maven相关信息
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_161, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

3)修改镜像地址(复制相关配置模板,并在第158行下粘贴添加)

[root@proxy ~]# vim /usr/local/maven/conf/settings.xml
159    <mirror>     //镜像服务器配置
160       <id>nexus-aliyun</id>     //阿里云服务器   
161       <mirrorOf>*</mirrorOf>
162       <name>Nexus aliyun</name>
163       <url>http://maven.aliyun.com/nexus/content/groups/public</url>
164    </mirror>

不想“重复造文字”,可指定阿里云对外提供Maven相关的服务器地址,该服务器专门存放了许多功能代码提供开发工程师使用;

步骤2:配置数据库并打包项目

因网站要存放相关用户信息,需使用数据库存放;

1)配置数据库 

[root@proxy ~]# yum -y install mariadb-server    //安装数据库软件包
[root@proxy ~]# systemctl start mariadb     //启动数据库
[root@proxy ~]# cd CMS/
[root@proxy CMS]# cp src/main/resources/shishuocms.properties .  //将网站拷贝到当前目录
[root@proxy CMS]# mysql -uroot < sql/install.sql   //导入数据库关于网站的文件
[root@proxy CMS]# mysqladmin password    //修改数据库密码
New password:   //12345678
Confirm new password:

2)使用maven打包项目

[root@proxy CMS]# /usr/local/maven/bin/mvn clean package   //对CMS项目进行构建,打包生成了shishuocms-2.0.1.war包
[root@proxy CMS]# ls target/
antrun   generated-sources  maven-status      shishuocms-2.0.1.war
classes  maven-archiver     shishuocms-2.0.1

步骤3:上线测试

1)备份原有网站页面

[root@proxy CMS]# mv /usr/local/tomcat/webapps/ROOT/ /opt/tomcat_ROOT

2)将网站的war包拷贝到tomcat网站页面目录

[root@proxy CMS]# cp target/shishuocms-2.0.1.war /usr/local/tomcat/webapps/ROOT.war
[root@proxy CMS]# ls /usr/local/tomcat/webapps/
Docs  example  host-manager  manager  ROOT  ROOT.war
[root@proxy CMS]# /usr/local/tomcat/bin/startup.sh    //启动tomcat服务
  • 注意:/usr/local/tomcat/webapps/ROOT.war的war包名字,自动解压war包及ROOT目录

测试:使用浏览器访问:http://http://192.168.2.5:8080/

扩展知识:tomcat中server.xml配置详解

元素名

属性

解释

server

port

指定一个端口,这个端口负责监听关闭tomcat的请求

shutdown

指定向端口发送的命令字符串

service

name

指定service的名字

Connector(表示客户端和service之间的连接)

port

指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求

minProcessors

服务器启动时创建的处理请求的线程数

maxProcessors

最大可以创建的处理请求的线程数

enableLookups

如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址

redirectPort

指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

connectionTimeout

指定超时的时间数(以毫秒为单位)

Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求)

defaultHost

指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的

Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)

docBase

应用程序的路径或者是WAR文件存放的路径

path

表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****

reloadable

这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序

host(表示一个虚拟主机)

name

指定主机名

appBase

应用程序基本目录,即存放应用程序的目录

unpackWARs

如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

Logger(表示日志,调试和错误信息)

className

指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口

prefix

指定log文件的前缀

suffix

指定log文件的后缀

timestamp

如果为true,则log文件名中要加入时间,如下例:localhost_log.001-10-04.txt

Realm(表示存放用户名,密码及role的数据库)

className

指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样)

className

指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息

directory

指定log文件存放的位置

pattern

有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

扩展知识:Nginx配置unicode

Unicode(统一码、万国码、单一码),是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码以满足跨语言、跨平台进行文本转换、处理的要求;

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
charset utf-8;
[root@proxy ~]# echo "我爱Linux" > /usr/local/nginx/html/index.html
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

扩展知识:tomcat配置unicode

将该行代码放在网页文件index.html里,重启服务即可识别中文字体:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

思维导图:

小结:

本篇章节为【第二阶段】OPERATION-DAY5 的学习笔记,这篇笔记可以初步了解到 Tomcat概述、Tomcat部署安装、Tomcat应用案例(虚拟主机、地址重写、SSL加密站点、Tomcat日志)、Tomcat集群,maven应用。除此之外推荐参考相关学习网址:


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

标签:Tomcat,tomcat,local,DAY5,proxy,Linux,OPERATION,root,usr
From: https://blog.csdn.net/AnJern/article/details/141256483

相关文章

  • Linux下安装Trac1.6过程
    Linux下安装Trac1.6下载地址:https://trac.edgewall.org/wiki/TracDownload1.安装依赖包注意安装Trac1.6依赖包版本要求Python>3.5Jinja2>=2.9.3Babel2.10~2.2直接通过pip安装pipinstallsetuptoolspipinstallJinja2pipinstallBabel2.......
  • Linux ACL 访问控制
    今天给伙伴们分享一下LinuxACL访问控制,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相......
  • Linux 文件系统目录结构介绍和文件管理
    今天给伙伴们分享一下Linux文件系统目录结构介绍和文件管理,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关......
  • C#实现国产Linux视频录制生成mp4(附源码,银河麒麟、统信UOS)
    随着信创国产化浪潮的来临,在国产操作系统上的应用开发的需求越来越多,最近有个客户需要在银河麒麟或统信UOS上实现录制摄像头视频和麦克风声音,将它们录制成一个mp4文件。那么这样的功能要如何实现了?一.技术方案要完成这些功能,具体来说,需要解决如下几个技术问题:(1)麦克风数据采集......
  • 你知道Windows下的linux的神器WSL吗?
    我们在开发项目的时候经常需要部署,几乎都是部署在linux系统比较多,不知道你是否有遇到过部署到环境上会出现一些奇怪的问题,但是在本地却无法复现,然而我们的本地开发电脑大多数都是window系统,我们想要模拟对应的场景去调试,此时我们需要模拟对应的环境,这时候要怎么模拟呢?如果要是......
  • JetBrains Aqua 2024.2 (macOS, Linux, Windows) - 测试自动化 IDE
    JetBrainsAqua2024.2(macOS,Linux,Windows)-测试自动化IDEJetBrains跨平台开发者工具请访问原文链接:https://sysin.org/blog/jetbrains-aqua/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgAqua测试自动化IDE享受更高效的测试体验为什么选择Aqua......
  • JetBrains CLion 2024.2 (macOS, Linux, Windows) - C 和 C++ 跨平台 IDE
    JetBrainsCLion2024.2(macOS,Linux,Windows)-C和C++跨平台IDEJetBrains跨平台开发者工具请访问原文链接:https://sysin.org/blog/jetbrains-clion/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsCLion-C和C++跨平台IDE用于强大语言的......
  • D1-H Tinalinux 开发板 挂载U盘
    将U盘格式化成NFS格式 插入U盘到开发板HostUSB,会显示信息[4060.109026]usb1-1:USBdisconnect,devicenumber7[4139.330081]sunxi-ehci4200000.ehci1-controller:ehci_irq:highspeeddeviceconnect[4139.600007]usb1-1:newhigh-speedUSBdevicenumber8......
  • Linux基本指令:掌握日常操作的必备技能
    ......
  • Linux系统编程
    1.文件操作    1.1open打开文件导入库文件#include<unistd.h>#include<sys/types.h>#include<fcntl.h>intfd=open(pathname,flags)        pathname:文件路径。flags:打开方式,可以是以下选项的组合:O_RDONLY:只读打开。O_WRONLY:只写打开。O_RDWR......