使用Rocky Linux搭建Laravel-Websockets(WebSocket服务器)

在使用Laravel的广播功能时,有以下两种模式:
– 使用外部服务,如Pusherjs或者Ably等。
– 使用自建的服务,如Laravel-websockets或者Socketi等。

由于外部服务存在限制,建议自行准备laravel-websockets。

这次我们在另一个域名(ws.test.jp)上准备。
laravel-websockets服务器在本地(127.0.0.1)的6001端口上监听。
外部访问将通过nginx的反向代理进行访问。

另外,为了设置文件访问权限等,需要将用户名(rockyos)添加到nginx组中。

创建laravel项目

创建一个文件夹,并在之后设置访问权限等。

# 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的模块列表中找到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。

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

设置处理事件的工人队列

当将QUEUE_CONNECTION更改为redis或数据库时,所请求的事件或作业将排入指定数据库的表(如果是数据库,则为jobs)进行排队。
排队的事件将由工作人员处理。
对于RHEL系列,需要使用supervisor进行守护进程化。

首先,在操作系统上安装监督进程守护程序。

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

不进行supervisor本身的服务重启,而是使用supervisorctl命令来启动、停止等各个模块。
配置文件放在/etc/supervisord.d/目录下,文件名先暂时设为laravel-worker.ini。
以下是laravel队列工作者的配置示例。

[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(或stop start)命令,可能能解决队列卡住的问题。

广告
将在 10 秒后关闭
bannerAds