لاراول ریورب
معرفی
Laravel Reverb ارتباطات WebSocket بلادرنگ و سریع و مقیاسپذیر را مستقیماً به برنامه لاراول شما میآورد و یکپارچهسازی یکپارچه با مجموعه ابزارهای پخش رویداد موجود لاراول را فراهم میکند .
نصب و راه اندازی
می توانید Reverb را با استفاده از
install:broadcasting
دستور Artisan نصب کنید:
php artisan install:broadcasting
پیکربندی
در پشت صحنه،
install:broadcasting
دستور Artisan فرمان را اجرا می کند
reverb:install
که Reverb را با مجموعه معقولی از گزینه های پیکربندی پیش فرض نصب می کند. اگر میخواهید تغییراتی در پیکربندی ایجاد کنید، میتوانید این کار را با بهروزرسانی متغیرهای محیطی Reverb یا با بهروزرسانی
config/reverb.php
فایل پیکربندی انجام دهید.
اعتبار برنامه
برای برقراری ارتباط با Reverb، مجموعه ای از اعتبارنامه های Reverb "برنامه" باید بین مشتری و سرور رد و بدل شود. این اعتبارنامه ها روی سرور پیکربندی می شوند و برای تأیید درخواست مشتری استفاده می شوند. می توانید این اعتبارنامه ها را با استفاده از متغیرهای محیطی زیر تعریف کنید:
REVERB_APP_ID=my-app-idREVERB_APP_KEY=my-app-keyREVERB_APP_SECRET=my-app-secret
مبدا مجاز
allowed_origins
همچنین میتوانید با بهروزرسانی مقدار مقدار پیکربندی در
apps
بخش فایل پیکربندی
، مبداهایی را که درخواستهای مشتری از آنها منشأ میگیرند، تعیین کنید
config/reverb.php
. هر درخواستی از مبدایی که در مبادی مجاز شما ذکر نشده باشد رد خواهد شد. شما می توانید همه مبداها را با استفاده از
*
:
'apps' => [ [ 'id' => 'my-app-id', 'allowed_origins' => ['laravel.com'], // ... ]]
برنامه های کاربردی اضافی
به طور معمول، Reverb یک سرور WebSocket را برای برنامه ای که در آن نصب شده است ارائه می دهد. با این حال، امکان سرویس دهی به بیش از یک برنامه با استفاده از یک نصب Reverb وجود دارد.
به عنوان مثال، ممکن است بخواهید یک برنامه لاراول را حفظ کنید که از طریق Reverb، اتصال WebSocket را برای چندین برنامه فراهم می کند. این را می توان با تعریف چندگانه
apps
در فایل پیکربندی برنامه خود به دست آورد
config/reverb.php
:
'apps' => [ [ 'id' => 'my-app-one', // ... ], [ 'id' => 'my-app-two', // ... ],],
SSL
در اکثر موارد، اتصالات WebSocket ایمن توسط وب سرور بالادستی (Nginx و غیره) قبل از اینکه درخواست به سرور Reverb شما پروکسی شود، مدیریت می شود.
با این حال، گاهی اوقات می تواند مفید باشد، مانند هنگام توسعه محلی، برای سرور Reverb که مستقیماً اتصالات ایمن را مدیریت کند. اگر از
ویژگی سایت امن
Laravel Herd
استفاده می کنید یا از
Laravel Valet
استفاده می کنید و
دستور امن را
در برابر برنامه خود اجرا کرده اید، می توانید از گواهی Herd / Valet که برای سایت شما ایجاد شده است برای ایمن سازی اتصالات Reverb خود استفاده کنید. برای انجام این کار،
REVERB_HOST
متغیر محیطی را روی نام میزبان سایت خود تنظیم کنید یا در هنگام راه اندازی سرور Reverb، به صراحت گزینه hostname را ارسال کنید:
php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"
از آنجایی که دامنههای Herd و Valet به این نتیجه میرسند
localhost
، اجرای دستور بالا باعث میشود که سرور Reverb شما از طریق پروتکل امن WebSocket (
wss
) در دسترس باشد
wss://laravel.test:8080
.
tls
همچنین می توانید با تعریف گزینه های موجود در فایل پیکربندی برنامه خود،
گواهی را به صورت دستی انتخاب کنید
config/reverb.php
. در آرایهای از
tls
گزینهها، میتوانید هر یک از گزینههای پشتیبانی شده توسط
گزینههای زمینه SSL PHP
را ارائه دهید :
'options' => [ 'tls' => [ 'local_cert' => '/path/to/cert.pem' ],],
در حال اجرا سرور
سرور Reverb را می توان با استفاده از
reverb:start
دستور Artisan راه اندازی کرد:
php artisan reverb:start
بهطور پیشفرض، سرور Reverb در راهاندازی میشود
0.0.0.0:8080
و از تمام رابطهای شبکه قابل دسترسی است.
اگر نیاز به تعیین یک هاست یا پورت سفارشی دارید، می توانید این کار را از طریق گزینه های
--host
و
--port
هنگام راه اندازی سرور انجام دهید:
php artisan reverb:start --host=127.0.0.1 --port=9000
از طرف دیگر، می توانید متغیرهای محیطی
REVERB_SERVER_HOST
را
REVERB_SERVER_PORT
در فایل پیکربندی برنامه خود تعریف کنید
.env
.
اشکال زدایی
برای بهبود عملکرد، Reverb به طور پیشفرض هیچ اطلاعات اشکالزدایی را خروجی نمیکند. اگر میخواهید جریان دادهای را که از سرور Reverb خود عبور میکند، ببینید، میتوانید گزینهای را
--debug
برای
reverb:start
دستور ارائه کنید:
php artisan reverb:start --debug
راه اندازی مجدد
از آنجایی که Reverb یک فرآیند طولانی مدت است، تغییرات در کد شما بدون راه اندازی مجدد سرور از طریق
reverb:restart
دستور Artisan منعکس نمی شود.
این
reverb:restart
فرمان تضمین میکند که تمام اتصالات قبل از توقف سرور بهخوبی قطع میشوند. اگر Reverb را با یک مدیر فرآیند مانند Supervisor اجرا می کنید، سرور به طور خودکار توسط مدیر فرآیند پس از پایان تمام اتصالات مجددا راه اندازی می شود:
php artisan reverb:restart
نظارت بر
Reverb ممکن است از طریق یکپارچه سازی با Laravel Pulse نظارت شود . با فعال کردن Reverb's Pulse یکپارچهسازی، میتوانید تعداد اتصالات و پیامهایی که توسط سرورتان مدیریت میشوند را ردیابی کنید.
برای فعال کردن ادغام، ابتدا باید مطمئن شوید که
Pulse را نصب کرده
اید . سپس، هر یک از ضبط کننده های Reverb را به
config/pulse.php
فایل پیکربندی برنامه خود اضافه کنید:
use Laravel\Reverb\Pulse\Recorders\ReverbConnections;use Laravel\Reverb\Pulse\Recorders\ReverbMessages; 'recorders' => [ ReverbConnections::class => [ 'sample_rate' => 1, ], ReverbMessages::class => [ 'sample_rate' => 1, ], ...],
سپس، کارت های پالس را برای هر ضبط کننده به داشبورد پالس خود اضافه کنید :
<x-pulse> <livewire:reverb.connections cols="full" /> <livewire:reverb.messages cols="full" /> ...</x-pulse>
اجرای Reverb در تولید
با توجه به ماهیت طولانی مدت سرورهای WebSocket، ممکن است لازم باشد بهینه سازی هایی را در سرور و محیط میزبانی خود انجام دهید تا مطمئن شوید که سرور Reverb شما می تواند به طور موثر تعداد اتصالات بهینه را برای منابع موجود در سرور شما انجام دهد.
اگر سایت شما توسط Laravel Forge مدیریت می شود ، می توانید به طور خودکار سرور خود را برای Reverb مستقیماً از پنل "Application" بهینه کنید. با فعال کردن ادغام Reverb، Forge اطمینان حاصل می کند که سرور شما آماده تولید است، از جمله نصب هر گونه برنامه افزودنی مورد نیاز و افزایش تعداد مجاز اتصالات.
فایل ها را باز کنید
هر اتصال WebSocket تا زمانی که کلاینت یا سرور قطع شود در حافظه نگهداری می شود. در محیط های یونیکس و یونیکس مانند، هر اتصال با یک فایل نمایش داده می شود. با این حال، اغلب محدودیت هایی برای تعداد فایل های باز مجاز در سطح سیستم عامل و برنامه وجود دارد.
سیستم عامل
در یک سیستم عامل مبتنی بر یونیکس، می توانید تعداد مجاز فایل های باز را با استفاده از
ulimit
دستور زیر تعیین کنید:
ulimit -n
این دستور محدودیت های فایل باز مجاز برای کاربران مختلف را نمایش می دهد. شما می توانید این مقادیر را با ویرایش
/etc/security/limits.conf
فایل به روز کنید. به عنوان مثال، به روز رسانی حداکثر تعداد فایل های باز به 10000 برای
forge
کاربر به شکل زیر است:
# /etc/security/limits.confforge soft nofile 10000forge hard nofile 10000
حلقه رویداد
در زیر هود، Reverb از یک حلقه رویداد ReactPHP برای مدیریت اتصالات WebSocket در سرور استفاده می کند. بهطور پیشفرض، این حلقه رویداد توسط تأمین میشود
stream_select
، که نیازی به پسوند اضافی ندارد. با این حال،
stream_select
معمولاً به 1024 فایل باز محدود می شود. به این ترتیب، اگر قصد دارید بیش از 1000 اتصال همزمان را مدیریت کنید، باید از یک حلقه رویداد جایگزین استفاده کنید که به همان محدودیت ها محدود نمی شود.
Reverb در صورت موجود بودن به طور خودکار به یک حلقه
ext-event
,
ext-ev
, یا
ext-uv
power تغییر می کند. همه این پسوندهای PHP برای نصب از طریق PECL در دسترس هستند:
pecl install event# orpecl install ev# orpecl install uv
وب سرور
در بیشتر موارد، Reverb روی یک پورت غیر وب روی سرور شما اجرا می شود. بنابراین، برای هدایت ترافیک به Reverb، باید یک پروکسی معکوس پیکربندی کنید. با فرض اینکه Reverb روی هاست
0.0.0.0
و پورت اجرا می شود
8080
و سرور شما از وب سرور Nginx استفاده می کند، می توان یک پروکسی معکوس برای سرور Reverb شما با استفاده از پیکربندی سایت Nginx زیر تعریف کرد:
server { ... location / { proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header SERVER_PORT $server_port; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_pass http://0.0.0.0:8080; } ...}
به طور معمول، وب سرورها به گونه ای پیکربندی می شوند که تعداد اتصالات مجاز را محدود کنند تا از بارگذاری بیش از حد سرور جلوگیری شود. برای افزایش تعداد اتصالات مجاز در وب سرور Nginx به 10000، مقادیر
worker_rlimit_nofile
و
worker_connections
فایل
nginx.conf
باید به روز شوند:
user forge;worker_processes auto;pid /run/nginx.pid;include /etc/nginx/modules-enabled/*.conf;worker_rlimit_nofile 10000; events { worker_connections 10000; multi_accept on;}
پیکربندی بالا به 10000 کارگر Nginx در هر فرآیند اجازه می دهد تا تخم ریزی شوند. علاوه بر این، این پیکربندی محدودیت فایل باز Nginx را به 10000 تنظیم می کند.
پورت ها
سیستم عامل های مبتنی بر یونیکس معمولا تعداد پورت هایی را که می توان روی سرور باز کرد محدود می کند. می توانید محدوده مجاز فعلی را از طریق دستور زیر مشاهده کنید:
cat /proc/sys/net/ipv4/ip_local_port_range# 32768 60999
خروجی بالا نشان می دهد که سرور می تواند حداکثر 28231 (60999 - 32768) اتصال را انجام دهد زیرا هر اتصال به یک پورت رایگان نیاز دارد. اگرچه ما
مقیاس بندی افقی را
برای افزایش تعداد اتصالات مجاز توصیه می کنیم، اما می توانید با به روز رسانی محدوده پورت مجاز در فایل پیکربندی سرور، تعداد پورت های باز موجود را افزایش دهید
/etc/sysctl.conf
.
مدیریت فرآیند
در بیشتر موارد، برای اطمینان از اینکه سرور Reverb به طور مداوم در حال اجرا است، باید از یک مدیر فرآیند مانند Supervisor استفاده کنید. اگر از Supervisor برای اجرای Reverb استفاده میکنید، باید
minfds
تنظیمات فایل سرور خود را بهروزرسانی کنید
supervisor.conf
تا مطمئن شوید که Supervisor میتواند فایلهای مورد نیاز برای مدیریت اتصالات به سرور Reverb شما را باز کند:
[supervisord]...minfds=10000
مقیاس بندی
اگر نیاز دارید که اتصالات بیشتری نسبت به یک سرور واحد انجام دهید، می توانید سرور Reverb خود را به صورت افقی تغییر دهید. با استفاده از قابلیت انتشار/اشتراک Redis، Reverb میتواند اتصالات بین چندین سرور را مدیریت کند. هنگامی که پیامی توسط یکی از سرورهای Reverb برنامه شما دریافت می شود، سرور از Redis برای انتشار پیام دریافتی به سایر سرورها استفاده می کند.
برای فعال کردن مقیاس افقی، باید
REVERB_SCALING_ENABLED
متغیر محیطی را در
فایل پیکربندی
true
برنامه خود تنظیم کنید:
.env
REVERB_SCALING_ENABLED=true
در مرحله بعد، شما باید یک سرور اختصاصی و مرکزی Redis داشته باشید که همه سرورهای Reverb با آن ارتباط برقرار کنند. Reverb از اتصال Redis پیشفرض پیکربندی شده برای برنامه شما برای انتشار پیامها به همه سرورهای Reverb شما استفاده میکند .
هنگامی که گزینه scaling Reverb را فعال کردید و یک سرور Redis را پیکربندی کردید، می توانید به سادگی این
reverb:start
فرمان را در چندین سرور که قادر به برقراری ارتباط با سرور Redis شما هستند فراخوانی کنید. این سرورهای Reverb باید در پشت یک بار متعادل کننده قرار گیرند که درخواست های دریافتی را به طور مساوی بین سرورها توزیع می کند.