pusher.comを使わずに、laravel-echo-server(WebSocketサーバ)@さくらVPSで、外部サービスを使わずにリアルタイム通知してみた。

pusher.comを使わずに、laravel-echo-server(WebSocketサーバ)@さくらVPSで、外部サービスを使わずにリアルタイム通知してみた。

参考URL:
マグロと寿司とWebSocket。Laravel+Vue.jsで簡易的なチャットを作る。

laravelオススメpusher.comを使った方が楽だけど、無料枠だと同時接続数が100人までなので、自前でWebSocketサーバ(laravel echo server)を立ててみた。
1GBのVPSだと、同時接続数はどのくらいまで行けるのだろうか…。

やる事リスト
a, laravel-echo-serverはnode.jsで作られているので、node.jsをインストールする。
b, redis(Key-Value型のNoSQLデータベース)は、データ保持はせずに、PUBLIC(配信)/SUBCRIBE(購読)の機能だけ使う
c, predisは、phpからredisを使えるようにするライブラリ
d, laravel-echo-server.json(WebSocketサーバの設定ファイル)を記述
e, redisサーバ起動してから、laravel-echo-server起動
f, laravel-echo-server(WebSocketサーバ)のポート6001を開放しておく
g, フロント側(laravel-echo)は、pusher.comと大体同じだろ!と思いきや、チャネル名にlaravel_database_ というプレフィックスが付いていたり
イベント名の前にドットの一文字が必要だったり、微妙に違う!

1, 色々とインストール&サーバ起動

laravel-echo-server(WebSocket)用に、6001ポートを開放しておく(OS再起動してもリセットされないようにしておく)

サーバ環境は構築できたので、laravel側のコーディング(過去記事を参照)

laravel5.7で、リアルタイムチャットや通知に必要なpusher.comを使ってみた

laravel5.7 + pusher.comで、プライベート・チャネルを実装してみた。

pusher.comのリアルタイム通知を、laravel mixで実装してみた。

pusher.com + laravel mixでPrivate Channelを実装

1, laravelがredisを使うようにする
.envファイルを1ヶ所修正(log->redis)、REDIS_CLIENT=predisは追記
BROADCAST_DRIVER=redis
REDIS_CLIENT=predis
config/databases.phpを見るとphpredisがデフォになっているので、インストールしたpredisを使うように修正。しないとエラーになった。
“Please make sure the PHP Redis extension is installed and enabled.”

2, フロント周り(受信側)を作る。送信側はpusherの時と全く同じでOK!
resources/js/bootstrap.js

これで、pusher.comからローカルのlaravel echo serverに移行出来るはず!と思ったけど、通知が来ないな。
受信側(ブラウザ)は、ちゃんと接続出来ているっぽい。
Request URL: wss://localhost:6001/socket.io/?EIO=3&transport=websocket
Request Method: GET
Status Code: 101 Switching Protocols

じゃあ、送信側がダメなのか?
redisにデータが無い…。

そもそも、publish(発行)/subscribe(購読)の機能しか使わないから、データ無しが当たり前か。
手動で動かしてみよう。

購読状態で待機

別のSSHで接続して発行する

購読状態で待機している方のSSHコンソールに表示された!
リアルタイムチャットな感じだ。

laravel-echo-server.jsonの”devMode”: trueにして、コンソールに表示してみたら、チャネル名に laravel_database_ というプレフィックスが付いている!?

config/database.phpに記述してあるのか…。余計な真似を!
プレフィックスは空欄にしておこう

う~ん、チャネル名とイベント名は合致するようになったけど、ブラウザのconsole.logにまだ出ない。なんでなんだろうか・・・。

そうだ、チャネル名の前に、ドットをつける必要があるんだったわ。円マーク(クラスの名前空間)と同じ発想?でもpusher.comの時には無しでも行けたのに~!
これで自前でリアルタイム通信出来るようなった。

サーバの再起動した時に、redisサーバとlaravel-echo-serverが自動起動するように設定。
redisはサービスなので簡単。

pm2の方は、reboot時に自動起動するコマンド(pm2 startup)があるので、rootで実行。各OS毎に自動起動の方法が違うので、これはありがたい。
pm2 saveコマンドで保存してから、rebootしてもwebsocket通信出来た!
https://qiita.com/ikemura23/items/68fb61b16c6752daa7e8

デバッグモードで見たい時は、pm2 stopで一度終了して、コンソールから手動でlaravel-echo-server startすればOK!

確かに面倒だ・・・。
これならpusher.comを使え!というlaravelの言い分も分かるわ~。