如何通过 https 在生产服务器上使用 Laravel Echo

How to use Laravel Echo on production server with https

我想知道在 https 生产服务器上设置 Laravel Echo 的正确(或任何相关)方法是什么。我已经让它在我的本地 vagrant 上工作了一段时间,现在我已经将更改推送到生产中,我无法让脚本连接到节点服务器。这是我目前拥有的。

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 线程似乎没有做我的把戏。

我找到了这个问题的解决方案。使用 Forge 和 Let's Encrypt 时,Forge 将在月初创建具有唯一 ID 的文件夹,其中将包含您的 SSL 密钥。起初当我尝试使用这些密钥时,laravel-echo-server 说找不到密钥。在我上面问题中的代码中,我引用了我服务器上的另外两个密钥,我认为它们是本月正确密钥的符号 link,但事实并非如此。我确实需要引用唯一 ID 文件夹中的文件。为了让它工作,我只需要 运行 "sudo node socket.js".

也许有人会和我一样遇到同样的问题。 首先,记得将不受信任的证书添加到浏览器异常中,因为对于 laravel 回显端口,我们必须单独进行。否则,您只会在控制台中看到连接被拒绝。 其次,当前版本 laravel echo 不接受主机选项中的协议,而是在名为 'protocol'.

的单独选项中接受协议

我就是这样解决问题的

第一。您必须使用 ssl 配置您的 nginx 虚拟主机(尚未连接 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/

注意:我的 laravel-echo-server 实例使用端口 3000 而不是原始问题中所述的 6001

除了 user237329 响应之外,javascript 中的 laravel 回显设置应该是:

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.host,
    path: '/ws/socket.io',
});