Laravel Ratchet WebSocket+ZMQ多环境(本地/开发/生产)配置及WSS改造全方案咨询
Laravel Ratchet WebSocket+ZMQ多环境(本地/开发/生产)配置及WSS改造全方案咨询
嘿,我来帮你捋清楚这些实际部署中的问题,咱们一个个说:
1. 多环境配置:.env是否足够,不用改代码?
完全足够!你已经把WebSocket和ZMQ的host、port都放到.env文件里了,这完全符合Laravel的环境配置最佳实践。
你只需要给不同环境准备对应的.env文件就行:
- 本地环境:保持
WEBSOCKET_HOST=0.0.0.0、WEBSOCKET_PORT=8080,ZMQ_HOST=127.0.0.1、ZMQ_PORT=5555 - 开发测试服务器:把
WEBSOCKET_HOST改成服务器的内网/公网IP(或者0.0.0.0让它监听所有网卡),端口按需调整,ZMQ因为是内部通信,保持127.0.0.1就行 - 生产环境:同理,按服务器实际配置填写
.env参数
完全不用修改WebSocketServer.php和ZMQBroadcaster.php的代码,所有环境差异都靠.env来适配,这才是正确的姿势。
2. 前端WebSocket URL怎么确定?
分场景来看:
- 开发测试服务器(内部用户用):如果大家是通过IP访问服务器,就用
ws://服务器公网IP:8080;如果已经给服务器绑定了测试域名,也可以用ws://测试域名:8080。注意要确保服务器防火墙开放了8080端口,不然前端连不上。 - 生产环境:建议用域名,而且后续要切换WSS的话,不用改太多代码。另外,更优雅的方式是给前端也配置环境变量:比如在Vue项目的
.env.development和.env.production里定义VITE_WEBSOCKET_URL,然后代码里用import.meta.env.VITE_WEBSOCKET_URL来创建WebSocket实例,这样切换环境自动适配,不用硬编码URL。
3. WSS(安全WebSocket)的改造步骤
Ratchet本身不直接支持WSS,咱们需要借助Nginx做反向代理来实现,步骤很清晰:
第一步:准备SSL证书
不管是开发还是生产环境,先搞到SSL证书(生产用Let's Encrypt免费证书就行,开发环境也可以用自签证书)。
第二步:配置Nginx反向代理
在你的域名Nginx配置里添加这段规则,把WSS请求转发到Ratchet的WebSocket服务:
location /ws { proxy_pass http://127.0.0.1:8080; 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_set_header X-Forwarded-Proto $scheme; }
配置完重启Nginx,前端就可以用wss://你的域名/ws来连接了,不用直接访问8080端口,安全又方便。
第三步:调整Laravel和Ratchet的配置
- Ratchet的
WebSocketServer.php里的host保持0.0.0.0就行,让它监听所有网卡,这样Nginx能正常转发请求 - ZMQ的配置不用改,因为是Laravel和WebSocket服务之间的内部通信,保持
127.0.0.1和对应端口即可,不用暴露到公网
额外提醒:生产环境的进程守护
开发环境用php artisan websocket:serve启动没问题,但生产环境得用进程守护工具(比如Supervisor或者systemd)来保证WebSocket服务不会意外停止。举个Supervisor的配置例子:
[program:laravel-websocket] process_name=%(program_name)s_%(process_num)02d command=php /你的项目绝对路径/artisan websocket:serve autostart=true autorestart=true user=www-data numprocs=1 redirect_stderr=true stdout_logfile=/你的项目绝对路径/storage/logs/websocket.log
你已经做的尝试是对的
我已经试过把host/port移到.env里,本地运行
php artisan websocket:serve后能通过ws://localhost:8080成功连接
这一步完全正确,后续只要按照上面的思路给不同环境配置对应的.env和Nginx规则就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

