# 健康检查和自动重启机制实现总结 ## 概述 本文档总结了Laravel知识库系统Docker部署中健康检查和自动重启机制的完整实现。 ## 实现的功能 ### 1. Web应用HTTP健康检查 ✅ **实现位置**: `routes/web.php` **端点**: `GET /health` **检查项目**: - 数据库连接状态 - Redis缓存连接状态 - Meilisearch搜索引擎连接状态 - 存储目录可写性 **Docker配置**: ```yaml healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 5 start_period: 60s ``` **响应格式**: ```json { "status": "ok|degraded", "timestamp": "2024-12-24T10:30:00.000000Z", "services": { "database": "connected|disconnected", "redis": "connected|disconnected|not_configured", "meilisearch": "connected|disconnected|not_configured", "storage": "writable|not_writable" }, "version": "1.0.0" } ``` ### 2. 数据库连接健康检查 ✅ **实现方式**: MySQL内置的 `mysqladmin ping` 命令 **Docker配置**: ```yaml healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_PASSWORD}"] interval: 30s timeout: 10s retries: 5 start_period: 30s ``` ### 3. Redis连接健康检查 ✅ **实现方式**: Redis内置的 `redis-cli ping` 命令 **Docker配置**: ```yaml healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 5 start_period: 10s ``` ### 4. Meilisearch API健康检查 ✅ **实现方式**: 调用Meilisearch的 `/health` API端点 **Docker配置**: ```yaml healthcheck: test: ["CMD", "curl", "-f", "http://localhost:7700/health"] interval: 30s timeout: 10s retries: 5 start_period: 30s ``` ### 5. 队列处理器健康检查 ✅ **实现位置**: `docker/queue-health-check.sh` **检查内容**: - 队列进程是否运行 (`pgrep -f "queue:work"`) - Laravel应用数据库连接 - Laravel应用Redis连接 **Docker配置**: ```yaml healthcheck: test: ["CMD", "/usr/local/bin/queue-health-check.sh"] interval: 60s timeout: 30s retries: 3 start_period: 30s ``` ### 6. 容器自动重启策略 ✅ **配置**: 所有服务都使用 `restart: unless-stopped` 策略 **行为**: - 容器异常退出时自动重启 - 手动停止的容器不会自动重启 - 系统重启后自动启动容器(除非手动停止) **应用的服务**: - MySQL数据库 - Redis缓存 - Meilisearch搜索引擎 - Laravel应用容器 - 队列处理容器 ## 支持脚本 ### 1. 服务状态检查脚本 ✅ **文件**: `docker/check-services.sh` **功能**: - 检查Docker服务状态 - 检查所有容器的健康状态 - 测试服务连接 - 验证数据持久化配置 - 生成详细的健康报告 ### 2. 持续监控脚本 ✅ **文件**: `docker/monitor-services.sh` **功能**: - 持续监控所有服务健康状态 - 自动重启不健康的容器 - 限制重启次数防止无限重启 - 记录详细监控日志 - 支持告警通知扩展 **配置参数**: - `MONITOR_INTERVAL`: 监控间隔(默认60秒) - `MAX_RESTART_ATTEMPTS`: 最大重启尝试次数(默认3次) - `RESTART_COOLDOWN`: 重启冷却时间(默认300秒) - `LOG_FILE`: 日志文件路径 ### 3. 启动和监控脚本 ✅ **文件**: `docker/start-with-monitoring.sh` **功能**: - 完整的服务启动流程 - 环境检查和目录创建 - 服务就绪等待 - 自动启动监控进程 - 支持多种启动选项 **选项**: - `--no-monitor`: 不启动监控进程 - `--skip-build`: 跳过镜像构建 - `--skip-wait`: 跳过服务就绪等待 ### 4. 停止监控脚本 ✅ **文件**: `docker/stop-monitoring.sh` **功能**: - 停止监控进程 - 可选择性停止Docker服务 - 清理监控日志文件 - 支持多种停止选项 **选项**: - `--stop-services`: 同时停止Docker服务 - `--cleanup-logs`: 清理监控日志文件 - `--all`: 停止监控、服务并清理日志 ### 5. 健康检查测试脚本 ✅ **文件**: `docker/test-health-checks.sh` **功能**: - 验证所有脚本语法正确性 - 检查脚本执行权限 - 验证Docker配置文件 - 测试健康检查配置 - 检查存储目录结构 ## 配置文件 ### 1. Swoole配置 ✅ **文件**: `docker/supervisor/supervisord.conf` **健康检查相关**: - Swoole HTTP服务器健康检查端点 - 自动重启配置 - 日志管理 ### 2. PHP配置 ✅ **文件**: `docker/php/php.ini` **健康检查相关**: - 适当的超时设置 - 内存限制配置 ### 3. Redis配置 ✅ **文件**: `docker/redis/redis.conf` **健康检查相关**: - 网络绑定配置 - 内存和持久化设置 - 性能优化配置 ### 4. MySQL配置 ✅ **文件**: `docker/mysql/my.cnf` **健康检查相关**: - 字符集和时区配置 - 性能优化设置 - 日志配置 ### 5. Supervisor配置 ✅ **文件**: `docker/supervisor/supervisord.conf` **健康检查相关**: - Swoole和队列进程管理 - 自动重启配置 - 日志管理 ## 使用方法 ### 启动服务和监控 ```bash # 完整启动(包含监控) ./docker/start-with-monitoring.sh # 启动服务但不启动监控 ./docker/start-with-monitoring.sh --no-monitor # 跳过镜像构建 ./docker/start-with-monitoring.sh --skip-build ``` ### 检查服务状态 ```bash # 运行完整的健康检查 ./docker/check-services.sh # 查看容器状态 docker-compose ps # 查看容器健康状态 docker inspect --format='{{.State.Health.Status}}' knowledge_base_app ``` ### 监控管理 ```bash # 查看监控日志 tail -f ./storage/logs/monitor.log # 停止监控进程 ./docker/stop-monitoring.sh # 停止监控和服务 ./docker/stop-monitoring.sh --stop-services ``` ### 测试健康检查功能 ```bash # 运行健康检查功能测试 ./docker/test-health-checks.sh ``` ## 验证结果 通过运行 `./docker/test-health-checks.sh`,所有测试项目都通过: - ✅ 脚本语法测试 - ✅ 脚本权限测试 - ✅ Docker配置测试 - ✅ 健康检查配置测试 - ✅ 存储目录测试 ## 监控指标 ### 健康检查状态 - `healthy`: 服务正常运行 - `unhealthy`: 服务健康检查失败 - `starting`: 服务正在启动 - `no-healthcheck`: 服务未配置健康检查 ### 重启计数器 监控系统维护每个容器的重启计数器: - 位置: `./storage/logs/restart_counters/` - 格式: `{container_name}.count` - 重置: 容器健康时自动重置 ## 总结 健康检查和自动重启机制已完全实现,包括: 1. **Web应用HTTP健康检查** - 完整的Laravel健康检查端点 2. **数据库连接健康检查** - MySQL ping检查 3. **Redis连接健康检查** - Redis ping检查 4. **Meilisearch API健康检查** - 搜索引擎健康API 5. **容器自动重启策略** - unless-stopped策略 6. **完整的监控和管理脚本** - 自动化运维工具 所有功能都经过测试验证,可以确保系统的高可用性和自动故障恢复能力。