NAVY82·OPS 运维故障排查案例集
blog.navy82.icu / index / 01 ↑ 返回索引
#01 2026-08-16 故障排查 / 性能优化 / MQTT / PHP-FPM

智慧停车 + 充电桩 + 门禁平台 故障排查记录

服务未宕机5 真实问题5 运维隐患只读排查

对一套「智慧停车 + 充电桩 + 社区门禁」物联网平台进行只读排查:服务未宕机,但定位到 5 个真实问题(地锁控制失败、微信推送失败、退款失败、系统过载、设备误连开发环境)与 5 个运维隐患,按用户影响排序逐项给出处理方向。

服务器:[生产服务器](主机名已隐去)· 排查日期:2026-08-16 原则:只读排查,未做任何修改。涉及改动项均需确认后再操作。 说明:文中 IP、域名、实例 ID、订单号等均已脱敏。

总体结论

服务器没有服务宕机:Nginx、php-fpm(php56/php72)、EMQX、FTP、supervisord 均正常运行;阿里云 RDS MySQL/Redis 连接正常(PING 通);各消息队列积压为 0(图片上传等队列持续消费中)。但存在 5 个真实问题,按用户影响排序如下。

问题清单

① 地锁/设备控制频繁失败(充电桩应用)★最可能用户投诉点

  • 日志:/data/wwwroot/[应用A]/runtime/log/202608/16.log
  • 当日:482 次 switchLockByLot|未向设备成功发送指令 + 532 次 switchLockByLot|未在所属厂区设置由平台控制地锁(两者是同一次失败的成对日志
  • 根因:RfMqtt::lockOptionRfMqtt.php:101)在 region.is_platform_control != 1(或厂区 lot_id_str 未收录该车位)时,按安全逻辑主动拒绝下发地锁指令
  • 用户表现:地锁落不下/抬不起
  • 解决方向:在后台把相关厂区配置为"由平台控制地锁";属业务数据配置问题,需确认后修改

② 微信推送大面积失败

  • 门禁后台域名 当日 332 次 推送物业人员失败: 没有授权公众号:代码在 [门禁后台域名]/application/api/controller/Mqtt.php:225,原因是这些物业用户的 wx_bind.gzh_openid 为空(未绑定公众号)
  • EP 应用 公众号模板发送失败 errcode=48001 api unauthorized:公众号未开通模板消息权限或模板未配置
  • 43101 user refuse:用户主动关闭订阅消息,属正常,无需处理
  • 备注:如开发人员已帮授权公众号,上述 48001 / 没有授权公众号 类报错会自动消失,可观察确认

③ 退款失败

  • MsgQueueHandle.out.log 大量 退款失败,请在订单详情联系场站管理员(如 pay_amount=2.00、refund_amount=2.00)
  • 解决方向:查微信支付商户号退款失败原因码(常见:商户余额不足、参数错误)

④ 系统过载(整体变慢)

  • 4 核机器负载 5.75~8.0;php-fpm worker 高达 180 个(php72 max_children=100 + php56 max_children=50)
  • 8/13 php72-fpm 日志显示 park 后台查询超时 120s+ 被杀,有 failed to acquire scoreboard
  • 解决方向:下调 php-fpm 池(php72 建议 ≤30、php56 ≤20,配好 start/min/max_spare);开启 php-fpm slow log 定位慢查询

⑤ 一台设备误连 dev 服务器(死循环)

  • IP [异常设备IP](运营商已隐去)对 [开发环境域名] 持续 POST //device/login,已 361,947 次,仅刷此站点
  • 根因:该设备请求不带 User-Agent,被 protect.conf 的 UA 白名单规则拦成 403 → 设备无限重试;其上游 Node-RED 返回 404,说明 dev 不是它该连的服务器(正确地址应为生产 [核心业务平台域名]/device/login
  • 解决方向:设备端改配置指向生产服务器;或先在 dev vhost 加 deny [异常设备IP];(需备份 conf)

运维隐患(不紧急,建议后续处理)

  1. Supervisor 的 websocket 程序自 2026-06-05 起 FATAL:端口被手动启动的 Workerman(:2346)占用;当前 websocket 由手动进程服务,建议统一管理
  2. Supervisor 主日志被刷屏OvertimeCheckQueueHandle 的输出通道报 I/O operation on closed file,其 .out.log 已丢失,日志采集失效
  3. OvertimeCheckQueueHandle 任务反复失败overtime_fee=0,同一订单(如 [订单号])多次重投,疑似逻辑 bug,需开发确认
  4. park 收费规则缺失:当日 86 次 get_park_price:未配置蓝牌小汽车/新能源车辆收费规则可能计费错误,需在后台补齐规则
  5. ThinkPHP 调试页外泄:公网可触发完整异常页 + 环境变量,建议关闭 debug

已确认的关键事实

项目
主机名 已隐去,CentOS 7,内核 3.10,4核8G,无 swap
运行时长 393 天
MySQL 阿里云 RDS [阿里云RDS MySQL实例]
Redis 阿里云 RDS [阿里云RDS Redis实例]
MQTT 本机 EMQX(1883/8883/8081/8083/8084/18083)+ 远端 [远端MQTT服务器]
WebSocket Workerman websocket://0.0.0.0:2346(park 岗亭推送)
队列 全部消费正常,积压 0
异常流量 [异常设备IP] → dev 环境域名 361,947 次(仅此站)