如何在 Docker 環境的 Laravel Echo Server 建立 Private Channel
繼上篇「Laravel 如何使用 Docker 快速架起 Echo Server」後,原以為事情一切順遂,可以開始使用廣播功能了。
結果天不從人願,因為即時訊息必須得用 Private Channel 來做,結果馬上發現一個問題:Echo Server 沒辦法做身分驗證,導致 Private Channel 及 Presence Channel 都無法使用。前前後後搞了一天時間才發現是 Laradock 本身的設定問題,因此紀錄下解決過程,我也會在發出這篇文章後向 Laradock 官方發 PR。
首先我們在 BroadcastEvent
中,將 broadcastOn
的 Channel
改為 PrivateChannel
class BroadcastEvent implements ShouldBroadcast
{
...
public function broadcastOn()
{
return new PrivateChannel('App.User.1');
}
...
}
然後在 routes/channels.php
中,加入以下程式碼
Broadcast::channel('App.User.{id}', function ($user, $id) {
return true;
});
並在 config/app.php
中,將 BroadcastServiceProvider
取消註解
...
App\Providers\BroadcastServiceProvider::class,
...
在 Receiver.vue 中,將 Channel 改為 private,並修改 Channel 名稱
Echo.private('App.User.5')
.listen('BroadcastEvent', (e) => {
this.messages.push(e.message);
});
這時候應該就要連上了
但是沒有,頁面刷新之後完全沒有接收到訊息,也清過 Cache、看過錯誤日誌,就是完全看不出異狀,直到打開 Echo Server 的 log 才發現問題
$ docker-compose logs laravel-echo-server
若我把 Echo Server 的 authHost 改為 laravel.test 則會出現另一種錯誤訊息
但我 Google 了很久都沒人碰到這狀況,直到看到其中一篇官方 Issue
Laravel-echo-server running in docker, resolve the local address as IP ! · Issue #72
裡面提到他懷疑因為 Echo Server 的 authHost
指向 127.0.0.1 導致無法驗證,因此他把 authHost
改為 http://www.google.com 後就出現不同的錯誤訊息,確認是這個原因造成,他再進一步把 authHost
改為本機的 LAN IP 就驗證通過了。
因此我們可以知道:authHost
是指他會連到該主機上去驗證使用者身分,也就是我們 Laravel 應用程式的位置
但我在照著操作的過程還是碰到問題,就算我把 authHost
改為我的網路位置仍然沒辦法,但給了我一個想法:Laravel 應用程式的位置在 Nginx container 的 80 port 上,那若把驗證的位置指向 Nginx container 呢?,因此我們可以將 Echo Server 的配置修改如下:
// laradock/laravel-echo-server/laravel-echo-server.json
...
"authHost": "http://nginx", 將 authHost 改為 nginx
...
// laradock/docker-compose.yml
...
### Laravel Echo Server #######################################
laravel-echo-server:
build:
context: ./laravel-echo-server
volumes:
- ./laravel-echo-server/laravel-echo-server.json:/app/laravel-echo-server.json:ro
ports:
- "${LARAVEL_ECHO_SERVER_PORT}:6001"
links:
- redis
- nginx // 將 nginx link 加入 laravel-echo-server
networks:
- frontend
- backend
...
再重新 build Laravel Echo Server
$ docker-compose down
$ docker-compose build laravel-echo-server
$ docker-compose up -d laravel-echo-server nginx redis php-worker
刷新頁面後再次打開 Echo Server 的 log 就可以看到終於驗證成功了 ?
部落格文章:https://bit.ly/2Jwdm2X
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: