如何通过 https 在生产服务器上使用 Laravel Echo
Posted
技术标签:
【中文标题】如何通过 https 在生产服务器上使用 Laravel Echo【英文标题】:How to use Laravel Echo on production server with https 【发布时间】:2017-01-11 15:02:59 【问题描述】:我想知道在 https 生产服务器上设置 Laravel Echo 的正确方式(或任何方式)是什么。我已经让它在我的本地流浪者上工作了一段时间,现在我已经将更改推送到生产中,我无法让脚本连接到节点服务器。这是我目前拥有的。
var echo = require('laravel-echo-server');
var options =
host: 'https://localhost',
port: '6001',
sslCertPath: '/etc/nginx/ssl/nginx.crt',
sslKeyPath: '/etc/nginx/ssl/nginx.key'
;
echo.run(options);
然后在javascript中
import Echo from "laravel-echo"
window.echo = new Echo(
broadcaster: 'socket.io',
host: 'https://localhost:6001'
);
上面的配置是我开始的方式,但是我尝试了许多其他组合,包括尝试编辑 nginx 配置以一起绕过 https。如果绕过 https 是必需的方法,那么任何关于如何使用 Laravel Echo 执行此操作的建议都将不胜感激,因为我一直在引用的关于这个主题的 socket.io 线程似乎对我没有帮助。
【问题讨论】:
【参考方案1】:我找到了解决这个问题的方法。使用 Forge 和 Let's Encrypt 时,Forge 将在月初创建具有唯一 ID 的文件夹,其中包含您的 SSL 密钥。起初,当我尝试使用这些密钥时,laravel-echo-server 说它找不到密钥。在我上面问题的代码中,我引用了我服务器上的另外两个密钥,我认为它们是指向本月正确密钥的符号链接,但事实并非如此。我确实需要参考唯一 ID 文件夹中的文件。为了让它工作,我只需要运行“sudo node socket.js”。
【讨论】:
【参考方案2】:也许有人会遇到和我一样的问题。 首先,请记住将不受信任的证书添加到浏览器异常中,因为对于 laravel 回显端口我们必须单独进行。否则,您将在控制台中仅获得连接被拒绝。 其次,当前版本的 laravel echo 不接受 host 选项中的协议,而是在一个名为 'protocol' 的单独选项中。
【讨论】:
虽然这可能是解决问题的宝贵提示,但答案确实需要证明解决方案。请edit 提供示例代码来说明您的意思。或者,请考虑将其写为评论。【参考方案3】:这就是我解决问题的方法
首先。您必须使用 ssl 配置您的 nginx vhost(尚未连接 websocket)。我用 Let's encrypt (https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)
第二。您可以在您的虚拟主机上创建一个路径来代理您的 websocket。这样 nginx 处理 ssl 协议,而且你不使用另一个端口
location /ws/
proxy_pass http://127.0.0.1:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
之后你的脚本必须连接到`https://localhost/ws/
注意:我将端口 3000 用于我的 laravel-echo-server
实例,而不是原始问题中所述的 6001
【讨论】:
这是一个非常有趣的方法,喜欢它。我很好奇为什么当 Laravel Echo Server 使用端口 6001 时你有端口 3000。另外,你是否会将 Laravel Echo Server 配置为在没有 https 的情况下运行,这样它就不会尝试访问它没有读取权限的证书开吗? 你是对的,在问题中它被描述为 6001 端口。你应该使用那个端口。我使用 3000 端口,它可以是任何其他未使用的端口。 我试图运行这个sudo service nginx restart
,但我收到了这个错误nginx: [emerg] unknown directive "proxy_set_hearder" in /etc/nginx/conf.d/virtual.conf:5 nginx: configuration file /etc/nginx/nginx.conf test failed
@IkechukwuKalu : nginx -t
用于检查 nginx 配置。你有一个错字 proxy_set_hearder
而不是 proxy_set_header
感谢您的回答,但我该如何处理呢?我正在同时运行 apache 和 nginx。我的 apache 在端口 80 上运行,我的 nginx 在端口 8080 上运行。你有任何链接可以参考我,以使我从 laravel-echo-server 的投票停止失败?【参考方案4】:
除了user237329响应外,javascript中的laravel echo设置应该是:
window.Echo = new Echo(
broadcaster: 'socket.io',
host: window.host,
path: '/ws/socket.io',
);
【讨论】:
谢谢!对我来说,我需要的是正确的host
属性。我改为设置/socket.io
。我不必设置path
部分,因为我已经代理了默认的/socket.io
而不是/ws/socket.io
。以上是关于如何通过 https 在生产服务器上使用 Laravel Echo的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何在生产中的apache服务器上部署静态文件
如何在生产中设置快速会话。快速会话在 https 中不起作用