问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

laravel-echo-server https下报错

发布网友 发布时间:2022-04-28 01:09

我来回答

2个回答

懂视网 时间:2022-04-28 05:30

下面由Laravel教程栏目给大家介绍laravel-echo-server广播服务搭建,希望对需要的朋友有所帮助!

动机

当前项目中很多场景采用 Redis 队列和定时任务来处理执行时间较长的任务,这些任务执行的状态和执行结果只能通过前端重新发送请求获取。

目标

为了优化程序体验,让用户尽可能早的关注到任务执行结果,我们评估了各种方案。为了降低前后端的沟通成本避免重复造轮子,我们决定采用 Laravel 框架内置的广播功能。

选择服务

官方推荐采用 pusher 来搭建应用,pusher 的好处是搭建起来非常简单。但考虑到是国外的服务,存在访问稳定性风险;且目前项目规模较小,于是尝试自己搭建 Websocket 服务,使用的就是 Laravel 框架官方提到的 tlaverdure/laravel-echo-server 项目。

laravel-echo-server 服务特点

这个项目的使用方法可以直接去他们的 github 页面 获得,我们看中的几点如下:

  1. 可通过 Redis 的发布订阅功能来获取事件信息并广播出去,这点的效率要高于向 pusher 的 HTTP API 发送推送请求;
  2. 同时兼容 pusher 的 HTTP API ,如果一些服务无法通过 Redis 发布事件,则可以采用这种模式推送事件;

搭建 Websocket 服务

我们一开始使用了 oanhnn/laravel-echo-server 这个镜像来启动容器,在调试过程中发现这个服务并不稳定,Node 的服务会在异常时直接退出,这是我们碰到的第一个坑。为了快速解决这个问题,我们再这个镜像基础上加入了 supervisor 来负责进行服务进程的退出后重启的任务,并做成了我们自己的镜像。

Redis 订阅

在试用 Redis 订阅时,除了常规的数据库地址和密码等参数以外,key 前缀是我们碰到的又一个坑,对应在 laravel-echo-server 服务中的 laravel-echo-server.json 文件中的 keyPrefix 配置项,一开始没有找到正确的方法,无论怎么配置都不对。后来发现如果想知道要广播事件的程序当前的 Redis key 前缀是什么,就在 tinker 中执行以下脚本即可。

# php artisan tinkerconfig('database.redis.options.prefix');

Nginx 代理

由于生产环境采用了 HTTPS 协议,所以需要给服务增加证书,但因为我是 Node 小白,没有 Node 程序使用证书的配置经验,所以一轮尝试之后基本上放弃了,之后采用了 Nginx 代理的方式使用证书,经过几轮尝试,终于配置成功。

server {
 listen port;
 server_name your-domain;
 ssl on;
 ssl_certificate path-to-pem;
 ssl_certificate_key path-to-key;
 ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;

 location /socket.io {
 proxy_pass http://container-name:6002;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "Upgrade";
 }}

私有/出席频道授权

Laravel 广播将频道分为:公共、私有和出席(我可能翻译的不对,请指正),其中后两者是需要授权访问。我们需要用到的是私有频道,只有经过授权的人才能从前端订阅我们的事件。这也是我们遇到的一个坑。

经我们观察和源码阅读,发现 laravel-echo 的整体授权过程是:

  1. 前端程序先向 laravel-echo-server 服务发送一个 HTTP POST 请求;
  2. laravel-echo-server 根据配置中 authEndpointauthHost 这两项,向应用服务器发送一个 HTTP POST,POST 数据是 channel 名字,同时透传 header 中的 Authorization 数据;
  3. laravel-echo-server 会根据应用服务器的响应来判断授权结果,如果应用服务器响应的是非 HTTP 200 状态,就说明发生了错误,授权失败。

我们在实践中遇到两个问题。第一个问题是,我们项目的授权守门逻辑并非 laravel 默认的,所以默认的 Broadcast::routes() 所引入的路由无法直接使用。发现问题后,我们重新加入了我们自己的授权路由,并配置到 laravel-echo-server.json 的 authEndpoint 配置项中。

另一个问题是,我们没有采用标准的 RESTFul 协议规则:响应对应的 HTTP Code 来描述错误状态。致使 laravel-echo-server 即便在授权失败的时候也不能发现问题并反馈给前端程序,情况类似下图:

迟早还是要还债的…

总结

这个功能开发的,没有当初想的那么顺利,主要的问题有以下几点:

  1. laravel-echo-server 没有预想的那么健壮,以后有时间还得找找替代方案,貌似也有用 swoole 做的项目,可以尝试一下;
  2. 预先忘记考虑到 SSL 的问题,导致发布时临时处理得手忙脚乱;
  3. laravel-echo-server 和 laravel-echo 本身都是很小的项目,遇到问题应该优先考虑去分析其代码减少尝试的时间。

热心网友 时间:2022-04-28 02:38

你可以看下这个

追问解决了 ,更新node就行

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 think,think of,think about,think over的区别和用法 谷歌浏览器的开发者工具好用吗 谷歌浏览器chrome怎么抓包,怎么开发者工具抓包 求助,谷歌浏览器F12开发者工具,上下布局改成左右 谷歌浏览器开发者工具怎样调试程序 mac怎么打开谷歌浏览器开发者模式 谷歌开发者工具怎样打开show console 谷歌浏览器开发模式怎么查看请求的信息 刚刚装了谷歌浏览器,在谷歌浏览器中怎样启动应用 如何打开谷歌分析? 为什么谷歌浏览器开发者工具显示的鼠标是圆点 如何用chrome浏览器打开Axure原型的start.html文件? 谷歌浏览器访问助手开发者模式在哪里 chrome浏览器开发者调试工具怎么用 新版谷歌浏览器开发者工具怎么使用 如何使用chrome开发者工具 谷歌浏览器怎么使用开发者工具 谷歌浏览器最新版看视频卡顿 在Google浏览器上,优酷视频放不出,总是卡在这儿。今天才开始的,昨天还没有这样的情况!求解 谷歌chrome浏览器忽然就变地很卡,还经常出现未响应的情况,怎么解决? laravel 如何使用ueditor laravel 5 UEditor怎么使用的 php5时间修改问题 php时间计算问题 php时间 与日期 PHP错误日志的时间与系统时间不一致,怎么解决? PHP报时区错误怎么办? PHP date获取系统时间不对怎么办 PHP错误日志的时间与系统时间不一致,怎么解决 PHP中本地电脑和服务器时间不一样怎么办 PHP中时区的一点疑惑:PHP CLI application 和PHP web application的区别,希望得到解答。 PHP用date转换时间出现时间不正确。在配置文件php.ini设置了date.timezone = Asia/ShangHai还是一样。 怎样解决校正PHP服务器时间不准的 急求:用php处理时间格式 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复 使用python 程序 使用input函数输入10位同学的成绩 求10位同学的和及平均数_问一问 用python编写程序输入10名学生的成绩,进行优、良、中、及格和不及格的统计? Python至少输入五个成绩怎么编程? 使用python 程序 使用input函数输入10位同学的成绩 求10位同学的和及平均数 python程序功能输入若干个的学生成绩统计分数大于等于85