Cài đặt Action Cable với Passenger và Nginx

1.Tổng quan

Có hai cách để setup Action Cable với Passenger + Nginx :

  1. Chạy Action Cable server trên cùng một host và port với với sub-URI
  2. Chạy Action Cable server trên một host hoặc port khác.

2. Yêu cầu

  • Passenger 5.0.24 trở lên
  • Redis, PostgreSQL hoặc bất kỳ inter-process adapter này hỗ trợ Action Cable (ở bài viết này tôi dùng Redis)

Config config/cable.yml

production:
  adapter: redis
  url: redis://redis.example.com:6379

local: &local
  adapter: redis
  url: redis://localhost:6379

development: *local
test: *local

Và đừng quên bật Redis nhé 😄.

3 Chạy Action Cable server trên cùng một host và port dưới một sub-URI

Đây là phương pháp setup mặc định được Rails khuyến nghị sử dụng và cũng là cách dễ nhất. Nó được chạy bằng cách khai báo ActionCable.server là một path được khai báo trong config/routes.rb. Mặc dùng vậy Passenger thực tế sẽ chậy nó ở một tiếng trình riêng biệt

Ví dụ routes.rb

# Serve websocket cable requests in-process
mount ActionCable.server => "/cable"

Tiếp đó bạn phải config Nginx. Giả sử bạn có một máy chủ được config như bên dưới :

server {
    listen 80;
    server_name www.foo.com;
    root /path-to-your-app/public;
    passenger_enabled on;
}

Giờ bạn thêm location block để config Action Cable như sau :

server {
    listen 80;
    server_name www.foo.com;
    root /path-to-your-app/public;
    passenger_enabled on;

    ### INSERT THIS!!! ###
    location /cable {
        passenger_app_group_name YOUR_APP_NAME_HERE_action_cable;
        passenger_force_max_concurrent_requests_per_process 0;
    }
}

Lưu ý :

  • Thay /cable thành tên path Action Cable được khai báo trong routes.rb
  • Thay YOUR_APP_NAME_HERE thành một tên duy nhất và không trùng với bất kì config này được viết trong file config Nginx

4. Chạy Action Cable server trên host hoặc port khác

Trước khi config Passenger, bạn phải khai báo một hostname và một port cho Action Cable server của bạn. Mở file config/environments/development.rb hoặc config/environments/production.rb và đặc biệt chú ý đến config.action_cable.url.

Tạo Rackup file

Cài đặt yêu cầu một Rackup file cho Action Cable. Một Rackup configuration đơn giản sẽ có dạng cable/config.ru

require ::File.expand_path('../../config/environment', __FILE__)
Rails.application.eager_load!

run ActionCable.server

Tạo một virtual host cho Action Cable server

Bạn tạo một virtual host với config như bên dưới:

server {
    listen YOUR_ACTION_CABLE_PORT_NUMBER_HERE;
    server_name YOUR_ACTION_CABLE_HOST_NAME_HERE;
    root /path-to-your-app/public;
    passenger_enabled on;
    passenger_app_group_name YOUR_APP_NAME_HERE_action_cable;
    passenger_app_type rack;
    passenger_startup_file config/cable.ru;
    passenger_force_max_concurrent_requests_per_process 0;
}
  • Thay YOUR_APP_NAME_HERE thành một tên duy nhất và không trùng với bất kì config này được viết trong file config Nginx

5. Tổng kết

Như vậy tôi đã hướng dẫn cho các bạn cách để cài đặt Action Cable kết hợp với Passenger và Nginx cho cả 2 trường hợp dùng chung và dùng riêng server. Chúc các bạn thành công !!!


All Rights Reserved