如何通过 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cell 调制解调器上接收小区广播消息?

Django:如何在生产中的apache服务器上部署静态文件

如何在生产中设置快速会话。快速会话在 https 中不起作用

如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit

使用 Swoole 来加速你的 Laravel 应用

如何防止在 Chrome 中发送 Origin HTTP 标头?