Việc triển khai ứng dụng Ruby on Rails trong môi trường sản xuất yêu cầu bạn phải cấu hình một máy chủ web mạnh mẽ và bảo mật dữ liệu người dùng bằng chứng chỉ SSL. Ruby on Rails, mặc dù cung cấp server phát triển tích hợp, nhưng cần sự hỗ trợ của các công cụ như PumaNginx để hoạt động ổn định trong môi trường sản xuất. Cùng với đó, Let’s Encrypt cung cấp SSL miễn phí để mã hóa dữ liệu giữa trình duyệt và máy chủ. Trong bài viết này, chúng ta sẽ thực hiện từng bước triển khai ứng dụng Ruby on Rails với Nginx và cài đặt SSL.

Cấu hình Web Server cho Ruby on Rails

Tại sao cần sử dụng Puma và Nginx?

Trong quá trình phát triển, bạn có thể sử dụng Rails Server (chạy bằng lệnh rails s) để kiểm thử, nhưng trong môi trường sản xuất, cần sử dụng các công cụ mạnh mẽ hơn để quản lý yêu cầu và phân phối tài nguyên. Puma là một server ứng dụng (app server) hoạt động tương thích với Ruby on Rails, trong khi Nginx là một máy chủ web đóng vai trò làm reverse proxy, chịu trách nhiệm điều hướng các yêu cầu tới Puma.

Bước 1: Cài đặt Puma

Puma là một web server đa luồng, đa tiến trình, giúp phân phối các yêu cầu HTTP tới ứng dụng Ruby on Rails của bạn một cách hiệu quả.

Trước tiên, hãy thêm gem puma vào Gemfile nếu chưa có:

gem 'puma'

Sau đó, cài đặt gem:

bundle install

Tiếp theo, bạn có thể cấu hình Puma để khởi động ứng dụng. Một file cấu hình phổ biến của Puma có thể là config/puma.rb. Ví dụ về file cấu hình Puma:

# config/puma.rb
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

preload_app!

port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "production" }

on_worker_boot do
  ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end

Lệnh trên sẽ khởi động 2 worker và mỗi worker sẽ xử lý tối đa 5 luồng (threads). Sau khi thiết lập, bạn có thể khởi động Puma bằng lệnh:

rails server Puma

Puma sẽ bắt đầu lắng nghe các kết nối trên cổng 3000 (hoặc cổng khác nếu bạn đã cấu hình).

Bước 2: Cài đặt Nginx

Nginx là một máy chủ web mạnh mẽ, chuyên dụng để quản lý các kết nối đến và từ Puma. Nó giúp giảm tải cho Puma bằng cách quản lý các yêu cầu HTTP trực tiếp và gửi chúng đến Puma khi cần thiết.

Cài đặt Nginx

Đầu tiên, hãy cài đặt Nginx trên máy chủ của bạn. Trên Ubuntu, sử dụng lệnh:

sudo apt update
sudo apt install nginx

Sau khi cài đặt, kiểm tra xem Nginx đã chạy thành công hay chưa:

sudo systemctl status nginx

Cấu hình Nginx cho Ruby on Rails

Nginx cần được cấu hình để chuyển tiếp các yêu cầu đến Puma. Tạo một file cấu hình Nginx cho ứng dụng Rails của bạn tại thư mục /etc/nginx/sites-available/.

Ví dụ:

sudo nano /etc/nginx/sites-available/myrailsapp

Dưới đây là một ví dụ về cấu hình Nginx:

server {
    listen 80;
    server_name example.com www.example.com;

    root /path/to/your/app/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://127.0.0.1:3000;
        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 ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires max;
        log_not_found off;
    }
}

Trong file cấu hình:

  • server_name: Tên miền mà bạn muốn cấu hình.
  • root: Đường dẫn tới thư mục public của ứng dụng Ruby on Rails.
  • proxy_pass: Chuyển tiếp yêu cầu HTTP tới Puma, đang chạy trên cổng 3000.

Kích hoạt cấu hình

Sau khi tạo file cấu hình, bạn cần kích hoạt nó bằng cách tạo symbolic link từ thư mục sites-available sang sites-enabled:

sudo ln -s /etc/nginx/sites-available/myrailsapp /etc/nginx/sites-enabled/

Kiểm tra xem cấu hình của Nginx có hợp lệ không:

sudo nginx -t

Nếu cấu hình hợp lệ, khởi động lại Nginx:

sudo systemctl restart nginx

Lúc này, Nginx đã được cấu hình để làm reverse proxy cho Puma. Ứng dụng Ruby on Rails của bạn đã sẵn sàng chạy trong môi trường sản xuất.

Cài đặt SSL cho Ruby on Rails

Tại sao cần SSL?

SSL (Secure Sockets Layer) là giao thức mã hóa giúp bảo mật dữ liệu khi truyền tải giữa máy chủ và người dùng. Để đảm bảo an toàn cho dữ liệu người dùng, bạn nên cài đặt chứng chỉ SSL cho trang web của mình. Chúng ta sẽ sử dụng Let’s Encrypt, một dịch vụ cung cấp chứng chỉ SSL miễn phí.

Bước 1: Cài đặt Certbot

Certbot là công cụ giúp tự động yêu cầu và cài đặt chứng chỉ SSL từ Let’s Encrypt. Trước tiên, cài đặt Certbot và plugin Nginx:

sudo apt install certbot python3-certbot-nginx

Bước 2: Yêu cầu chứng chỉ SSL

Sau khi cài đặt Certbot, bạn có thể yêu cầu chứng chỉ SSL cho tên miền của mình bằng lệnh sau:

sudo certbot --nginx -d example.com -d www.example.com

Certbot sẽ tự động cấu hình lại Nginx để sử dụng SSL. Khi thành công, bạn sẽ thấy thông báo rằng chứng chỉ đã được cài đặt.

Bước 3: Cấu hình Nginx với SSL

Nếu bạn cần cấu hình lại thủ công, file cấu hình Nginx có thể trông như sau sau khi thêm SSL:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /path/to/your/app/public;
    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://127.0.0.1:3000;
        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 ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires max;
        log_not_found off;
    }
}

File cấu hình này chuyển hướng tất cả các yêu cầu từ HTTP sang HTTPS và sử dụng chứng chỉ SSL từ Let’s Encrypt.

Bước 4: Kiểm tra gia hạn SSL

Chứng chỉ Let’s Encrypt có thời hạn 90 ngày, nhưng Certbot sẽ tự động gia hạn. Để kiểm tra quá trình gia hạn, bạn có thể chạy lệnh:

sudo certbot renew --dry-run

Cài đặt SSL sẽ giúp trang web Ruby on Rails của bạn an toàn hơn và tăng độ tin cậy đối với người dùng. Hãy luôn duy trì việc cập nhật và kiểm tra gia hạn chứng chỉ để tránh các lỗi bảo mật.

Việc sử dụng Puma kết hợp với Nginx, cùng với chứng chỉ SSL, sẽ giúp ứng dụng Ruby on Rails của bạn hoạt động mượt mà, bảo mật và sẵn sàng phục vụ lượng người dùng lớn trong môi trường sản xuất.