thinkphp项目中nginx代理websocket需正确配置协议升级与长连接:一、基础反向代理须透传upgrade/connection头;二、https下需启用ssl终止并设高proxy_read_timeout;三、多实例需upstream负载均衡并共享消息中间件;四、origin校验需透传匹配域名;五、推荐用map指令动态管理connection头。

如果您在ThinkPHP项目中启用WebSocket服务,但前端通过Nginx访问时出现连接失败、频繁断开或wss无法握手等问题,则很可能是Nginx未正确配置WebSocket协议升级与长连接维持机制。以下是针对ThinkPHP(尤其TP6+Swoole场景)在Nginx下实现WebSocket代理的多种可行配置方案:
一、基础Nginx WebSocket反向代理配置
该方案适用于单节点Swoole WebSocket服务(如监听127.0.0.1:9501),通过标准location匹配路径实现代理,核心在于显式传递Upgrade和Connection头以完成HTTP到WebSocket的协议切换。
1、编辑站点对应的Nginx配置文件(如宝塔中点击网站→设置→配置文件)。
2、在server块内添加如下location配置段:
3、确保location路径(如/ws)与前端WebSocket客户端初始化URL中的路径严格一致,例如:wss://yourdomain.com/ws。
4、确认proxy_pass目标地址为Swoole服务监听的HTTP地址,且末尾不带斜杠,例如:http://127.0.0.1:9501,而非http://127.0.0.1:9501/。
5、保存配置后,执行nginx -t验证语法,再执行nginx -s reload重载生效。
二、HTTPS环境下WSS强制代理配置
当ThinkPHP部署于HTTPS站点时,浏览器会强制要求使用wss协议,若Nginx未启用SSL终止并透传必要头部,将导致握手失败或ERR_CONNECTION_REFUSED错误。
1、确保域名已正确绑定SSL证书(宝塔中可一键申请或上传PEM/KEY文件)。
2、在443端口server块中,配置location时必须包含SSL相关指令及WebSocket专用头:
3、关键头部必须完整设置:proxy_set_header Upgrade $http_upgrade与proxy_set_header Connection "upgrade"不可省略或拼写错误。
4、proxy_read_timeout值建议设为3600秒或更高,防止空闲连接被Nginx主动关闭。
5、前端连接地址必须使用全域名+路径,例如:new WebSocket("wss://api.example.com/ws"),禁止使用IP或端口直连。
三、基于upstream的多实例负载均衡配置
该方案适用于ThinkPHP集群部署多个Swoole Worker进程(如8000、8001端口),由Nginx统一调度请求,提升可用性与并发承载能力。
1、在Nginx主配置文件/etc/nginx/nginx.conf的http块顶部添加upstream定义:
2、在对应server块中引用该upstream,并配置WebSocket专属参数:
3、确保所有后端Swoole服务监听地址均为127.0.0.1且端口开放,防火墙放行对应端口。
4、ThinkPHP应用层需保证各Worker实例共享同一Redis或消息队列用于广播消息,否则会出现消息仅达单个节点的问题。
5、可通过curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://localhost/ws模拟握手,验证Nginx是否返回101 Switching Protocols状态码。
四、兼容Origin校验的增强型配置
部分Swoole WebSocket服务(尤其是自定义handshake逻辑)会校验HTTP请求头中的Origin字段,若Nginx未透传或值不匹配,将直接返回403拒绝连接。
1、在location配置中显式添加Origin头,其值应与前端页面所在域名完全一致:
2、若前端部署于多个子域(如a.example.com、b.example.com),可使用变量动态赋值:proxy_set_header Origin $scheme://$host。
3、禁用Nginx对Origin头的自动过滤,检查是否有underscores_in_headers on;等干扰指令存在。
4、在Swoole服务端handshake回调中打印$request->header['origin'],确认接收到的Origin值是否符合预期。
5、若仍报403,临时在Swoole服务端添加宽松校验逻辑(仅限调试):return true;绕过Origin比对,定位是否为Nginx透传问题。
五、Nginx全局map映射优化配置
当Nginx版本≥1.3.13且存在多处WebSocket location时,推荐使用map指令统一管理Connection头映射关系,避免重复硬编码,提升可维护性。
1、在nginx.conf的http块最上方添加map定义(必须位于所有server之前):
2、在每个WebSocket location中引用该map变量替代静态字符串:
3、该方式可确保Connection头在Upgrade存在时为upgrade,否则为close,更符合RFC规范。
4、修改后务必执行nginx -t验证,避免因map位置错误导致Nginx启动失败。
5、此配置与ThinkPHP业务代码完全解耦,适用于所有基于Swoole/Workerman的PHP WebSocket服务。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











