فصل ۹: استقرار در محیط تولید

در این فصل، به بررسی مراحل استقرار Laravel Reverb در محیط تولید برای یک پروژه لاراول نسخه ۱۲ می‌پردازیم. موضوعات شامل مدیریت فرآیندها با استفاده از Supervisor یا systemd، تنظیم reverse proxy با Nginx یا Apache برای هدایت درخواست‌های WebSocket، مقیاس‌پذیری افقی با استفاده از Redis برای توزیع اتصالات، و تنظیم محدودیت‌های سیستمی مانند ulimit و محدوده پورت‌ها است. این فصل بر اساس مستندات رسمی لاراول ۱۲.x و بهترین شیوه‌های استقرار تنظیم شده و شامل مثال‌های عملی است.

مدیریت فرآیندها با Supervisor یا systemd

برای اطمینان از اینکه سرور Reverb به‌صورت مداوم و پایدار در محیط تولید اجرا شود، باید از یک مدیر فرآیند مانند Supervisor یا systemd استفاده کنید. این ابزارها سرور Reverb را در پس‌زمینه اجرا کرده و در صورت خرابی، آن را به‌صورت خودکار راه‌اندازی مجدد می‌کنند.

استفاده از Supervisor

Supervisor یک ابزار محبوب برای مدیریت فرآیندها در سرورهای لینوکس است.

  1. نصب Supervisor:
   sudo apt update
   sudo apt install supervisor
  1. ایجاد فایل تنظیمات 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
  1. بررسی وضعیت:
   sudo supervisorctl status

استفاده از systemd

systemd جایگزین قدرتمندی برای Supervisor است که به‌صورت پیش‌فرض در بسیاری از توزیع‌های لینوکس (مانند Ubuntu) موجود است.

  1. ایجاد فایل سرویس 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
  1. فعال‌سازی و راه‌اندازی سرویس:
   sudo systemctl enable reverb
   sudo systemctl start reverb
  1. بررسی وضعیت:
   sudo systemctl status reverb

نکات

  • لاگ‌گیری: همیشه لاگ‌ها را به فایل هدایت کنید تا بتوانید مشکلات را بررسی کنید.
  • کاربر مناسب: از یک کاربر غیر ریشه (مانند www-data) برای اجرای فرآیند استفاده کنید.
  • نظارت: از ابزارهایی مانند htop یا monit برای نظارت بر فرآیندها استفاده کنید.

تنظیم Reverse Proxy (Nginx/Apache) برای Routing به Reverb

برای هدایت درخواست‌های WebSocket به سرور Reverb، باید یک reverse proxy با Nginx یا Apache تنظیم کنید. این کار امکان استفاده از پورت‌های استاندارد (مانند 443 برای HTTPS) و مدیریت SSL را فراهم می‌کند.

تنظیم Nginx

  1. فایل تنظیمات 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;
    }
}
  1. فعال‌سازی و تست تنظیمات:
   sudo ln -s /etc/nginx/sites-available/reverb /etc/nginx/sites-enabled/
   sudo nginx -t
   sudo systemctl reload nginx

تنظیم Apache

  1. فایل تنظیمات 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>
  1. ماژول‌های لازم را فعال کنید و تنظیمات را اعمال کنید:
   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

  1. نصب Redis:
   sudo apt install redis-server
  1. نصب پکیج Redis برای لاراول:
   composer require predis/predis
  1. تنظیم Redis در فایل .env:
   BROADCAST_QUEUE_CONNECTION=redis
   REDIS_HOST=127.0.0.1
   REDIS_PORT=6379
   REDIS_PASSWORD=null
  1. فعال‌سازی مقیاس‌پذیری در 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
  1. تنظیم 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 را مدیریت می‌کند، باید این مقدار را افزایش دهید.

  1. بررسی ulimit فعلی:
   ulimit -n
  1. افزایش ulimit: فایل /etc/security/limits.conf را ویرایش کنید:
* soft nofile 65535
* hard nofile 65535
www-data soft nofile 65535
www-data hard nofile 65535
  1. اعمال تغییرات:
   sudo sysctl -p

تنظیم محدوده پورت‌ها

برای پشتیبانی از تعداد زیادی اتصال، باید محدوده پورت‌های ephemeral را افزایش دهید: 1. فایل /etc/sysctl.conf را ویرایش کنید:

net.ipv4.ip_local_port_range = 10000 65535
  1. اعمال تغییرات:
   sudo sysctl -p

مهاجرت به Production

  1. تنظیمات محیطی: فایل .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
  1. بهینه‌سازی لاراول: دستورات زیر را اجرا کنید:
   php artisan config:cache
   php artisan route:cache
   php artisan view:cache
  1. نصب وابستگی‌ها: اطمینان حاصل کنید که تمام وابستگی‌ها (PHP, Composer, Node.js) روی سرور نصب شده‌اند:
   composer install --optimize-autoloader --no-dev
   npm install && npm run build
  1. تست اتصال 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
  1. تنظیمات Supervisor یا systemd را برای اجرای Reverb اعمال کنید.
  2. reverse proxy را با Nginx یا Apache تنظیم کنید.
  3. Redis را برای مقیاس‌پذیری فعال کنید.
  4. محدودیت‌های ulimit و پورت‌ها را تنظیم کنید.
  5. به داشبورد 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 مقیاس‌پذیر و امن را در محیط تولید مستقر کنید!