نسخه:

لاراول ریورب

معرفی

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-id
REVERB_APP_KEY=my-app-key
REVERB_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.conf
forge soft nofile 10000
forge 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
# or
pecl install ev
# or
pecl 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 باید در پشت یک بار متعادل کننده قرار گیرند که درخواست های دریافتی را به طور مساوی بین سرورها توزیع می کند.