Chạy server Ruby on Rails trên AWS sử dụng Unicorn và Nginx (phần 1)

Trong bài trước, tôi đã giới thiệu với các bạn về cách sử dụng miễn phí một số dịch vụ AWS với chế độ FreeTier, chúng ta hãy cùng sử dụng một trong các dịch vụ đó là EC2 để triển khai code Ruby on Rails nhé.

Trong bài lần này chúng ta hãy tìm hiểu cách chạy server Ruby on Rails trên EC2 instance. Trước hết ta cần khởi động một EC2 instance.

Khởi động EC2 Instance

Để khởi động một EC2 instance, nếu bạn có ý định sử dụng chế độ FreeTier thì cần chú ý các thiết lập để không vượt quá giới hạn cho phép.

Bước 1: Hãy chọn vào Service, chọn mục EC2 như trong hình vẽ. service_menu.png

Bước 2: Sau khi bạn chọn, sẽ mở ra EC2 dashboard, hãy chọn Launch Instance EC2_dashboard.png

Bước 3: Bạn sẽ chuyển hướng tới màn hình thiết lập Instance EC2. Hãy chọn một loại AMI mà bạn quen sử dụng. Trong bài lần này tôi sẽ dùng Ubuntu. Choose AMI.png

Bước 4: Tiếp theo hãy chọn loại Instance. Ở đây, tôi chọn t2.micro vì nó miễn phí với chế độ FreeTier. Choose instance type.png

Bước 5: Bạn có thể bỏ qua bước thiết lập instance, chúng ta có thể sử dụng các thiết lập mặc định của EC2. Chọn Next, ta sẽ tiếp tục thiết lập Storage của Instance. Ở đây ta cũng cần chú ý đến giới hạn dung lượng cho phép của Instance. Add storage.png

Bước 6: Tiếp theo, chúng ta cần thiết lập Security group cho EC2 instance. Security Group cho phép ta thiết lập giới hạn các liên từ service ra ngoài và từ ngoài truy nhập vào Service. Ban đầu để có thể SSH được vào hệ thống, ta chỉ cần để như mặc định là đủ. Config security group.png

Bước 7: Sau khi đã kiểm tra lại các thiết lập, hãy ấn Launch. Một dialog để bạn tạo lập và download key pair sẽ hiện ra. Nếu bạn chưa có key pair nào để access vào instance, hãy tạo một key pair mới (ví dụ đặt tên là test.pem), Download về máy của bạn. Key pair này sẽ được sử dụng để bạn access vào server bằng giao thức SSH. Sau đó hãy ấn Launch Instances để khởi động EC2 Instances. Review.png Key pair download.png

Truy cập vào EC2 với SSH

SSH vào EC2

Sau khi tạo xong instance EC2, điều tiếp theo bạn muốn làm tất nhiên sẽ là truy cập vào instance đó và cài đặt các package cần thiết để chạy server Rails. Để làm được điều này ta cần biết được Public IP.

Public IP.png

Tuy nhiên bạn chưa thể ngay lập tức truy nhập vào DNS này, lúc này bạn sẽ gặp lỗi Permission Denied. Hãy sử dụng private key bạn vừa download lúc nãy (khi launch EC2 instance) để truy nhập. Bạn có thể dùng câu lệnh như sau

ssh -i ~/.Download/test.pem [email protected]_ip

Chắc hẳn lúc này bạn vẫn chưa thể access. Lý do là SSH không chấp nhập để bạn sử dụng một private key mở để access server. Lúc này bạn cần sửa lại các quyền truy nhập vào file test.pem để bảo đảm không ai ngoài bạn có thể xem được nội dung file.

Hãy sử dụng câu lệnh sau:

sudo chown your_user test.pem
sudo chmod 400 test.pem

Câu lệnh thứ nhất có tác dụng thay đổi chủ sở hữu của file thành user của bạn (có thể không cần thiết). Còn câu lệnh thứ hai chỉ cho phép chủ sở hữu của file đó có quyền đọc file.

Chúc mừng, bây giờ bạn đã có thể access vào Instance EC2 vừa tạo rồi.

Cài đặt thiết lập

Sau khi đã access được vào Instance EC2, chúng ta tiến hành cài đặt các thiết lập cần thiết.

  1. Tạo user deploy và cài đặt password
    sudo useradd -d /home/deploy -m deploy
    sudo passwd deploy
Password này sẽ cần thiết khi bạn cài đặt Ruby bằng RVM. Bạn cũng cần thêm user `deploy` vào sudoers. Chạy `sudo visudo` và thêm nội dung sau đây vào.
    deploy ALL=(ALL:ALL) ALL
Chúng ta sẽ sử dụng Github để lưu trữ code, do đó user `deploy` sẽ cần phải truy nhập vào repository của Github để tiến hành việc deploy.

Ta cần generate một key pair cho user `deploy`
    su - deploy
    ssh-keygen
Đừng tạo passphrase cho key pair. Copy nội dung của keypair và thiết lập nó thành deploy key trên Github. Cách thiết lập bạn có thể xem ở [đây](https://help.github.com/articles/generating-ssh-keys/#step-4-add-your-ssh-key-to-your-account)

Tiếp theo, nếu lần sau bạn muốn access vào instance không cần dùng keypair test.pem mà sử dụng key của chính bạn, bạn chỉ việc copy nội dung public key của bạn (thường nằm ở ~/.ssh/id_rsa.pub) vào trong file ~/.ssh/authorized_keys trên instance.

Cài đặt một số package cần thiết

  1. Cài đặt Git

    sudo apt-get install git

  2. Cài đặt Java Virtual machine (JVM) nếu bạn sử dụng JRuby

    sudo apt-get install openjdk-7-jdk

  3. Cài đặt RVM và Ruby

    Vào user deploy và cài đặt

    su - deploy
    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    \curl -sSL https://get.rvm.io | bash -s stable
Cài đặt xong hãy logout và login lại vào user deploy, sau đó cài đặt Ruby.
    rvm install ruby

Như vậy bạn đã cài đặt xong các package cần thiết. Tiếp theo ta hãy cùng tiến hành chạy Rails server.

Chạy Rails server trên EC2

Đã làm được đến đây thì việc chạy server Rails khá đơn giản. Bạn tạo một application mới và thiết lập như bình thường, push code lên Github của bạn và Clone app đó về instance EC2 trong khi bạn đang trong user deploy

Hãy chạy câu lệnh sau:

RAILS_ENV=production rake assets:precompile

Mục đích là để precompile assets của app để các image, CSS và scripts được load.

Đến đây, hãy thử chạy server giống như bạn vẫn làm ở local xem sao, khác ở điểm môi trường ở đây là production.

RAILS_ENV=production rails server

Sau đó mở browser ra gõ địa chỉ public IP của Instance EC2 vào.

http://server_public_IP:3000

Bạn đã thấy gì chưa ? Tôi đoán là chưa. Vì server Rails chạy trên cổng 3000, nếu bạn chưa mở cổng 3000 cho server thì sẽ không access được. Lúc này ta lại quay lại giao diện console EC2 và mở cổng 3000 bằng cách chỉnh lại thiết lập của security group của instance EC2 của bạn.

Security group setting1.png

Hãy thiết lập Inbound của Security Group như sau:

Security group setting2.png

Lúc này cổng 3000 của server đã được mở, bạn đã gần xong rồi. Việc còn lại, hãy thêm option --binding=0.0.0.0.

Thử access lại vào public IP của bạn lần nữa xem. Olala, trang web đã mở ra rồi phải không. Chúc mừng bạn đã config thành công server rails trên AWS.

Lời kết

Đây là một trong những thiết lập đơn giản của AWS tuy nhiên đối với các bạn chưa quen sử dụng thì nó tương đối lằng nhằng, rắc rối. Hi vọng qua bài viết này bạn có thể nắm được cách cài đặt server Ruby trên AWS. Trong bài sau, tôi sẽ nói về cách chạy server bằng Unicorn kết hợp với Nginx và deploy code tự động với gem Capistrano. Chào thân ái và quyết thắng.

Tài liệu tham khảo

  1. https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04
  2. http://www.sitepoint.com/deploy-your-rails-app-to-aws/