Webman在Linux生产环境能稳定运行,必须同时满足五个硬性条件:PHP 8.0+、pcntl/posix/event真启用(需php --ri验证未被disable_functions屏蔽)、debug关闭、runtime目录权限与systemd用户严格一致、Nginx反代透传Connection/Upgrade头且proxy_pass不带尾部斜杠。

Webman 能不能在 Linux 生产环境跑起来,不取决于你写了多少路由,而取决于五个硬性条件是否全部满足:PHP 8.0+、pcntl/posix/event 真启用、debug 关闭、runtime/ 目录权限匹配 systemd 用户、Nginx proxy_pass 配置里没漏掉 Connection 和 Upgrade 头。缺一个,服务就可能“启动成功但实际不可用”。
检查 pcntl/posix/event 是否真可用,不是只看 php -m
很多部署失败卡在这一步:执行 php -m | grep -E "pcntl|posix|event" 看起来都加载了,但 php start.php start -d 一运行就退出,日志也没报错。
- 必须验证扩展是否被
disable_functions屏蔽:运行php --ri pcntl,如果输出里有Directive => Local Value行,才算真激活;若只有模块名,大概率是pcntl_fork或posix_kill被禁用了 -
event不是可选:Ubuntu/Debian 需额外装php-event包;CentOS/RHEL 得用pecl install event编译,且系统级libevent库必须已安装(ldconfig -p | grep event可查) - 别信宝塔面板 PHP 设置页的“已启用”勾选框——进去手动翻
php.ini,确认disable_functions里没写pcntl_fork,pcntl_waitpid,posix_kill
Nginx proxy_pass 必须透传真实 IP 和 WebSocket 头
只写 proxy_pass http://127.0.0.1:8787 是最常见错误配置。它会导致两个后果:$request->ip() 拿到全是 127.0.0.1,所有基于 IP 的限流/风控失效;WebSocket 连接建立后几秒就断开,因为 Upgrade 请求被静默降级。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 真实 IP 传递必须加这三行:
proxy_set_header X-Real-IP $remote_addr、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for、proxy_set_header X-Forwarded-Proto $scheme - WebSocket 支持必须加这三行:
proxy_http_version 1.1、proxy_set_header Connection "upgrade"、proxy_set_header Upgrade $http_upgrade -
proxy_pass后面不能带斜杠:http://127.0.0.1:8787/会把路径前缀吃掉,比如你 route 定义的是/api/v1,实际收到的是//api/v1
systemd 服务配置必须和 runtime/ 目录归属严格一致
服务能启动、也能 curl 通,但第二天发现日志不写了、session 文件消失、缓存不命中——90% 是因为 systemd 启动进程的用户和 runtime/ 所有者不一致。Linux 权限机制不会报错,只会默默拒绝写入。
- Ubuntu/Debian 下,设
User=www-data,同时执行:sudo chown -R www-data:www-data runtime/ - CentOS/RHEL 下,设
User=nginx,对应执行:sudo chown -R nginx:nginx runtime/ - 务必检查
WorkingDirectory指向项目根目录(如/var/www/webman),否则start.php读不到 config - 别漏掉
Restart=always和RestartSec=3,否则 worker 崩溃后不会自动拉起
启动后必须三步验证,不能只看命令返回 success
php start.php start -d 执行完就关终端?这是最危险的操作。Webman 启动是异步 fork 多进程,主进程退出不代表 worker 起来了。
- 查进程:
ps aux | grep webman,应看到至少两个进程:php start.php start(master)和若干worker子进程 - 查端口:
ss -tlnp | grep :8787(或你自定义的端口),确认监听地址是0.0.0.0:8787而非127.0.0.1:8787(后者 Nginx 无法反代) - 查日志:
tail -f runtime/log/202605/xxxx.log,重点看有没有Worker started或Server started字样;如果 log 目录为空,先检查runtime/权限
最容易被忽略的点是 disable_functions 和 proxy_pass 尾部斜杠——它们不报错,但让整个服务处于“半瘫痪”状态。上线前拿一台测试机,按这四步走一遍,比上线后再救火快十倍。

















