Webman必须通过Nginx反向代理部署,核心配置包括:proxy_set_header Host $host、X-Real-IP $remote_addr、X-Forwarded-For $proxy_add_x_forwarded_for,以及proxy_connect_timeout、send_timeout、read_timeout均设为180秒,proxy_buffering off;HTTPS终止和静态资源由Nginx处理,Webman专注业务逻辑。

Webman 不能直接暴露给公网,必须用 Nginx 做反向代理;不配好 proxy_set_header 和连接超时参数,会出现 502、请求头丢失、长连接中断等问题。
nginx 反向代理必须加的 headers 和超时设置
Webman 是基于 Workerman 的长连接服务,Nginx 默认的短连接行为会破坏它。漏掉关键 header 或超时太短,会导致X-Real-IP 为空、WebSocket 断连、POST 数据截断。
- 必须设置
proxy_set_header Host $host:否则 Webman 的 URL 生成(如url()辅助函数)会 fallback 到127.0.0.1:8787 - 必须设置
proxy_set_header X-Real-IP $remote_addr和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:否则request()->ip()拿到的是127.0.0.1 - 必须调大超时:
proxy_connect_timeout 180、proxy_send_timeout 180、proxy_read_timeout 180:默认 60 秒,容易在文件上传、长轮询场景触发 502 - 建议开启
proxy_buffering off:Webman 自身已做流式响应,Nginx 缓冲反而增加延迟,尤其对 SSE/Stream 响应
location / {
proxy_pass http://127.0.0.1:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_buffering off;
}
webman 启动必须用 -d 并配合 supervisor 管理
php start.php start -d 是生产环境唯一可行的启动方式。直接前台运行或用 nohup 启动,进程崩溃后不会自动拉起,且无法统一管理日志和信号。
- 不要用
systemctl直接托管start.php:Workerman 的子进程模型与 systemd 的 cgroup 管理存在冲突,容易出现孤儿进程或 kill 不干净 - 推荐用
supervisor:它能捕获子进程、重定向 stdout/stderr 到文件、配置自动重启策略 - 配置里必须设
autostart=true、autorestart=unexpected、startretries=3:防止因端口占用、扩展缺失等临时错误导致服务静默退出 - 日志路径建议指向
runtime/log/下的独立文件,避免和 Webman 自身的log_file混淆
worker 进程数与系统限制要匹配
Webman 默认启动 4 个 worker 进程,但若服务器只有 2 核 CPU 或 ulimit 太低,反而会争抢资源或被系统 kill。- 检查当前限制:
ulimit -n,生产环境至少设为65535(修改/etc/security/limits.conf) - Webman 的
config/server.php中'worker_num' => 4不宜盲目调高:超过 CPU 核心数后,上下文切换开销上升,QPS 不升反降 - 若启用
event扩展,可适当提高并发能力;没启用则保持默认,避免pcntl_fork失败报错 - 注意
max_package_size:上传大文件时需同步调大,比如设为100 <em> 1024 </em> 1024(100MB),否则返回 400 Bad Request
HTTPS 和静态资源别让 Webman 处理
Webman 不适合处理 HTTPS 握手和静态文件分发,这两块交给 Nginx 更高效、更安全。- SSL 终止必须在 Nginx 层:配置
ssl_certificate和ssl_certificate_key,然后透传X-Forwarded-Proto: https,Webman 才能正确生成跳转链接 - 静态资源(JS/CSS/IMG)全部由 Nginx
location规则拦截,不要走 PHP:既减少 PHP 进程压力,又可利用sendfile on、expires缓存等优化 - 如果用了 CDN,记得在 Nginx 加
proxy_hide_header X-Powered-By和proxy_hide_header Server:避免泄露后端技术栈
真正的难点不在配置本身,而在于 nginx 和 webman 两层超时、缓冲、header 的耦合关系——改一个参数,往往要同步检查另一层的行为。比如调小 proxy_read_timeout,可能让 Webman 的 keep-alive 心跳包被误杀;开了 proxy_buffering,又会让 SSE 流式响应卡住。这些细节不验证,上线后就是半夜告警。


















