Skip to content

故障排查

本文档汇总了 MISEB 系统常见问题及解决方案。

快速诊断流程

遇到问题时,请按以下顺序排查:

1. 检查容器状态 → docker ps -a
2. 查看错误日志 → docker logs <容器名>
3. 检查网络连通 → docker network inspect
4. 检查资源使用 → docker stats
5. 检查端口占用 → netstat -tlnp

服务启动问题

脚本报错 $'\r': command not found

症状:执行启动脚本或读取配置文件时提示:

bash
.env: line 5: $'\r': command not found

bash
-bash: ./start.sh: /bin/bash^M: bad interpreter: No such file or directory

原因:文件在Windows环境下编辑或保存,换行符为 CRLF\r\n),而Linux仅识别 LF\n)。

解决方案

方法一:使用sed命令转换(推荐)

bash
# 转换单个文件
sed -i 's/\r$//' .env

# 批量转换所有脚本和配置文件
sed -i 's/\r$//' *.sh *.yml .env*

# 转换整个目录下的所有相关文件
find . -name "*.sh" -exec sed -i 's/\r$//' {} \;
find . -name "*.yml" -exec sed -i 's/\r$//' {} \;
find . -name ".env*" -exec sed -i 's/\r$//' {} \;

方法二:使用dos2unix工具

bash
# 安装dos2unix
# CentOS/RHEL
yum install -y dos2unix

# Ubuntu/Debian
apt-get install -y dos2unix

# 转换单个文件
dos2unix .env
dos2unix start.sh

# 批量转换
dos2unix *.sh *.yml .env*

方法三:使用tr命令

bash
# 转换文件
tr -d '\r' < .env > .env.tmp && mv .env.tmp .env

方法四:使用vim编辑器

bash
# 打开文件
vim .env

# 在vim中执行命令转换格式
:set ff=unix
:wq

预防措施

  • 在Windows上使用支持Unix换行符的编辑器(如VS Code、Notepad++)
  • VS Code中设置:文件 → 首选项 → 设置 → 搜索 "eol" → 选择 \n
  • Notepad++中:编辑 → 文档格式转换 → 转换为Unix格式

容器启动失败

症状:容器状态显示 ExitedRestarting

排查步骤

bash
# 1. 查看容器状态
docker ps -a

# 2. 查看容器日志
docker logs miseb-admin

# 3. 查看详细错误
docker logs --tail 100 miseb-admin

常见原因及解决方案

原因解决方案
内存不足调小JVM参数或增加服务器内存
端口被占用停止占用端口的服务或修改端口
配置错误检查.env文件配置
依赖服务未启动先启动基础设施服务

MySQL启动失败

症状miseb-mysql 容器启动失败

排查

bash
docker logs miseb-mysql

常见问题

  1. 权限问题
bash
# 检查数据目录权限
ls -la /var/lib/docker/volumes/miseb-mysql-data/

# 修复权限
docker run --rm -v miseb-mysql-data:/data alpine chown -R 999:999 /data
  1. 数据目录损坏
bash
# 备份数据后删除数据卷
docker volume rm miseb-mysql-data

# 重新创建并初始化
docker compose up -d mysql

Elasticsearch启动失败

症状:ES容器一直重启

排查

bash
docker logs miseb-elasticsearch

常见问题

  1. vm.max_map_count 太小
bash
# 临时设置
sudo sysctl -w vm.max_map_count=262144

# 永久设置
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
  1. 内存不足

修改 .env 文件:

bash
ES_JAVA_OPTS=-Xms256m -Xmx256m
  1. 数据目录权限
bash
docker run --rm -v miseb-es-data:/data alpine chown -R 1000:1000 /data

Java服务OOM

症状:日志显示 OutOfMemoryError

解决方案

  1. 调整JVM内存配置:
bash
# 修改 .env
ADMIN_JAVA_OPTS=-Xms256m -Xmx512m -XX:+UseG1GC
FRONT_JAVA_OPTS=-Xms256m -Xmx512m -XX:+UseG1GC
  1. 重启服务:
bash
docker compose up -d --force-recreate

连接问题

数据库连接失败

症状:日志显示 Communications link failureConnection refused

排查

bash
# 1. 检查MySQL是否运行
docker ps | grep mysql

# 2. 测试连接
docker exec miseb-admin ping -c 3 mysql

# 3. 检查MySQL日志
docker logs miseb-mysql

解决方案

  1. 确保MySQL已启动:
bash
docker compose up -d mysql
  1. 等待MySQL就绪:
bash
until docker exec miseb-mysql mysqladmin ping -h localhost --silent; do
    echo "等待MySQL启动..."
    sleep 5
done
  1. 检查用户权限:
bash
docker exec miseb-mysql mysql -uroot -p -e "SELECT user, host FROM mysql.user;"

Redis连接失败

症状:日志显示 Unable to connect to Redis

排查

bash
# 1. 检查Redis状态
docker ps | grep redis

# 2. 测试连接
docker exec miseb-redis redis-cli -a 'password' ping

解决方案

  1. 确保Redis已启动
  2. 检查密码配置是否正确
  3. 检查网络连通性

容器间网络不通

症状:容器之间无法互相访问

排查

bash
# 查看网络
docker network ls

# 查看容器所在网络
docker inspect miseb-admin | grep -A 20 "Networks"

# 查看网络详情
docker network inspect miseb-network

解决方案

确保所有容器在同一网络:

bash
# 将容器连接到网络
docker network connect miseb-network miseb-admin

访问问题

页面404

症状:访问页面返回404错误

排查

bash
# 1. 检查Nginx状态
docker ps | grep nginx

# 2. 检查Nginx配置
docker exec miseb-nginx nginx -t

# 3. 检查静态文件
docker exec miseb-nginx ls -la /usr/share/nginx/html/

解决方案

  1. 重载Nginx配置:
bash
docker exec miseb-nginx nginx -s reload
  1. 检查前端文件是否正确部署

API请求失败

症状:API返回500错误或超时

排查

bash
# 1. 检查后端健康状态
curl -v http://localhost:8080/actuator/health
curl -v http://localhost:8081/actuator/health

# 2. 查看后端日志
docker logs --tail 100 miseb-admin
docker logs --tail 100 miseb-front

解决方案

  1. 检查数据库连接
  2. 检查Redis连接
  3. 查看详细错误日志

上传文件失败

症状:文件上传返回错误

排查

bash
# 检查MinIO状态
curl http://localhost:9000/minio/health/live

# 检查MinIO日志
docker logs miseb-minio

解决方案

  1. 检查MinIO配置
  2. 检查存储空间
  3. 检查文件大小限制

性能问题

响应缓慢

症状:页面加载或API响应很慢

排查

bash
# 1. 查看资源使用情况
docker stats --no-stream

# 2. 查看系统负载
top -bn1 | head -20

# 3. 查看磁盘IO
iostat -x 1 5

解决方案

  1. 内存不足:增加服务器内存或优化JVM配置
  2. CPU过高:检查是否有异常进程
  3. 磁盘IO高:考虑使用SSD
  4. 网络问题:检查带宽使用

内存占用过高

症状docker stats 显示内存使用率很高

解决方案

  1. 优化JVM配置:
bash
# 减小堆内存
ADMIN_JAVA_OPTS=-Xms256m -Xmx512m
FRONT_JAVA_OPTS=-Xms256m -Xmx512m
ES_JAVA_OPTS=-Xms256m -Xmx256m
  1. 清理缓存:
bash
# 清理Redis缓存(谨慎操作)
docker exec miseb-redis redis-cli -a 'password' FLUSHDB

磁盘空间不足

症状:服务异常,日志显示磁盘空间不足

排查

bash
# 查看磁盘使用
df -h

# 查看Docker占用
docker system df

# 查看大文件
du -sh /* | sort -rh | head -20

解决方案

  1. 清理Docker资源:
bash
# 清理未使用的镜像
docker image prune -a

# 清理未使用的容器
docker container prune

# 清理构建缓存
docker builder prune
  1. 清理日志文件:
bash
# 查找大日志文件
find /var/lib/docker/containers -name "*.log" -size +100M

# 清空日志文件
truncate -s 0 /var/lib/docker/containers/<container-id>/*.log

日志分析

常见错误日志

Connection refused

java.net.ConnectException: Connection refused

原因:目标服务未启动或端口不正确

解决:检查目标服务状态和端口配置

Access denied

java.sql.SQLException: Access denied for user

原因:数据库用户名或密码错误

解决:检查 .env 中的数据库配置

No space left on device

Error: No space left on device

原因:磁盘空间不足

解决:清理磁盘空间

Out of memory

java.lang.OutOfMemoryError: Java heap space

原因:JVM堆内存不足

解决:增加JVM堆内存配置

恢复操作

重置服务

如果问题无法解决,可以尝试重置服务:

bash
# 停止所有服务
./stop.sh

# 删除容器(保留数据)
docker compose down

# 重新启动
./start.sh

完全重置(危险)

警告

以下操作会删除所有数据,请先备份!

bash
# 停止并删除所有容器和数据卷
docker compose down -v

# 重新部署
./start.sh

获取帮助

如果以上方法都无法解决问题,请收集以下信息后联系技术支持:

  1. 系统信息
bash
uname -a
docker version
docker compose version
  1. 容器状态
bash
docker ps -a
  1. 错误日志
bash
docker logs --tail 500 miseb-admin > admin.log
docker logs --tail 500 miseb-front > front.log
  1. 资源使用
bash
docker stats --no-stream > stats.log
free -m
df -h

联系方式

成都艾唯特软件有限公司