tomcat服务


java基础知识


    java组成:

语法:(Java 编写规则)-

源代码(.java 人工编写)-

字节码(.class 编译生成,跨平台中间文件)-

jvm(虚拟机,运行字节码)
   java环境体系:JVM - JRE - JDK【oracle、open】

JVM:Java 虚拟机,只负责运行字节码

JRE:运行环境 = JVM + 核心类库,只用来跑程序

JDK:开发工具包 = JRE + 编译 / 调试工具,写代码必备
    java web:servlet 、jsp

Servlet: Java 编写的后端程序,处理请求、业务逻辑、控制跳转,纯 Java 代码。

JSP 页面模板,HTML 嵌套 Java 代码,本质是 Servlet,负责展示页面数据。

二者关系 JSP 最终会被容器编译成 Servlet; Servlet 侧重后台逻辑,JSP 侧重前台页面。

tomcat基础知识


    tomcat 和 java 存在版本兼容性的问题
    当前版本:9.x、10.x、11.x 
    tomcat 配置结构
        server - service 【connector,Engine[host,host2,host3,...    ]】

Connector:对外端口监听,负责接收浏览器请求

Engine:引擎容器,统一管理所有虚拟主机

Host:每一个对应一个网站域名,多站点就配多个 Host
        Engine属性:defaulthost(默认虚拟主机)
        host:

name(虚拟主机域名)、appbase(项目存放目录)、unpackwars(是否自动解压 war 包)、

autodeploy(是否热部署,自动发布更新项目)


        定制功能


            两个目录:METE_INF/context.xml(当前项目专属配置) 、

           WEB_INF/web.xml(项目核心部署描述符)
        三个端口:8080(访问端口,浏览器项目对外访问)/8005(关闭端口,Tomcat 内部监听,远程关闭服务)/8009(通信端口,和 Nginx/Apache 做反向代理、负载均衡通信)


        项目部署

应用目录的属性权限一定要对(Tomcat 对webapps、项目文件夹、文件必须有读写权限)
            样式1:war包(压缩包丢 webapps,自动解压部署)
            样式2:子应用(项目文件夹直接放 webapps,目录名 = 访问路径)
            样式3:webapps下创建目录(不在 webapps,通过 Context 配置任意路径部署)


tomcat应用部署


    样式:直接访问、本地nginx反向代理、多机nginx反向代理【反向代理的时候,主机名的转发】

1.直接访问 浏览器直接 IP:8080/项目名 直连 Tomcat

2.本机 Nginx 反向代理 Nginx 和 Tomcat 同机,Nginx 监听 80,转发给本地 8080

3.多机 Nginx 反向代理 Nginx 一台、多台 Tomcat 节点;代理转发时携带主机名,保持域名、会话一致性
    会话管理:
        会话绑定 - nginx的调度算法(ip_pash):同一 IP 始终访问同一 Tomcat
        会话复制 - tomcat的配置(会话数据多节点同步复制集群) + web.xml

               注:server.xml 集群配置 + web.xml 开启分布式
        会话共享 - tomcat的上下文 + redisson的模块 + redis环境

                注:会话统一存 Redis,所有 Tomcat 共享

bin:启停脚本(启动、关闭 tomcat)

conf:所有配置文件

lib:公共依赖 jar 包

webapps:存放部署的 web 项目

logs:运行日志、错误日志

work:JSP 编译缓存

temp:临时文件

server.xml(最重要):修改端口、连接端口、虚拟主机

web.xml:全局 web 配置,欢迎页、session 超时、编码

tomcat-users.xml:配置管理账号密码权限

context.xml:配置连接池、数据源

注意流程:改端口→server.xml;部署项目→webapps;查报错→logs;改账号→tomcat-users.xml

 tomcat服务


 jvm基础


    流程:源代码-编译-字节码-类加载器-jvm运行环境-执行引擎
    组成:类加载器
        运行时环境
            公共区域 heap、方法区
            私有区域 java线程栈、本地方法栈、程序计数器
        执行引擎
            即使编译 JIT
            垃圾收集器
        本地方法接口
    堆结构:老年代、年轻代【Eden区、Survivor1、Survivor2】
    容量控制:-Xmx -Xms -Xmn -XX:NewRatio  -XX:SurvivorRatio ...
    
    垃圾:
        确定垃圾的方式:根搜索可达、统计计数
        处理垃圾的方法:标记清除、标记压缩、标记复制
        垃圾回收的触发条件:
            年轻代:Eden满了,MinorGC
            老年代:空间满了,MajorGC 【MinorGC】  == FullGC
                   导致程序中止 -- STW
            回收的落脚点:
                    降低STW的发生频率【增加容量空间、降低对象代码大小】
                    减少STW的执行时间【垃圾回收器的类型】
        垃圾回收器的类型:
            串行-并行、独占-并发
            老年代、年轻代、混合【G1】
            
    tomcat的性能优化
        连接器属性、hosts属性、日志数据、类加载的策略


 java项目构建


    流程:
        研发提交代码到代码仓库
        构建服务器通过git|svn 获取代码到本地【工作目录】
        准备构建环境
            maven软件安装、maven环境配置
        项目构建
            进入项目目录【pom.xml文件所在的位置】
            mvn clean package 打包命令
                - 根据配置到模块仓库里面获取模块
                - 项目源代码编译
                - 打包生成文件
            提交代码到制品库
            
    配置体系:
        全局配置 /etc/maven/settings.xml   
        用户配置 ~/.m2/settings.xml        默认没有
        项目配置 path/to/project/pom.xml   优先级最高


nexus方案


    定位:本地的模块仓库、本地的制品库
    端口:8081


   实践

一.tomcat的环境准备和安装

源码方式安装Tomcat

Java环境准备

1.java环境部署好

apt install openjdk-17-jdk -y

2.定制环境变量

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$JAVA_BIN:$PATH

3.加载环境变量

source /etc/profile.d/java.sh
java -version

4.获取 tomcat 软件

mkdir /data/softs -p
cd /data/softs
wget https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.4/bin/apache-tomcat-11.0.4.tar.gz

5.解压文件

mkdir /data/server
tar xf apache-tomcat-11.0.4.tar.gz -C /data/server/

6.定制软连接

ln -s /data/server/apache-tomcat-11.0.22 /data/server/tomcat

7.定制系统环境变量

vim /etc/profile.d/tomcat.sh

export CATALINA_BASE=/data/server/tomcat
export CATALINA_HOME=/data/server/tomcat
export CATALINA_TMPDIR=$CATALINA_HOME/temp
export CLASSPATH=$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar
export PATH=$CATALINA_HOME/bin:$PATH

8.加载 Tomcat 环境变量

source /etc/profile.d/tomcat.sh

9.定制专用服务用户

useradd -r -s /sbin/nologin tomcat
id tomcat

10.更改文件权限(软链接特殊双授权)

chown -R tomcat:tomcat /data/server/tomcat
chown tomcat:tomcat -R /data/server/tomcat/*

11.定制 systemd 启动服务脚本文件路径:/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat
After=syslog.target network.target

[Service]
Type=forking
# Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
ExecStart=/data/server/tomcat/bin/startup.sh
ExecStop=/data/server/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

12.加载服务配置

systemctl daemon-reload

13.启动 tomcat 服务

systemctl start tomcat

14.测试

浏览器访问:10.0.0.16:8080

二.tomcat部署halo项目相关的过程

应用nexus实现企业的maven仓库

ubuntu24-16 主机

1.采用 openjdk 方式安装的 java

apt install openjdk-11-jdk -y

java -version

2.创建目录

mkdir /data/{server,softs} -p

3.获取软件

cd /data/softs

wget https://download.sonatype.com/nexus/3/nexus-3.70.3-01-java11-unix.tar.gz

4.检查效果

ll nexus-3.70.3-01-java11-unix.tar.gz -h

5.解压软件

tar xf nexus-3.70.3-01-java11-unix.tar.gz -C /data/server/

6.做软连接

ln -s /data/server/nexus-3.70.3-01 /data/server/nexus

7.查看文件

ls /data/server/nexus

8.修改配置

cat /data/server/nexus/etc/nexus-default.properties

## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/

# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
nexus-pro-feature

nexus.hazelcast.discovery.isEnabled=true

9.查看相关的命令文件

tree /data/server/nexus/bin/

10.查看执行脚本文件

file /data/server/nexus/bin/nexus

11.查看文件内容

cat /data/server/nexus/bin/nexus

12.查看功能选项

cat /data/server/nexus/bin/nexus | grep ')'

13.配置 Nexus 软件配置

将 nexus 的运行身份,改为普通的用户 sswang,如果文件权限不够,则无法启动

vim /data/server/nexus/bin/nexus.rc

cat /data/server/nexus/bin/nexus.rc

run_as_user="sswang"  # 修改为 sswang

14.测试运行

/data/server/nexus/bin/nexus

15.查看 nexus 的运行身份为 root

vim /data/server/nexus/bin/nexus.rc

cat /data/server/nexus/bin/nexus.rc

16.运行 nexus 软件

/data/server/nexus/bin/nexus start

17.检查效果

netstat -tnulp | grep 8081

测试

18.查看进程服务

ps aux | grep nexus

19.确认日志目录

ls /data/server/

20.查看日志内容

ls /data/server/sonatype-work/nexus3/

Nexus 定制系统服务

1.停止正在运行的旧 Nexus

/data/server/nexus/bin/nexus stop

2.创建并编辑 Nexus systemd 服务文件

vim /lib/systemd/system/nexus.service

3.写入完整全套服务配置

[Unit]
Description=nexus service
After=network.target

[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/data/server/nexus/bin/nexus start
ExecStop=/data/server/nexus/bin/nexus stop
User=root
#User=nexus
Restart=on-abort

[Install]
WantedBy=multi-user.target

4.重载 systemd 配置,加载新服务

systemctl daemon-reload

5.通过 systemctl 启动 Nexus 服务

systemctl start nexus

6.核查服务是否成功运行

systemctl is-active nexus

7.测试验证

浏览器访问验证 地址:10.0.0.16:8081 打开 Nexus 仓库后台

账号密码登录 用户名:admin 密码:12345678

应用nexus实现企业的内部apt源仓库

16主机

1.定制数据目录

mkdir /data/blobs

2.创建 Blob 存储

进入 Nexus 管理界面

进入 Blob Stores 页面

点击 Create Blob Store

Type 选择 File

Name 填写 ubuntu2404

Path 填写 /data/blobs/ubuntu2404

点击保存

3.创建 APT 代理仓库

进入 Repositories 页面

点击 Create repository

选择 apt(proxy)

Name 填写 ubuntu2404

Distribution 填写 noble

Remote storage 填写 https://mirrors.aliyun.com/ubuntu/

Blob store 选择 ubuntu2404

点击保存

4.仓库同步

  1. 回到 Browse 页面
  2. 选中 ubuntu2404 仓库
  3. 点击 Analyze 按钮
  4. 弹窗选择 Yes, only this repository

5.编辑源文件:

Types: deb
URIs: http://10.0.0.16:8081/repository/ubuntu2404/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://10.0.0.16:8081/repository/ubuntu2404/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

执行更新命令:

apt update

apt list --upgradable

配置Maven库

1.创建目录

mkdir /data/blobs

2.建子目录

mkdir /data/blobs/mymaven

打开左侧 Blob Stores

点击右上角 Create Blob Store

Type 选择 File

Name 填写:mymaven

Path 填写:/data/blobs/mymaven

直接点保存

创建代理资源库(proxy)
  1. Nexus 后台 → Repositories

  2. 点击 Create repository

  3. 选择 maven2 (proxy)

  4. 页面填写:

Name:mymaven

Remote storage:http://maven.aliyun.com/nexus/content/groups/public/

Blob store:下拉选择刚才建好的 mymaven

取消勾选 Strict Content Type Validation

保持 Online 勾选开启

直接点击保存

托管资源库 1(Release 库)

页面:Repositories

点击 Create repository → 选择 maven2 (hosted)

配置填写: Name:mymaven-hosted Version policy:Release Blob store:mymaven 取消勾选:Validate that all content uploaded Deployment policy:Allow redeploy

点击保存,创建完成

托管资源库 2(Snapshot 库)

再次点击 Create repository → maven2 (hosted)

配置填写: Name:mymaven-snapshot-hosted Version policy:Snapshot Blob store:mymaven 取消严格内容校验 Deployment policy:Allow redeploy

点击保存

组资源库(group)

Name:mymaven-group

Blob store:选择 mymaven

组成员仓库,按这个从上到下的顺序依次添加:

mymaven-hosted

mymaven-snapshot-hosted

mymaven(之前的阿里云代理仓库)

定制 maven 配置

vim /etc/maven/settings.xml

cat /etc/maven/settings.xml

<servers>
  <server>
    <id>mymaven-snapshot-hosted</id>
    <username>admin</username>
    <password>12345678</password>
  </server>

  <server>
    <id>mymaven-hosted</id>
    <username>admin</username>
    <password>12345678</password>
  </server>

  <server>
    <id>mymaven</id>
    <username>admin</username>
    <password>12345678</password>
  </server>
</servers>

进入项目目录:

cd /data/codes/spring-boot-helloworld/

ls

--注意:maven命令解读

mvn deploy:deploy-file
-DGroupId=对应pom中的groupId
-DartifactId=对应pom中的artifactId
-Dversion=对应pom中的version
-Dpackaging=对应pom中的packaging
-Dfile=文件路径
-DpomFile=表示需要上传的jar包对应的pom文件的绝对路径
-Durl=上传的服务器
-DrepositoryId=服务器的表示ID,setting.xml文件中配置的serverId,用来关联私服的用户名和密码

执行 Maven 命令

mvn deploy:deploy-file

最后确认效果

进入 mymaven-snapshot-hosted 仓库

查看目录:com/neo/spring-boot-helloworld/0.3-SNAPSHOT

所有 jar、pom、元文件已存在 结果显示:本地的文件提交成功了


        nginx反向代理tomcat
    jvm的结构 
        类加载器、运行时环境【heap、方法区、java线程栈、本地方法栈、程序计数器】、执行引擎等
    heap的结构 
        老年代、年轻代【Eden区、Survivor1、Survivor2】

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐