فصل ۹: استقرار در محیط تولید¶
در این فصل، به بررسی مراحل استقرار Laravel Reverb در محیط تولید برای یک پروژه لاراول نسخه ۱۲ میپردازیم. موضوعات شامل مدیریت فرآیندها با استفاده از Supervisor یا systemd، تنظیم reverse proxy با Nginx یا Apache برای هدایت درخواستهای WebSocket، مقیاسپذیری افقی با استفاده از Redis برای توزیع اتصالات، و تنظیم محدودیتهای سیستمی مانند ulimit و محدوده پورتها است. این فصل بر اساس مستندات رسمی لاراول ۱۲.x و بهترین شیوههای استقرار تنظیم شده و شامل مثالهای عملی است.
مدیریت فرآیندها با Supervisor یا systemd¶
برای اطمینان از اینکه سرور Reverb بهصورت مداوم و پایدار در محیط تولید اجرا شود، باید از یک مدیر فرآیند مانند Supervisor یا systemd استفاده کنید. این ابزارها سرور Reverb را در پسزمینه اجرا کرده و در صورت خرابی، آن را بهصورت خودکار راهاندازی مجدد میکنند.
استفاده از Supervisor¶
Supervisor یک ابزار محبوب برای مدیریت فرآیندها در سرورهای لینوکس است.
- نصب Supervisor:
sudo apt update
sudo apt install supervisor
- ایجاد فایل تنظیمات Supervisor:
یک فایل تنظیمات برای Reverb در مسیر
/etc/supervisor/conf.d/reverb.confایجاد کنید:
[program:reverb]
process_name=%(program_name)s
command=php /var/www/reverb-project/artisan reverb:start --host=127.0.0.1 --port=8080
directory=/var/www/reverb-project
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/reverb-project/storage/logs/reverb.log
stopwaitsecs=10
- command: دستور اجرای سرور Reverb.
- directory: مسیر پروژه لاراول.
- user: کاربری که فرآیند را اجرا میکند (معمولاً
www-dataبرای سرورهای وب). -
stdout_logfile: مسیر فایل لاگ.
-
بهروزرسانی Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start reverb
- بررسی وضعیت:
sudo supervisorctl status
استفاده از systemd¶
systemd جایگزین قدرتمندی برای Supervisor است که بهصورت پیشفرض در بسیاری از توزیعهای لینوکس (مانند Ubuntu) موجود است.
- ایجاد فایل سرویس systemd:
فایل
/etc/systemd/system/reverb.serviceرا ایجاد کنید:
[Unit]
Description=Laravel Reverb WebSocket Server
After=network.target
[Service]
ExecStart=/usr/bin/php /var/www/reverb-project/artisan reverb:start --host=127.0.0.1 --port=8080
WorkingDirectory=/var/www/reverb-project
Restart=always
User=www-data
StandardOutput=append:/var/www/reverb-project/storage/logs/reverb.log
StandardError=inherit
[Install]
WantedBy=multi-user.target
- فعالسازی و راهاندازی سرویس:
sudo systemctl enable reverb
sudo systemctl start reverb
- بررسی وضعیت:
sudo systemctl status reverb
نکات¶
- لاگگیری: همیشه لاگها را به فایل هدایت کنید تا بتوانید مشکلات را بررسی کنید.
- کاربر مناسب: از یک کاربر غیر ریشه (مانند
www-data) برای اجرای فرآیند استفاده کنید. - نظارت: از ابزارهایی مانند
htopیاmonitبرای نظارت بر فرآیندها استفاده کنید.
تنظیم Reverse Proxy (Nginx/Apache) برای Routing به Reverb¶
برای هدایت درخواستهای WebSocket به سرور Reverb، باید یک reverse proxy با Nginx یا Apache تنظیم کنید. این کار امکان استفاده از پورتهای استاندارد (مانند 443 برای HTTPS) و مدیریت SSL را فراهم میکند.
تنظیم Nginx¶
- فایل تنظیمات Nginx را در
/etc/nginx/sites-available/reverbایجاد کنید:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
location /app {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://127.0.0.1:8000; # سرور لاراول
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- فعالسازی و تست تنظیمات:
sudo ln -s /etc/nginx/sites-available/reverb /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
تنظیم Apache¶
- فایل تنظیمات Apache را در
/etc/apache2/sites-available/reverb.confایجاد کنید:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/app/(.*) ws://127.0.0.1:8080/app/$1 [P,L]
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
</VirtualHost>
- ماژولهای لازم را فعال کنید و تنظیمات را اعمال کنید:
sudo a2enmod rewrite proxy proxy_wstunnel ssl
sudo a2ensite reverb
sudo apache2ctl configtest
sudo systemctl reload apache2
نکات¶
- SSL/TLS: همیشه از گواهیهای SSL معتبر (مانند Let’s Encrypt) برای ارتباطات
wss://استفاده کنید. - پورتها: پورت 443 را برای WebSocket و HTTP باز نگه دارید.
- فایروال: اطمینان حاصل کنید که پورتهای مورد استفاده (مانند 8080 برای Reverb و 443 برای Nginx/Apache) در فایروال باز باشند:
sudo ufw allow 443
sudo ufw allow 8080
مقیاسپذیری افقی با Redis (برای توزیع اتصالات)¶
برای مدیریت تعداد زیادی اتصال WebSocket، میتوانید از Redis برای توزیع پیامها بین چندین نمونه سرور Reverb استفاده کنید. این روش امکان مقیاسپذیری افقی (horizontal scaling) را فراهم میکند.
تنظیم Redis برای Reverb¶
- نصب Redis:
sudo apt install redis-server
- نصب پکیج Redis برای لاراول:
composer require predis/predis
- تنظیم Redis در فایل
.env:
BROADCAST_QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=null
- فعالسازی مقیاسپذیری در Reverb:
فایل
config/reverb.phpرا بهروزرسانی کنید:
<?php
return [
'apps' => [
[
'app_id' => env('REVERB_APP_ID', 'my-reverb-app'),
'key' => env('REVERB_APP_KEY', 'your-app-key'),
'secret' => env('REVERB_APP_SECRET', 'your-app-secret'),
'capacity' => 1000,
'allowed_origins' => ['example.com'],
],
],
'host' => env('REVERB_HOST', 'localhost'),
'port' => env('REVERB_PORT', 8080),
'scheme' => env('REVERB_SCHEME', 'https'),
'scaling' => [
'enabled' => true,
'channel' => 'reverb',
'redis' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'port' => env('REDIS_PORT', 6379),
'password' => env('REDIS_PASSWORD', null),
],
],
];
- scaling.enabled: مقیاسپذیری را فعال میکند.
-
scaling.channel: کانال Redis که برای توزیع پیامها استفاده میشود.
-
اجرای چندین نمونه Reverb: برای هر نمونه سرور Reverb، یک پورت متفاوت تنظیم کنید و از Supervisor یا systemd برای مدیریت آنها استفاده کنید. مثال فایل Supervisor برای نمونه دوم:
[program:reverb_instance2]
process_name=%(program_name)s
command=php /var/www/reverb-project/artisan reverb:start --host=127.0.0.1 --port=8081
directory=/var/www/reverb-project
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/reverb-project/storage/logs/reverb_instance2.log
stopwaitsecs=10
- تنظیم Load Balancer: برای توزیع ترافیک بین نمونههای Reverb، از یک load balancer (مانند Nginx یا HAProxy) استفاده کنید. مثال تنظیم Nginx برای load balancing:
upstream reverb_backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
location /app {
proxy_pass http://reverb_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
تنظیم محدودیتهای سیستم (ulimit, Port Ranges) و مهاجرت به Production¶
برای اطمینان از عملکرد پایدار Reverb در محیط تولید، باید محدودیتهای سیستمی را تنظیم کنید.
تنظیم ulimit¶
ulimit تعداد فایلهای باز (file descriptors) را که یک فرآیند میتواند استفاده کند، محدود میکند. برای Reverb، که تعداد زیادی اتصال WebSocket را مدیریت میکند، باید این مقدار را افزایش دهید.
- بررسی ulimit فعلی:
ulimit -n
- افزایش ulimit:
فایل
/etc/security/limits.confرا ویرایش کنید:
* soft nofile 65535
* hard nofile 65535
www-data soft nofile 65535
www-data hard nofile 65535
- اعمال تغییرات:
sudo sysctl -p
تنظیم محدوده پورتها¶
برای پشتیبانی از تعداد زیادی اتصال، باید محدوده پورتهای ephemeral را افزایش دهید:
1. فایل /etc/sysctl.conf را ویرایش کنید:
net.ipv4.ip_local_port_range = 10000 65535
- اعمال تغییرات:
sudo sysctl -p
مهاجرت به Production¶
- تنظیمات محیطی:
فایل
.envرا برای تولید بهروزرسانی کنید:
APP_ENV=production
APP_DEBUG=false
REVERB_SCHEME=https
REVERB_HOST=example.com
REVERB_PORT=443
REVERB_SERVER_HOST=127.0.0.1
REVERB_SERVER_PORT=8080
BROADCAST_QUEUE_CONNECTION=redis
- بهینهسازی لاراول: دستورات زیر را اجرا کنید:
php artisan config:cache
php artisan route:cache
php artisan view:cache
- نصب وابستگیها: اطمینان حاصل کنید که تمام وابستگیها (PHP, Composer, Node.js) روی سرور نصب شدهاند:
composer install --optimize-autoloader --no-dev
npm install && npm run build
- تست اتصال WebSocket:
با استفاده از
wscatاتصال را تست کنید:
wscat -c wss://example.com/app/your-app-key?protocol=7&client=js
مثال عملی: استقرار اپلیکیشن چت¶
برای استقرار اپلیکیشن چت فصل ششم:
1. فایلهای پروژه را به سرور منتقل کنید (مثلاً با rsync):
rsync -avz ./ reverb-project:/var/www/reverb-project
- تنظیمات Supervisor یا systemd را برای اجرای Reverb اعمال کنید.
- reverse proxy را با Nginx یا Apache تنظیم کنید.
- Redis را برای مقیاسپذیری فعال کنید.
- محدودیتهای
ulimitو پورتها را تنظیم کنید. - به داشبورد Pulse (
/pulse) بروید تا عملکرد سرور را بررسی کنید.
نکات و بهترین شیوهها¶
- امنیت: همیشه از SSL/TLS استفاده کنید و کلیدهای حساس را در سیستمهای مدیریت اسرار (مانند AWS Secrets Manager) ذخیره کنید.
- مانیتورینگ: از Pulse یا ابزارهای خارجی مانند Prometheus و Grafana برای نظارت بر عملکرد استفاده کنید.
- بکآپ: از دیتابیس و لاگها بهصورت منظم نسخه پشتیبان تهیه کنید.
- تست بار: قبل از انتشار، تستهای بار با ابزارهایی مانند
k6انجام دهید.
تمرین پیشنهادی¶
- یک نمونه دوم Reverb روی پورت 8081 راهاندازی کنید و load balancer را برای توزیع ترافیک تنظیم کنید.
- یک سیستم هشدار (مانند ارسال ایمیل) برای خرابی سرور Reverb پیادهسازی کنید.
- مصرف حافظه را با Pulse مانیتور کنید و محدودیتهای
ulimitرا بر اساس نیاز تنظیم کنید.
منابع¶
- مستندات رسمی لاراول:
laravel.com/docs/12.x/deployment - مستندات Reverb:
laravel.com/docs/12.x/reverb - مستندات Supervisor:
supervisord.org - مستندات Nginx:
nginx.com/resources/wiki
این فصل پایان مجموعه آموزشی ما برای Laravel Reverb است. اکنون شما آماده هستید تا اپلیکیشنهای real-time مقیاسپذیر و امن را در محیط تولید مستقر کنید!