这里来记录一个这段时间部署了两个项目都遇到的一个问题:宝塔面板部署SpringBoot应用,环境变量配置导致数据库连接失败问题解决!

1.问题描述

在使用宝塔面板部署SpringBoot应用时,配置文件中使用了环境变量来存储数据库连接信息

```yaml
spring:
  datasource:
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:123456}
```

应用启动时报错:

```
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
```

2.错误信息解读

Access denied for user 'root'@'localhost' (using password: YES)

这个错误信息告诉我们:

  • 用户:`root`
  • 主机: `localhost`
  • 使用密码:是(`using password: YES`)
  • 结果:访问被拒绝(`Access denied`)

这说明:

(1)应用确实尝试使用 `root` 用户连接数据库

(2)应用确实提供了密码(不是空密码)

(4)但是密码不正确,或者用户权限有问题

3.问题原因分析

Spring Boot支持通过 `${变量名:默认值}` 的语法从环境变量中读取配置。当环境变量存在时,使用环境变量的值;不存在时,使用默认值。

那么为什么会出现 `Access denied` 错误呢?核心原因就是环境变量没有正确传递给Java进程。

当出现 `Access denied for user 'root'@'localhost' (using password: YES)` 错误时,通常有以下几种情况:

(1) 情况一:环境变量未设置【最常见】

环境变量 `DB_USERNAME` 和 `DB_PASSWORD` 没有被设置

结果就会导致Spring Boot使用对应的默认值 (比如本地配置文件设置的是`root` 和 `123456`那么就会使用到这个默认的值,而不是对应环境变量设置的用户密码)

所以问题就来了,如果MySQL的root密码不是 `123456`,就会导致认证失败

(2)情况二:环境变量设置方式不正确

在宝塔面板中,很多开发者会尝试在启动命令中直接设置环境变量:

```bash
DB_USERNAME=root DB_PASSWORD=root2026122 java -jar app.jar
```

问题就在于宝塔面板的Java项目管理不会自动解析这种格式的环境变量设置。它会把 `DB_USERNAME=root` 当作命令的一部分,而不是环境变量。那么自然而然就还会使用对应的默认值啦

(3)情况三:环境变量作用域问题

即使你在服务器的 `~/.bashrc` 或 `~/.profile` 中设置了环境变量:

```bash
export DB_USERNAME=****
export DB_PASSWORD=*****
```

这个情况的问题就是这些环境变量只在 " 交互式shell会话  " 中生效。当宝塔面板通过系统服务或后台进程启动应用时,不会加载这些配置文件中的环境变量。

4.解决方案

方案一:在宝塔面板中配置环境变量(推荐)

这是最直接、最可靠的解决方案。

步骤1:修改启动命令

在宝塔面板的"Java项目"管理中,找到"项目启动命令",去掉环境变量部分:

**错误示例:**
```bash
DB_USERNAME=**** DB_PASSWORD=**** /www/server/java/jdk-17.0.8/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/back/app.jar
```
**正确示例:**
```bash
/www/server/java/jdk-17.0.8/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/back/app.jar
```

步骤2:配置环境变量

a. 在"环境变量"选项中,选择 "指定变量"

b. 在文本框中输入环境变量,每行一个,格式为 `KEY=VALUE`:

```
DB_USERNAME=****
DB_PASSWORD=****
```

注意事项:

  • 每行只能写一个环境变量
  • 格式必须是 `变量名=变量值`,不要有多余空格
  • 不要加引号
  • 变量名区分大小写

步骤3:保存并启动

保存配置后,点击"启动"按钮。宝塔面板会将环境变量正确传递给Java进程。

剩下的方案就是,使用启动脚本、使用env命令,后续再更新了,写的有点累了。。。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐