能,workerman可在群晖nas上运行,但需绕过dsm进程管理,用ssh命令行启动并配置开机自启;前提是安装php 7.4/8.0/8.1、启用openssl/pcntl/posix/sockets扩展,修改端口后执行php start.php start -d,并通过任务计划绑定“开机时”事件。

Workerman主动推送信息在群晖NAS上能跑起来吗——答案是能,但必须绕过DSM的进程管理机制,用纯命令行方式启动并保持常驻,否则Web Station或Task Scheduler启动后几秒就会被系统强制终止。
确认NAS环境是否支持PHP CLI与扩展
登录DSM → 控制面板 → 终端机和SNMP → 启用SSH服务 → 用PuTTY或终端SSH连接到NAS(用户名为admin,密码同DSM登录密码)。
执行php -v,确认输出PHP版本不低于7.4;若报错“command not found”,说明未安装PHP套件,需先去套件中心安装“PHP”并勾选“启用PHP CLI”选项。
【关键前提】必须安装PHP 7.4或8.0/8.1版本,PHP 8.2+因Workerman未完全适配会出现socket_create()失败;且需确保openssl、pcntl、posix、sockets这四个扩展已启用——在套件中心→PHP设置→扩展中逐个勾选,不勾选会导致workerman无法创建监听进程。
下载并解压web-msg-send到指定路径
在SSH中执行:cd /volume1/web(确保该目录已存在且有读写权限)。
执行:wget https://github.com/walkor/web-msg-send/archive/refs/heads/master.zip && unzip master.zip && mv web-msg-send-master web-msg-send。
这一步操作起来很简单,直接把文件拖进去就行。但注意:不要解压到/tmp或/var/tmp,这些目录在重启后会被清空;也不要放在/home或/root下,DSM会限制非volume分区的持久化写入。
修改配置并启动服务
进入/volume1/web/web-msg-send目录,用nano编辑config.php:
将'host' => '0.0.0.0'保持不变;把'port' => 2121改为一个DSM未占用的端口,比如2122;确认'ssl' => false,群晖默认不提供SSL证书绑定到任意端口的能力,强行开true会导致启动失败。
执行:php start.php start -d,看到输出Workerman[xxx] start in daemon mode即表示后台运行成功。
验证是否存活:ps aux | grep web-msg-send,应能看到至少两个php进程(master + worker);再执行netstat -tuln | grep 2122,确认端口处于LISTEN状态。
配置开机自启(防止NAS重启后服务消失)
第一步:新建脚本/volume1/scripts/start_workerman.sh,内容为:
#!/bin/sh<br>cd /volume1/web/web-msg-send<br>/usr/local/bin/php start.php start -d
第二步:赋予执行权限:chmod +x /volume1/scripts/start_workerman.sh。
第三步:进入DSM → 控制面板 → 任务计划 → 创建 → 触发的任务 → 用户定义的脚本 → 选择刚建的sh文件 → 设置“事件”为“开机时” → 保存。
注意:不能用“计划任务”里的“每5分钟执行一次”来轮询启动,那样会造成多个重复进程堆积;必须绑定“开机时”事件,且脚本内要确保只起一个实例——Workerman自身有防重复机制,但前提是脚本不带-d以外的参数。
测试推送接口是否可用
方法一:在浏览器中访问http://你的NAS局域网IP:2122/?type=publish&content=Hello%20from%20Synology,页面返回{"status":"success"}即成功。
方法二:用curl测试:curl "http://192.168.1.100:2122/?type=publish&to=1001&content=test",其中to=1001为用户ID,用于定向推送(需前端JS配合订阅)。
如果返回空白页或Connection refused,请检查防火墙是否放行该端口(控制面板→安全性→防火墙→编辑规则→添加TCP端口2122)。











