使用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)命令,可能能解决队列卡住的问题。