不能用root或www-data运行Workerman,因一旦被攻破将导致系统级或跨应用敏感信息泄露;应创建专用系统用户workerman(useradd -r -s /sbin/nologin -M -U workerman),并在代码中设置$worker->user='workerman'、$worker->group='workerman',同步确保日志目录、SSL证书等资源权限匹配,且仅限Linux生产环境有效。

为什么不能用root或www-data跑Workerman?
因为Workerman进程一旦被攻破,攻击者就直接拿到该用户能干的所有事。root能删整个系统,www-data可能顺手读取其他PHP应用的配置文件(比如数据库密码)。这不是假设——真实漏洞利用链里,exec()、反序列化或日志路径遍历之后,权限就是最后一道防线。
怎么创建一个真正“无害”的Workerman专用用户?
用useradd -r -s /sbin/nologin -M -U workerman这条命令。它同时做到四件事:
-
-r:标记为系统用户,UID自动落在1–999区间,不与普通用户冲突 -
-s /sbin/nologin:彻底禁用shell登录,连su - workerman都进不去 -
-M:不创建家目录,避免残留配置或缓存文件被滥用 -
-U:自动建同名主组workerman,后续设文件属组更干净
别手动指定-u 1001,除非你已确认该UID未被/etc/passwd和系统保留范围占用。
创建后必须改哪些地方?
Workerman代码里要显式设置运行用户,否则默认继承启动时的当前用户(很可能是root):
$worker = new Worker('websocket://0.0.0.0:2346');
$worker->user = 'workerman';
$worker->group = 'workerman';还要检查三处容易漏掉的地方:
- 日志目录(如
logs/)的属主必须是workerman:workerman,否则启动报failed to open stream: Permission denied - 如果Worker要读取SSL证书,证书文件权限不能是
600且属主不是workerman,否则stream_socket_enable_crypto()失败 - 用
systemd托管时,User=和Group=字段必须和代码里一致,否则setuid调用会因权限不足静默失败
Windows下这招还管用吗?
基本不管用。Windows没有真正的用户隔离机制,useradd不存在,pcntl_setuid()也不支持。你在Windows上设$worker->user只会触发警告,进程仍以当前Windows用户身份运行。所以——Workerman在Windows只适合开发调试,生产环境必须上Linux。


















