Linux发布java web
代码 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 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.sql、dms_city_data.sql、dms_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. Swagger:swagger.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-sass,Node.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 验证后端接口与日志
|
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、单次请求合计 20MB,Nginx 该值不小于后端限制即可,否则文件上传会被 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 校验通过后重载生效;若校验失败,请根据提示检查配置文件的语法。