使用 Apache 在 Laravel 11 中配置 Reverb

Reverb 是 Laravel 中用于实时事件广播的 Pusher 的实用替代方案。本指南重点介绍如何在 Laravel 11 中为使用 Flexible SSL 托管在 Cloudflare 后面的实时生产系统配置 Reverb。

先决条件

在进行设置之前,请确保您已准备好以下物品:

  • 已安装 Laravel 11:您可以使用 Composer 设置全新的 Laravel 11 应用程序。
  • Apache 网络服务器:确保 Apache 已安装并正在运行。
  • Cloudflare 帐户:您的应用程序应在 Cloudflare 后面设置并启用灵活 SSL。
  • 安装 Reverb

    首先,你需要在 Laravel 项目中安装 Reverb。运行以下 Composer 命令:

    composer require laravel/reverb

    安装完成后,发布配置文件:

    php artisan vendor:publish --provider="Laravel\Reverb\ReverbServiceProvider"

    这将创建一个“config/reverb.php”文件,您可以在其中调整 Reverb 的设置。

    混响配置示例

    以下是 Reverb 的示例配置:

     env('REVERB_SERVER', 'reverb'),
    
        'servers' => [
    
            'reverb' => [
                'host' => env('REVERB_HOST', '0.0.0.0'),
                'port' => env('REVERB_PORT', 6001),
                'hostname' => env('REVERB_HOST'),
                'options' => [
                    'tls' => [],
                ],
                'max_request_size' => env('REVERB_MAX_REQUEST_SIZE', 10_000),
                'scaling' => [
                    'enabled' => env('REVERB_SCALING_ENABLED', false),
                    'channel' => env('REVERB_SCALING_CHANNEL', 'reverb'),
                    'server' => [
                        'url' => env('REDIS_URL'),
                        'host' => env('REDIS_HOST', '127.0.0.1'),
                        'port' => env('REDIS_PORT', '6379'),
                        'username' => env('REDIS_USERNAME'),
                        'password' => env('REDIS_PASSWORD'),
                        'database' => env('REDIS_DB', '0'),
                    ],
                ],
                'pulse_ingest_interval' => env('REVERB_PULSE_INGEST_INTERVAL', 15),
                'telescope_ingest_interval' => env('REVERB_TELESCOPE_INGEST_INTERVAL', 15),
            ],
    
        ],
    
        'apps' => [
    
            'provider' => 'config',
    
            'apps' => [
                [
                    'key' => env('REVERB_APP_KEY'),
                    'secret' => env('REVERB_APP_SECRET'),
                    'app_id' => env('REVERB_APP_ID'),
                    'options' => [
                        'host' => env('REVERB_HOST'),
                        'port' => env('REVERB_PORT', 443),
                        'scheme' => env('REVERB_SCHEME', 'https'),
                        'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
                    ],
                    'allowed_origins' => ['*'],
                    'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
                    'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
                    'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
                ],
            ],
    
        ],
    
    ];

    .env 设置

    确保在 `.env` 文件中正确配置了以下环境变量:

    BROADCAST_CONNECTION=reverb 
    QUEUE_CONNECTION=database
    
    REVERB_HOST=127.0.0.1 
    REVERB_PORT=6001
    REVERB_APP_ID=
    REVERB_APP_KEY=
    REVERB_APP_SECRET=
    REVERB_SCHEME=http
    
    VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
    VITE_REVERB_HOST="example.com"
    VITE_REVERB_PORT=443
    VITE_REVERB_SCHEME=https

    创建活动

    使用以下 Artisan 命令生成新的事件类:

    php artisan make:event MessageSent

    以下是 `MessageSent` 事件的示例实现:

    message = $message;
        }
    
        public function broadcastOn(): Channel
        {
            return new Channel('chat-channel');
        }
    
        public function broadcastAs(): string
        {
            return 'message-sent';
        }
    }

    Laravel Blade 示例

    创建一个简单的 Blade 模板来测试 Reverb 功能(`welcome.blade.php`):

    
    
    
        
        
        
        Laravel Reverb WebSocket Test
        
        
    
    
        

    Laravel Reverb WebSocket Test

    Open the console to see WebSocket messages.

    定义路线

    以下是定义所需路线的代码:

    input('message')));
    
        return response()->json(['success' => true]);
    
    });
    
    Route::get('/', function () { return view('welcome'); });

    Apache 配置

    运行以下命令来启用必要的 Apache 模块:

    sudo a2enmod proxy
    sudo a2enmod proxy_wstunnel 
    sudo a2enmod rewrite

    以下是 Apache VirtualHost 设置的示例配置:

    
        ServerAdmin admin@example.com
        ServerName example.com
        DocumentRoot /var/www/example.com/public
    
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyPass /app ws://127.0.0.1:6001/app
        ProxyPassReverse /app ws://127.0.0.1:6001/app
    
        SetEnvIf X-Forwarded-Proto https HTTPS=on
    
        ErrorLog /var/www/logs/example.com_error.log
        CustomLog /var/www/logs/example.com_access.log combined
    
    
    
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride All
        Require all granted
    

    运行服务

    要启动服务,您需要启动事件工作程序和 Rebel 服务器。

    运行以下命令来启动事件工作者:

    php artisan queue:work

    使用以下命令在指定端口和主机上启动 Rebel 服务器:

    php artisan reverb:start --port=6001 --host=0.0.0.0

    结论

    如果您不使用 Laravel Echo 和 Pusher 的 CDN,则需要安装所需的 npm 库(`pusher-js` 和 `laravel-echo`)以将实时事件广播集成到您的应用程序中。此设置需要前端构建过程来管理和捆绑项目中的库。

    对于使用完整 SSL 托管在 Cloudflare 后面的应用程序,必须使用正确定义的 SSL 证书配置单独的 VirtualHost。这可确保安全的 WebSocket 通信并避免 SSL/TLS 不匹配问题,否则可能会阻止 WebSocket 连接正常运行。