系统安装

汇总性教程

内容管理

栏目管理

静态管理和缓存管理

标签和模板

模板教程

常见疑难问题

二次开发教程

动静态分离部署

首页 >  国微CMS教程 >  系统安装 >  安装环境
CentOS下部署Go调度引擎完整教程

适用环境:项目已安装于 /data/wwwroot/sharpgit/ 的 CentOS Linux 服务器(CentOS 7 及以上,含 systemd)。
目标:一键完成 Go 执行引擎的安装、配置、开机自启与健康自检,使计划任务由 Go 引擎以受控并发方式执行。

一、部署前准备

需准备两个文件(在 Windows 开发机上确认存在):

文件 作用 位置
go_scheduler_linux_amd64 Go 调度引擎 Linux 二进制(amd64 架构) 项目 go_service/go_scheduler/ 目录
deploy_sharp_scheduler.sh 一键部署脚本(自动探测路径、自动生成配置) 项目根目录

提示:建议先在后台“计划任务-调度配置”确认并发数、分级超时、重型任务名单并保存(保存会自动重新生成部署脚本),再上传服务器,保证脚本与配置同源。

二、一键部署(3 步完成)

第 1 步:在项目根目录下确认文件是否有在服务当中:

/项目根目录/go_service/go_scheduler/go_scheduler_linux_amd64
/项目根目录/deploy_sharp_scheduler.sh
登录后台并访问http://你的项目管理后台/admin.php/core/crontab-config 启用Go执行引擎并配置参数,让系统重新生成deploy_scheduler.sh文件。

第 2 步:登录服务器,使用 root 执行:

cd /项目的根目录
sed -i 's/\r$//' deploy_sharp_scheduler.sh   # 防 CRLF 行尾(可选)
bash deploy_sharp_scheduler.sh

第 3 步:脚本自动完成 7 个步骤:

  1. 自动探测项目根目录(识别到 /data/wwwroot/sharpgit,无需手工指定路径)
  2. 自动探测 PHP 二进制路径(PATH 与常见安装路径)
  3. 安装 Go 引擎二进制到 /usr/local/bin/go_scheduler
  4. 生成配置文件 /etc/sharp/go_scheduler.json(与后台“调度配置”一致)
  5. 配置 systemd 服务(开机自启 + 崩溃自动重启)
  6. 写入 crontab 调度入口(每 5 分钟触发 auto_crontab.php)
  7. 健康自检(curl 127.0.0.1:18080/health,回显 {"status":"ok"})

看到 “==== 部署成功 ====” 即部署完成。脚本任一步失败会立刻报错退出,可直接定位问题。

三、部署后验证

systemctl status go_scheduler        # 应为 active (running)
systemctl is-enabled go_scheduler    # 应为 enabled(开机自启)
curl -s http://127.0.0.1:18080/health   # 期望输出 {"status":"ok"}
tail -f /var/log/go_scheduler.log    # 引擎运行日志

浏览器打开后台“计划任务-调度配置”,Go 引擎当前状态应显示“运行中(HTTP 200)”;下次调度入口触发时,日志会出现 “[GO] submitted N task(s)”,表示任务已真正交给 Go 引擎执行。

四、手动分步部署(脚本报错时排查 / 不使用脚本时)

1. 安装二进制:

install -m 0755 /项目根目录/go_service/go_scheduler/go_scheduler_linux_amd64 /usr/local/bin/go_scheduler

2. 生成配置文件:

mkdir -p /etc/sharp
cat > /etc/sharp/go_scheduler.json <<'EOF'
{
  "listen": "127.0.0.1:18080",
  "php_bin": "/usr/bin/php",
  "crontab_dir": "/项目根目录/inc/crontab",
  "runner_script": "/项目根目录/inc/crontab/runner.php",
  "backfill_script": "/项目根目录/inc/crontab/backfill.php",
  "concurrency": "auto",
  "heavy_max": 0,
  "heavy_tasks": ["cms_index_to_html.php", "cms_spider.php", "db_backup.php"],
  "default_timeout": 300,
  "task_timeout": {"cms_spider.php": 3600, "default": 300},
  "log_file": "/var/log/go_scheduler.log"
}
EOF

3. 配置 systemd 服务并启动:

cat > /etc/systemd/system/go_scheduler.service <<'EOF'
[Unit]
Description=sharp Go Scheduler
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/go_scheduler -config /etc/sharp/go_scheduler.json
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now go_scheduler

4. 健康检查:

curl -s http://127.0.0.1:18080/health

5. 写入 crontab 调度入口(手动部署时需自行添加,否则任务不会定时触发):

*/5 * * * * /usr/bin/php /项目根目录/inc/crontab/auto_crontab.php # sharp-scheduler

五、常见问题排查

现象 原因 处理方法
[错误] 缺少 Go 引擎二进制 二进制未上传到项目 go_service/go_scheduler/ 目录 重新 scp 上传后再次执行脚本
健康检查未通过 / curl 连不上 端口被占用、二进制架构不符、SELinux 拦截 netstat -lnp | grep 18080 查端口;file /usr/local/bin/go_scheduler 查架构;临时 setenforce 0 测试 SELinux
服务器为 arm64 架构 脚本默认识别 amd64 二进制 使用 GOARCH=arm64 交叉编译,并将二进制命名为 go_scheduler 放入同一目录
[错误] 未找到 php 二进制 php 不在 PATH 且不在常见安装路径 export PATH=/自定义/php/bin:$PATH 后重跑,或手动指定
脚本报 $'\r' 相关错误 脚本为 CRLF 行尾 执行 sed -i 's/\r$//' deploy_sharp_scheduler.sh
系统无 systemctl 命令 CentOS 6 及更早版本不支持 systemd 改用 /etc/init.d/ 方式托管服务(或升级系统)

六、日常运维

  1. 修改调度参数:后台“计划任务-调度配置”修改并发/超时/重型名单后保存,部署脚本会自动重新生成;将新脚本上传覆盖并重新执行即可。轻量做法:只修改服务器上 /etc/sharp/go_scheduler.json 后执行 systemctl restart go_scheduler。
  2. 查看日志:journalctl -u go_scheduler -n 100 或 tail -f /var/log/go_scheduler.log。
  3. 监控指标:curl -s http://127.0.0.1:18080/metrics(Prometheus 格式,含各任务成功/失败/超时统计)。
  4. 停止与回滚:systemctl stop go_scheduler,并在 crontab -e 中删除标记为 # sharp-scheduler 的一行,即自动回退到 PHP 原生调度,不影响任务执行。

附录:调度引擎参数说明

参数 说明 默认值
concurrency 全局并发上限;auto 表示按 CPU 核数自动套用(2核=2 / 4核=3 / 8核+=4) auto
heavy_tasks 重型任务名单(静态化/采集/备份/分表等),同脚本绝不并发 内置 17 项评估名单
task_timeout 按脚本分级的超时时间(秒),未命中的使用 default default 300
min_start_interval 任务间最小启动间隔(秒),避免到期任务齐发 2
log_enabled 是否记录调度日志 true
相关内容