Skip to content

部署常见问题

本文档汇总了部署 ANGRY ANT 框架时最常遇到的问题及解决方案。


Shell 脚本在 Linux 上执行报错

问题

在 Windows 环境下编辑的 run.sh 上传到 Linux 服务器后,执行时出现:

bash
[root@ecs-dvg3 py]# ./run.sh start
: No such file or directory

原因

Windows 使用 CRLF\r\n)换行符,Linux 使用 LF\n)。shebang 行 #!/bin/bash\r 中的 \r 导致系统找不到解释器。

解决方案

方法一:在 Linux 上直接修复(最快)

bash
# 使用 sed 移除 \r 字符
sed -i 's/\r$//' run.sh

# 或使用 tr 命令
tr -d '\r' < run.sh > run.sh.tmp && mv run.sh.tmp run.sh

# 或使用 vim
vi run.sh
# 在 vim 中执行::set ff=unix
# 然后保存::wq

方法二:使用 dos2unix 工具

bash
# 安装
yum install dos2unix       # CentOS/RHEL
apt-get install dos2unix   # Ubuntu/Debian

# 转换
dos2unix run.sh

方法三:使用 PowerShell(Windows 端)

powershell
$content = Get-Content "run.sh" -Raw
$content = $content -replace "`r`n", "`n"
[System.IO.File]::WriteAllText("run.sh", $content, [System.Text.Encoding]::UTF8)

验证修复

bash
# 检查文件类型
file run.sh
# 正常:ASCII text
# 异常:ASCII text, with CRLF line terminators

# 查看第一行
head -1 run.sh | od -c | head -1
# 应该看到:#!/bin/bash \n(没有 \r)

预防措施

bash
# 配置 Git 自动转换
git config --global core.autocrlf input

JVM 参数配置警告

问题

启动时出现以下警告:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file /logs/xxx/GC/xxx-gc.log due to No such file or directory

原因

  • PermSize / MaxPermSize 在 Java 8 中已废弃(改用 Metaspace)
  • CMS 垃圾收集器在 Java 9 开始废弃,Java 14 已完全移除
  • GC 日志路径不存在

解决方案

使用现代化的 JVM 参数配置:

bash
JVM="-server \
  -Xms2g -Xmx2g \
  -Xmn512m \
  -Xss256k \
  -Djava.awt.headless=true \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -Xlog:gc*:file=/logs/angryant-biz-blank/gc.log:time,uptime:filecount=10,filesize=100M"

参数变更对照表:

旧参数(已废弃)新参数说明
-XX:PermSize=128M移除使用 Metaspace 自动管理
-XX:MaxPermSize=256m移除使用 Metaspace 自动管理
-XX:+CMSClassUnloadingEnabled移除CMS 已废弃
-XX:+CMSPermGenSweepingEnabled移除CMS 已废弃
-Xloggc:/path/gc.log-Xlog:gc*:file=/path/gc.log:time,uptime:filecount=10,filesize=100MJava 9+ 新语法

端口占用

问题

启动时报 Address already in use

解决

bash
# 查看端口占用(8080 为应用端口,请替换为你实际配置的端口)
netstat -tlnp | grep 8080

# 杀死占用进程
kill -9 <PID>

# 或修改应用端口(application-prod.yml 中的 server.port)

权限不足

问题

Permission denied 或无法写入日志

解决

bash
# 赋予脚本执行权限
chmod +x run.sh

# 赋予目录写权限
chmod -R 755 /home/java/your-project/

# 或使用 sudo 运行
sudo sh run.sh start

日志路径不存在

问题

启动失败,提示日志目录不存在

解决

bash
# 手动创建日志目录
mkdir -p /home/java/your-project/logs/

# 确保有写权限
chmod -R 755 /home/java/your-project/

run.shstart() 方法中自动创建日志目录:

bash
start(){
    is_exist
    if [ $? -eq "0" ]; then
        echo "${APP_NAME} is already running. pid=${pid} ."
    else
        # 确保日志目录存在
        mkdir -p /logs/angryant-biz-blank
        nohup java $JVM -jar $APP_NAME --spring.profiles.active=prod > /dev/null 2>&1 &
        echo "${APP_NAME} started successfully"
    fi
}

内存不足

问题

启动时报 Out of memoryJava heap space

解决

bash
# 查看服务器可用内存
free -h

# 调整 JVM 参数,降低堆内存
JVM="-server -Xms1g -Xmx4g ..."

# 或增加服务器物理内存 / 交换空间

数据库连接失败

问题

启动时报数据库连接异常

排查步骤

bash
# 1. 检查 MySQL 是否运行
systemctl status mysqld

# 2. 检查网络连通性
telnet your-mysql-host 3306

# 3. 检查用户名密码是否正确
mysql -h your-mysql-host -u your_user -p

# 4. 核对配置文件中的数据库连接信息
cat application-prod.yml | grep -A 5 datasource

Redis 连接失败

问题

启动时报 Redis 连接异常

排查步骤

bash
# 1. 检查 Redis 是否运行
systemctl status redis

# 2. 测试连接
redis-cli -h 127.0.0.1 -p 6379 -a your_password ping

# 3. 检查 Redis 密码配置
redis-cli -h 127.0.0.1 -p 6379 CONFIG GET requirepass

前端页面空白或接口 404

问题

前端页面能打开但数据加载不出来,或接口返回 404

排查步骤

  1. 检查 Nginx 代理配置:确认 proxy_pass 地址和路径正确
  2. 检查后端是否启动curl http://localhost:8080(8080 为默认端口,请替换为你实际配置的端口)
  3. 检查浏览器控制台:查看 Network 面板中的请求地址和响应状态
  4. 检查 CORS 配置:跨域请求是否被拦截

基于 MIT 许可发布.