使用 Apache 在 Laravel 11 中配置 Reverb
Reverb 是 Laravel 中用于实时事件广播的 Pusher 的实用替代方案。本指南重点介绍如何在 Laravel 11 中为使用 Flexible SSL 托管在 Cloudflare 后面的实时生产系统配置 Reverb。
先决条件
在进行设置之前,请确保您已准备好以下物品:
安装 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 连接正常运行。