Linux发布java web

工作笔记 工作记录
📅 2026-09-15 16:23 👤 admin

代码 1 更新系统

sudo apt update && sudo apt upgrade -y

2.1 安装 JDK 8

Ubuntu 26.04 官方软件源已不提供 OpenJDK 8 软件包,需要改用 Eclipse Temurin 发行版安装,以下两种方式任选其一:方式一通过 Adoptium 官方 apt 源安装,便于后续随 apt 升级;方式二直接解压压缩包,不依赖第三方源,任何情况下都可用。

2.1.1 方式一:Adoptium apt 源安装

代码 2 添加 Adoptium 源并安装 temurin-8-jdk

sudo apt install -y wget apt-transport-https gpg

sudo mkdir -p /etc/apt/keyrings

wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo gpg --dearmor -o /etc/apt/keyrings/adoptium.gpg

echo "deb [signed-by=/etc/apt/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list

sudo apt update

sudo apt install -y temurin-8-jdk

apt update adoptium 源报 404,说明当前 Ubuntu 版本的代号尚未被 Adoptium 收录,请改用方式二。

2.1.2 方式二:压缩包安装

代码 3 下载并解压 Temurin 8 /opt/jdk8

cd /tmp

wget https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u422-b05/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz

sudo mkdir -p /opt/jdk8

sudo tar -xzf OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz -C /opt/jdk8 --strip-components=1

printf 'export JAVA_HOME=/opt/jdk8\nexport PATH=$JAVA_HOME/bin:$PATH\n' | sudo tee /etc/profile.d/jdk8.sh

source /etc/profile.d/jdk8.sh

压缩包的具体版本号以 adoptium.net 网站最新的 8u 版本为准,替换下载地址中对应文件名即可。

2.1.3 验证安装

代码 4 验证 Java 版本与实际路径

java -version

readlink -f $(which java)

输出应包含 openjdk version "1.8.0_xxx"readlink 的结果即 Java 可执行文件的实际路径(方式二为 /opt/jdk8/bin/java,方式一通常为 /usr/lib/jvm/temurin-8-jdk-amd64/bin/java),第 6 章编写 systemd 服务时需要使用该路径。

2.2 安装并配置 Redis

代码 5 安装 Redis 并验证

sudo apt install -y redis-server

sudo systemctl enable --now redis-server

redis-cli ping

redis-cli ping 返回 PONG 即正常。Ubuntu 默认配置仅监听 127.0.0.1,只有本机可以访问,与本部署形态一致,请勿改为对外监听。如需设置访问密码(生产环境建议设置),编辑 /etc/redis/redis.conf,找到 requirepass 配置行,取消注释并填入密码:

代码 6 Redis 密码配置片段(/etc/redis/redis.conf

requirepass <Redis密码>

代码 7 重启 Redis 并带密码验证

sudo systemctl restart redis-server

redis-cli -a <Redis密码> ping

设置密码后,需要按第 4 章在 application.yml spring.redis.password 中填入同一密码,否则后端启动后会报 Redis 连接认证失败。

2.3 安装 Nginx

代码 8 安装 Nginx 并设为开机自启

sudo apt install -y nginx

sudo systemctl enable --now nginx

systemctl status nginx

状态显示 active (running) 即安装成功,站点配置在第 7 章编写。

2.4 安装 MySQL 客户端(可选)

安装客户端仅用于第 3 章的数据库连通性验证,不安装也可改用端口探测方式:

sudo apt install -y mysql-client

2.5 防火墙配置

Ubuntu 默认防火墙为 ufw。本部署只需对外开放 SSH 80 端口;8080 6379 仅本机使用,不要对外开放。

代码 9 配置 ufw 防火墙

sudo ufw allow OpenSSH

sudo ufw allow 80/tcp

sudo ufw enable

sudo ufw status

特别注意:执行 ufw enable 之前必须先放行 SSH,否则远程连接会被防火墙断开。若 SSH 使用非默认端口,请先将实际端口加入放行规则。

3 数据库准备与连通性验证

3.1 连通性验证

部署服务器必须能访问远程 MySQL 3306 端口。已安装客户端的,直接尝试登录目标库:

代码 10 测试数据库连接

mysql -h <数据库IP> -P 3306 -u <数据库用户名> -p

输入密码后能进入 mysql 提示符即连通正常,输入 exit 退出。未安装客户端时,可用 shell 临时探测端口连通性:

代码 11 探测 3306 端口连通性

timeout 3 bash -c '</dev/tcp/<数据库IP>/3306' && echo OK

若连接超时或被拒绝,依次检查:数据库侧安全组或白名单是否放行了本服务器的出口 IP;数据库账号是否限制了登录主机来源;账号是否对目标库有权限。

3.2 全新空库初始化(可选)

如果目标数据库已经初始化并承载过本系统,跳过本节。全新空库请按表 5 顺序执行仓库 db/ 目录下的脚本。

5 数据库初始化脚本执行顺序

顺序

脚本

内容说明

1

DDLL.sql

建库与系统表结构。注意脚本内含 create database dms,若目标库名不同,需先修改该语句与 use 语句

2

原始数据表结构设计.sql

业务原始数据表结构(dms_raw_sale 等)

3

dms_province_data.sqldms_city_data.sqldms_county_data.sql

省、市、县区基础数据

4

dealer_data.sql

经销商基础数据

5

初始数据.sql

系统账号、部门、菜单、参数等初始数据

6

升级脚本.sql

增量结构升级(历史版本库补齐字段)

7

20260914_disable_login_captcha.sql

关闭登录页验证码的系统参数

 

关于第 7 项:该参数同时存在 Redis 缓存,执行 SQL 后需重启后端服务,或在系统管理的参数设置中点击「刷新缓存」才会生效。

另外注意脚本编码:仓库内各脚本编码不完全一致,部分为 UTF-8,部分为 GBK。导入前建议先统一转换为 UTF-8,或在导入命令中显式指定与文件编码一致的字符集,避免中文数据乱码:

代码 12 按指定字符集导入脚本

mysql -h <数据库IP> -u <数据库用户名> -p --default-character-set=utf8 < <脚本.sql>

4 应用配置修改(打包前)

以下修改均在源码中进行,修改完成后在开发机执行第 5 章的打包命令。涉及的两个配置文件与一个日志文件均位于 dms-master/admin/src/main/resources/ 目录。

4.1 数据源配置(application-druid.yml

系统当前激活的 profile druid(由 application.yml spring.profiles.active: druid 指定),因此数据源在 application-druid.yml 中修改。将 master 数据源替换为远程库连接信息:

代码 13 master 数据源配置片段(application-druid.yml

spring:

    datasource:

        druid:

            master:

                url: jdbc:mysql://<数据库IP>:3306/<库名>?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true

                username: <数据库用户名>

                password: <数据库密码>

连接串中的 serverTimezone=GMT%2B8 allowMultiQueries=true 是业务 SQL 依赖的参数,替换地址与库名时请原样保留。从库 slave 默认关闭,无需修改;文件中可能存在历史注释掉的旧连接信息,保持不动即可,注意不要误启用。

4.2 上传目录与 Redis 配置(application.yml

上传目录 newbit.profile 默认是 Windows 路径,部署到 Linux 必须修改;Redis 安装在本机时,连接配置保持默认即可:

代码 14 上传目录与 Redis 配置片段(application.yml

newbit:

    profile: /home/dms/uploadPath

 

spring:

    redis:

        host: localhost

        port: 6379

        database: 0

        password: <Redis密码,未设置则留空>

4.3 日志目录(logback.xml

日志路径由 logback.xml log.path 属性指定,默认为 /home/newbit/logs,可保持默认(第 6 章会创建该目录),也可改为其他绝对路径:

代码 15 日志路径配置(logback.xml

<property name="log.path" value="/home/newbit/logs" />

4.4 生产环境建议(可选)

以下调整不是部署的必要条件,但对外或生产环境建议执行:

1.      日志级别:application.yml com.newbit 的日志级别默认为 debug,生产环境建议改为 info,减少日志量。

2.      Swaggerswagger.enabled 默认为 true,对外环境建议改为 false

3.      Druid 控制台:application-druid.yml statViewServlet 默认开启且密码较弱,建议修改控制台账号密码,或通过 Nginx 限制 /prod-api/druid 路径的访问来源。

4.      令牌密钥:token.secret 建议更换为足够长的随机字符串;更换后已发放的登录令牌全部失效,用户需重新登录。

5 构建与上传

5.1 后端打包

在源码根目录执行以下命令(构建机需 JDK 8 Maven):

代码 16 后端 Maven 打包

cd dms-master

mvn -pl admin -am clean package -DskipTests

构建产物为 Spring Boot 可执行 jar,位于 dms-master/admin/target/admin.jar

5.2 前端打包

代码 17 前端构建

cd front

npm install

npm run build:prod

构建产物为 front/dist 目录。前端基于 Vue CLI 4 dart-sassNode.js 建议 14 16 版本。推荐直接在日常开发机完成前后端构建,服务器上无需安装 Node Maven

5.3 上传到服务器

Windows 开发机上使用 scp 上传(也可使用 WinSCP 等图形化工具):

代码 18 上传构建产物到服务器(开发机执行)

scp dms-master\admin\target\admin.jar <用户名>@<服务器IP>:/tmp/

scp -r front\dist <用户名>@<服务器IP>:/tmp/dms-dist

上传后文件暂存于服务器 /tmp 目录,后续章节会移动到正式位置。

6 后端部署

6.1 创建目录并就位应用包

代码 19 创建目录并移动 jar

sudo mkdir -p /opt/dms /home/dms/uploadPath /home/newbit/logs

sudo mv /tmp/admin.jar /opt/dms/admin.jar

6.2 创建 systemd 服务

新建服务单元文件 /etc/systemd/system/dms.service(可用 sudo nano 写入,或用 tee 命令写入)。ExecStart Java 路径按 2.1 节的实际安装方式调整:

代码 20 后端服务单元(/etc/systemd/system/dms.service

[Unit]

Description=FRISO DMS Backend Service

After=network.target redis-server.service

 

[Service]

Type=simple

WorkingDirectory=/opt/dms

ExecStart=/opt/jdk8/bin/java -Dfile.encoding=UTF-8 -jar /opt/dms/admin.jar

Restart=on-failure

RestartSec=10

 

[Install]

WantedBy=multi-user.target

说明:-Dfile.encoding=UTF-8 用于规避日志与部分文本处理中的中文乱码;Restart=on-failure 使进程异常退出后 10 秒自动拉起;WorkingDirectory 设为 jar 所在目录,便于相对路径资源访问。

6.3 启动与验证

代码 21 加载并启动后端服务

sudo systemctl daemon-reload

sudo systemctl enable --now dms

systemctl status dms

状态显示 active (running) 即启动成功。继续验证接口与查看日志:

代码 22 验证后端接口与日志

curl http://127.0.0.1:8080/

journalctl -u dms -n 100 --no-pager

tail -f /home/newbit/logs/sys-error.log

curl 返回 JSON 内容(如验证码、错误提示等)说明 8080 已正常监听。若启动失败,sys-error.log journalctl 输出中会包含具体异常,常见原因是数据库连不通或 Redis 认证失败,处理后执行 sudo systemctl restart dms 重启。

7 前端部署与 Nginx 配置

7.1 就位前端文件

代码 23 部署前端静态文件

sudo mkdir -p /var/www

sudo rm -rf /var/www/dms

sudo cp -r /tmp/dms-dist /var/www/dms

7.2 编写站点配置

新建 /etc/nginx/conf.d/dms.conf,内容如下:

代码 24 Nginx 站点配置(/etc/nginx/conf.d/dms.conf

server {

    listen 80;

    server_name _;

 

    client_max_body_size 20m;

 

    location / {

        root  /var/www/dms;

        index index.html;

        try_files $uri $uri/ /index.html;

    }

 

    location /prod-api/ {

        proxy_pass http://127.0.0.1:8080/;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

    }

}

配置要点有三处。其一,try_files:前端路由使用 history 模式,刷新页面或直接访问子路径时需要回退到 index.html,缺少该配置会出现刷新后 404。其二,proxy_pass 末尾的斜杠:Nginx 会把 /prod-api 前缀去除后转发给后端,与前端的 VUE_APP_BASE_API 配置对应,漏写斜杠会导致后端收到带前缀的路径而返回 404。其三,client_max_body_size:后端上传限制为单文件 10MB、单次请求合计 20MBNginx 该值不小于后端限制即可,否则文件上传会被 Nginx 413 状态码拦截。

7.3 启用配置

代码 25 启用站点并重载 Nginx

sudo rm -f /etc/nginx/sites-enabled/default

sudo nginx -t

sudo systemctl reload nginx

Ubuntu 默认站点同样监听 80 端口,需要先删除其软链接避免冲突。nginx -t 校验通过后重载生效;若校验失败,请根据提示检查配置文件的语法。