宅基地中的 laravel websocket 不起作用 [英] laravel websocket in homestead not working

查看:38
本文介绍了宅基地中的 laravel websocket 不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试了使用 homestead 实现这个包的所有方法Laravel Websockets,在本地它可以工作,但使用 nginx Homestead 不行.

I've tried all the ways to implement this package Laravel Websockets with homestead, locally it works but using nginx Homestead doesn't.

1 ->/etc/nginx/sites-available/example.test 的配置:

1 -> configuration for /etc/nginx/sites-available/example.test :

server {
    listen 80;
    listen 443 ssl http2;
    server_name website.test;
    root "/home/vagrant/website/public";

index index.html index.htm index.php;

charset utf-8;

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

access_log off;
error_log  /var/log/nginx/website.test-error.log error;

sendfile off;

client_max_body_size 100m;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
}

location /ws {
    proxy_pass             http://127.0.0.1:6001;
    proxy_set_header Host  $host;
    proxy_read_timeout     60;
    proxy_connect_timeout  60;
    proxy_redirect         off;

    # Allow the use of websockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;}

location ~ /\.ht {
    deny all;
}

ssl_certificate     /etc/nginx/ssl/website.test.crt;
ssl_certificate_key /etc/nginx/ssl/website.test.key;

}

2 -> 我的 js 配置:

2 -> my js config :

import Echo from "laravel-echo"

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    wsHost: window.location.hostname,
    wsPort: 6001,
    disableStats: true,
});

3 -> 我的活动:

<?php

namespace App\Events\CrudsEvents;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class DashboardEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;


    public $data ;

    public function __construct($data)
    {
        $this->data  = $data ;
    }

    public function broadcastOn()
    {

        return new Channel('chat-channel');
        // return new PrivateChannel('channel-name');
    }
}

4 -> 我在 homestead 运行命令 php artisan websockets:serve

4 -> i run in homestead the command php artisan websockets:serve

5 -> 并尝试使用此代码在我的客户端收听:

5 -> and try to listen in my client side using this code :

  mounted(){
    window.Echo.channel('chat-channel')
        .listen('DashboardEvent',(e)=>{
          console.log(e)
      })
  },

6 -> 广播事件后,我的客户端没有收到任何消息.

6 -> after broadcasting the event, nothing is received on my client side.

推荐答案

我想通了

你的 nginx 配置几乎是正确的,除非你使用 Homestead,将 IP 更改为

Your nginx config is almost correct, except if you are using Homestead, change the IP to

location /ws {
    proxy_pass             http://192.168.10.10:6001;
    proxy_set_header Host  $host;
    proxy_read_timeout     60;
    proxy_connect_timeout  60;
    proxy_redirect         off;

    # Allow the use of websockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

这是唯一需要添加到默认 Homestead nginx 站点的额外代码,您可以通过 ssh-ing 进入 VM 并进行编辑

This is the only extra code that needs to be added to a default Homestead nginx site which you can find by ssh-ing into the VM and editing

sudo nano/etc/nginx/sites-available/mysite.test

sudo nano /etc/nginx/sites-available/mysite.test

同时将您在 broadcast.php 中的主机更改为

Also change your host in broadcasting.php to

'主机' =>env('WEBSOCKET_BROADCAST_HOST'),

'host' => env('WEBSOCKET_BROADCAST_HOST'),

并在您的 .env

WEBSOCKET_BROADCAST_HOST=192.168.10.10

WEBSOCKET_BROADCAST_HOST=192.168.10.10

接下来,设置 Laravel Horizo​​n 并运行该过程

Next, set up Laravel Horizon and run the process

php 工匠地平线

在另一个窗口中,运行

php artisan websockets:serve --host=192.168.10.10

php artisan websockets:serve --host=192.168.10.10

在第三个窗口中,您现在可以打开 tinker 并运行

In a third window, you can now open up tinker and run

event (new \App\Events\NewMessage("Hello world"));

event (new \App\Events\NewMessage("Hello world"));

如果您正在实施 ShouldBroadcast,它应该可以工作!

If you are implementing ShouldBroadcast, it should work !

或者,您也可以实现不需要地平线的 ShouldBroadcastNow.

Alternatively, you could otherwise implement ShouldBroadcastNow which doesn't need horizon.

这篇关于宅基地中的 laravel websocket 不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆