Skip to content

Laravel Reverb ​

Laravel Reverb là WebSocket server của Laravel dùng cho broadcast thời gian thực. Reverb lắng nghe ở một cổng nội bộ (mặc định 8080) và Nginx chuyển kết nối WebSocket của trình duyệt tới đó qua HTTPS. Có hai cách đưa Reverb ra ngoài:

  • Tên miền con (khuyến nghị): trình duyệt kết nối tới wss://ws.domain.com. Cách đơn giản nhất, không cần viết cấu hình Nginx.
  • Đường dẫn con: trình duyệt kết nối tới wss://domain.com/ws. Không cần thêm tên miền hay chứng chỉ SSL.

Yêu cầu ​

  • Website Laravel trên FlashPanel đã cài Reverb (php artisan install:broadcasting).
  • Máy chủ dùng Nginx.
  • Website mà trình duyệt kết nối tới đã cài SSL (xem SSL).

Bước 1: Chạy Reverb ở chế độ nền ​

Reverb cần chạy liên tục. Trong trang Supervisor của máy chủ, bấm Thêm mới và điền:

  • Command: php artisan reverb:start
  • User: người dùng của website Laravel
  • Directory: thư mục website Laravel, ví dụ /home/flashpanel/domain.com
  • Number Processes: 1

Bấm Lưu. Mỗi khi đổi các giá trị Reverb trong .env, hãy khởi động lại tiến trình này để Reverb đọc lại cấu hình.

Bước 2, cách 1: Tên miền con ​

  1. Tạo website ws.domain.com (trỏ DNS về máy chủ) với Proxy Port là 8080, rồi cài SSL cho website. Website có Proxy Port sẽ chuyển toàn bộ truy cập, kể cả kết nối WebSocket, tới cổng đó nên không cần thêm cấu hình Nginx.

  2. Mở .env của website Laravel (mục .env trong nhóm Tiện ích ở trang Tổng quan) và đặt:

    ini
    REVERB_APP_ID=123456
    REVERB_APP_KEY=your_app_key
    REVERB_APP_SECRET=your_app_secret
    REVERB_HOST="ws.domain.com"
    REVERB_PORT=443
    REVERB_SCHEME=https
    
    VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
    VITE_REVERB_HOST="${REVERB_HOST}"
    VITE_REVERB_PORT="${REVERB_PORT}"
    VITE_REVERB_SCHEME="${REVERB_SCHEME}"
  3. Build lại front end (npm run build) để các giá trị VITE_ mới được đưa vào, rồi khởi động lại tiến trình Reverb.

Bước 2, cách 2: Đường dẫn con ​

  1. Trong .env của website Laravel, ứng dụng gửi sự kiện thẳng tới Reverb ngay trên máy chủ, còn trình duyệt kết nối qua tên miền:

    ini
    REVERB_APP_ID=123456
    REVERB_APP_KEY=your_app_key
    REVERB_APP_SECRET=your_app_secret
    REVERB_HOST="127.0.0.1"
    REVERB_PORT=8080
    REVERB_SCHEME=http
    
    VITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
    VITE_REVERB_HOST="domain.com"
    VITE_REVERB_PORT=443
    VITE_REVERB_SCHEME=https
  2. Trong cấu hình Echo ở front end (thường là resources/js/echo.js), thêm dòng wsPath:

    js
    window.Echo = new Echo({
        broadcaster: 'reverb',
        key: import.meta.env.VITE_REVERB_APP_KEY,
        wsHost: import.meta.env.VITE_REVERB_HOST,
        wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
        wssPort: import.meta.env.VITE_REVERB_PORT ?? 443,
        wsPath: '/ws', // thêm dòng này
        forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
        enabledTransports: ['ws', 'wss'],
    });
  3. Trong trang cấu hình web server của website Laravel, bấm Thêm Cấu Hình (server), nhập khối bên dưới, bấm Thêm Cấu Hình rồi bấm Đồng bộ:

    nginx
    location /ws/app {
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        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://127.0.0.1:8080/app;
    }
  4. Build lại front end (npm run build), rồi khởi động lại tiến trình Reverb.

Kiểm tra kết nối ​

Mở website, bấm F12, chọn tab Network với bộ lọc WS rồi tải lại trang. Kết nối tới wss://ws.domain.com/app/... (hoặc wss://domain.com/ws/app/...) có trạng thái 101 nghĩa là Reverb đã hoạt động. Nếu thất bại, xem log của tiến trình Reverb trong trang Supervisor.

Triển khai code

Thêm php artisan reverb:restart vào kịch bản triển khai của website để Reverb nạp code mới sau mỗi lần triển khai.