自动化发布故障排查指南:从DNS到权限的九个坑

? 自动化发布故障排查指南
从 DNS 解析到目录权限的九个坑 · 每个都踩过,每个都有解
1
蚁小二 API 域名解析失败
DNS? 症状:发布脚本报
socket.gaierror 或 Temporary failure in name resolution,蚁小二相关 API 全部不可用,其他服务正常。? 根因:服务器 DNS 缓存污染或上游 DNS 服务器(如 114.114.114.114 / 8.8.8.8)瞬时不响应蚁小二域名的权威解析。
# 确认 DNS 是否正常
dig api.yixiaoer.com +short
nslookup api.yixiaoer.com 114.114.114.114
# 检查系统 DNS 配置
cat /etc/resolv.conf
# 测试备用 DNS
dig @223.5.5.5 api.yixiaoer.com
✅ 解决方案:等待 5–15 分钟自动恢复;在
/etc/resolv.conf 添加备用 DNS(如 nameserver 223.5.5.5);若频繁发生,将域名解析结果硬编码到 /etc/hosts 做 fallback。
2
WAN 2.7 免费额度耗尽 — 403 AllocationQuota
配额? 症状:调用 WAN 2.7 文生图 API 返回
403 {"error":"AllocationQuotaExceeded"},此前一直正常。? 根因:WAN 2.7 免费额度(每月约 2000 次)用完后,API 直接拒绝请求。
# 查看当前配额使用量(需替换 YOUR_API_KEY)
curl -s -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.wan2-7.example.com/v1/quota" | jq .
# 检查错误响应头(确认是配额拒绝)
curl -sv https://api.wan2-7.example.com/v1/generation 2>&1 | grep -i "x-ratelimit\|x-quota"
✅ 解决方案:在 WAN 控制台开启付费模式(按量计费,约 ¥0.02/次),或充值后提升配额上限;脚本中添加配额预警逻辑,余额低于 10% 时发送通知。
3
auto_publish_v2.py 卡死
超时? 症状:脚本运行到蚁小二 API 调用处无响应,不报错也不结束,进程在后台挂起数小时。
? 根因:蚁小二 API 客户端使用默认的
requests 库,未设置 timeout 参数,API 服务端 TCP 连接未关闭,导致脚本死等。# 查找卡死的进程
ps aux | grep auto_publish_v2
# 查看进程的栈回溯(确认卡住的位置)
strace -p <PID> -e trace=network 2>&1 | tail -20
# 检查当前网络连接
ss -tpn | grep <PID>
# 或在代码中增加调试日志
# import requests; resp = requests.get(url, timeout=30)
✅ 解决方案:所有 HTTP 调用显式设置
timeout:requests.get(url, timeout=(5, 30))(连接超时 5s,读取超时 30s);添加全局 signal.alarm 兜底;在 CI/CD 中加 timeout 命令包装脚本。
4
MiniMax 图片成功但发布无图
HEAD 陷阱? 症状:MiniMax 图片生成成功(返回 200),日志里图片 URL 也正常,但发布的文章里图片裂了(显示不出来)。
? 根因:发布平台抓取图片时先发
HEAD 请求验证可访问性,MiniMax 的 CDN 对 HEAD 请求返回 403(只允许 GET),导致平台跳过图片下载。# 复现 HEAD 拒绝
curl -I "https://minimax-cdn.example.com/generated/xxx.png"
# 对比 GET 正常
curl -s -o /dev/null -w "%{http_code}" "https://minimax-cdn.example.com/generated/xxx.png"
# 查看实际响应头(确认拒绝原因)
curl -sv -X HEAD "https://minimax-cdn.example.com/generated/xxx.png" 2>&1
✅ 解决方案:生成图片后主动下载到本地,转存到支持 HEAD 的图床(如阿里云 OSS + CDN),再用新 URL 发布;或在发布前用
requests.head() 预检查,若返回 403 则自动转存。
5
头条号封面过期 403
CDN 失效? 症状:发布到头条号时封面图不显示,手动打开图片链接返回
403,但之前刚生成时能正常访问。? 根因:AI 生成的图片 URL 使用临时 CDN 或带时间戳的签名(如阿里云 OSS 的
?OSSAccessKeyId=xxx&Expires=xxx),过期后访问被拒绝。# 检查图片 URL 是否带过期参数
echo "https://example.com/img.png?Expires=1712345678&..." | grep -oP 'Expires=\K\d+'
# 转换时间戳确认过期
date -d @1712345678
# 验证当前状态
curl -I "https://example.com/img.png?Expires=1712345678&..."
✅ 解决方案:在生成封面后立即下载到本地,转存到自有稳定 CDN(如阿里云 OSS + CDN / Cloudflare R2),用永久 URL 替代临时签名 URL;为 OSS 对象设置
Cache-Control: max-age=31536000。
6
ZBlog 发布目录权限问题
? 症状:脚本向 ZBlog 发布时写文件成功但页面 500,或部分资源 404,重启后依然报错。
? 根因:ZBlog 的
zb_users/cache/、zb_users/upload/ 目录属主为 root 但 web 用户是 www-data,导致写入缓存或上传文件时权限不足;或 zb_system/ 下的某些文件权限为 644 而非 755。# 检查目录属主和权限
ls -la /var/www/html/zb_users/cache/
ls -la /var/www/html/zb_users/upload/
stat -c "%a %U:%G" /var/www/html/zb_users/cache/
# 检查 web 服务运行用户
ps aux | grep -E "nginx|apache|httpd" | grep -v grep
# 查看错误日志
tail -100 /var/log/nginx/error.log | grep -i "permission denied"
tail -100 /var/log/apache2/error.log | grep -i "permission"
✅ 解决方案:
chown -R www-data:www-data /var/www/html/zb_users/;目录设为 755(find /var/www/html -type d -exec chmod 755 {} \;),文件设为 644;确保 zb_system/ 内 PHP 脚本可执行。setfacl 方式也可用于更精细的控制。