LoginSignup
0
0

More than 1 year has passed since last update.

rocky linuxでlaravel-websocketsの構築(WSサーバ)

Posted at

laravelでbroadcast機能を使う際、以下の2パターンとなる
・Pusherjsやablyなどの外部サービスを使う場合
・laravel-websocketsやsocketiなどで自前で用意する場合

外部サービスは制限が有ったりするので自前で用意してみる
laravel-websockets

今回は別ドメイン(ws.test.jp)で用意する
laravel-websocketsサーバはlocalhost(127.0.0.1)、ポート6001で待ち受ける。
外部からのアクセスはnginxのリバースプロキシーでアクセスさせる。

また、ふぃあるのアクセス権などの設定のため
ユーザー名(rockyos)でnginxグループに追加しておく。

laravelプロジェクトの作成

rootでフォルダを作ってそのあとアクセス権限などを設定する。

console
# cd /var/www/html
# composer create-project "laravel/laravel" ws.test.jp
# chown rockyos:nginx -R ./ws.test.jp
$ cd /var/www/html/ws.test.jp
$ find ./storage -type d -exec chmod g+s {} \;
$ find ./bootstrap/cache -type d -exec chmod g+s {} \;

redisサーバを用意

Centos(RHEL)系ならdnfのmodule listにredisがあるのでそちらからインストール

$ sudo dnf module list redis
$ sudo systemctl enable redis
$ sudo systemctl start redis

redisのcliはredis-cliでコマンドラインに入れる。

$ redis-cli
127.0.0.1:6379> keys *

laravelのイベントを非同期で扱う場合、.envのQUEUE_CONNECTIONをredisに変更する

QUEUE_CONNECTION=redis

PHPのredisライブラリをインストール

$ composer require predis/predis

以下のファイルのREDIS_CLIENTのデフォルト値を変えるか
.envファイルにREDIS_CLIENT=predisを追加する

config/database.php
    'redis' => [
        'client' => env('REDIS_CLIENT', 'predis'), /* 'phpredis' -> 'predis' */
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
    ],

イベントを処理するキューワーカーを設定

QUEUE_CONNECTIONをredisやdatabaseに変更すると、要求されたeventやjobは指定されたdbのテーブル(databaseだとjobs)にキューイングされる。
キューイングされたイベントはキューワーカーによって処理をする。
RHEL系だとsupervisorによるデーモン化を行う必要がある。

まず、supervisorデーモンをOSにインストール。

$ sudo dnf install supervisor
$ sudo systemctl enable supervisor
$ sudo systemctl start supervisor

以降、supervisor自体のサービスのrestartなどは行わず、
supervisorctlコマンドで個々のモジュールの起動、停止などを行う。
設置ファイルの置き場は/etc/supervisord.d/配下、
ファイル名はとりあえずlaravel-worker.iniとする
以下はlaravelのキューワーカーの設定例

/etc/supervisord.d/laravel-worker.ini
[program:laravel-queue-worker]
command=php /var/www/html/app/artisan queue:work --sleep=10 --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/app/storage/logs/laravel-worker.log

ファイルを格納したら、設定を更新して起動させる

設定ファイルを変更したら更新させる
$ sudo supervisorctl update
supervisorが管理しているデーモンの状態表示
$ sudo supervisorctl status
laravel-queue-worker:laravel-queue-worker_00                     RUNNING   pid 777495, uptime 1:43:13


デーモンの停止
$ sudo supervisorctl stop laravel-queue-worker:*
laravel-queue-worker:laravel-queue-worker_00: stopped

デーモンの起動
$ sudo supervisorctl start laravel-queue-worker:*
laravel-queue-worker:laravel-queue-worker_00: started

キューが捌けない場合はsupervisorctl update(or stop start)するとキューが捌けていくことがある。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0