Workerman 4.0.34 必须通过 Nginx 反向代理部署,否则无法传递真实 IP、支持 WebSocket 升级,易出现 502 或 POST 截断;需配置 proxy_set_header、超时参数及静态资源分离。

将 Workerman 4.0.34 部署到线上环境时,必须通过 Nginx 反向代理对外提供服务,否则无法正确传递客户端真实 IP、无法支持 WebSocket 协议升级、极易出现 502 错误或 POST 数据截断。
Nginx 基础反向代理配置
打开你的站点配置文件(通常位于 /etc/nginx/conf.d/your-site.conf 或 /etc/nginx/sites-enabled/your-site)。
在 server 块内添加以下 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_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_buffering off;
【X-Real-IP 和 X-Forwarded-For 缺一不可】漏掉任一 header,Workerman 中 request()->ip() 将始终返回 127.0.0.1,导致访客定位、风控、日志统计全部失效。
WebSocket 支持配置
若 Workerman 启动了 WebSocket 服务(如端口 2346),必须显式启用 HTTP/1.1 协议升级机制,否则浏览器连接会立即关闭。
方法一:为 WebSocket 路径单独配置 location(推荐)
location /ws/ {
proxy_pass http://127.0.0.1:2346;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
方法二:全局启用(适用于所有路径都走 WebSocket 的极简场景)
直接在 location / 块内追加:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
注意:Connection 头的值必须是带双引号的 "upgrade",写成 upgrade(无引号)会导致 Nginx 400 错误。
HTTPS 终止与静态资源分离
第一步:在 server 块中监听 443 端口并配置 SSL 证书
listen 443 ssl http2;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
第二步:强制 HTTP 跳转 HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
第三步:让 Nginx 直接处理静态资源,不经过 Workerman
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot)$ {
root /var/www/your-app/public;
expires 1y;
add_header Cache-Control "public, immutable";
}
这一步能显著降低 Workerman 进程负载——它只专注业务逻辑和长连接,不浪费 CPU 在文件读取上。
验证与热重载
① 执行 sudo nginx -t 校验语法是否正确,输出必须包含 success 字样。
② 若校验失败,Nginx 不会自动加载新配置,你必须手动修复后再试。
③ 校验成功后,执行 sudo nginx -s reload 热重载配置,不中断现有连接。
④ 检查 Workerman 是否仍在监听对应端口:ss -tlnp | grep :8787 或 lsof -i :2346。
⑤ 访问 https://your-domain.com,用浏览器开发者工具 Network 面板查看响应头中 X-Real-IP 是否为真实客户端 IP。


















