Implement Load Balancing with Nginx in EC2

Tạo Rails project

Trong bài viết này, tôi sẽ sử dụng Capistrano cho việc deploy tự động. Chúng ta thêm vào Gemfile

group :development do
  gem "capistrano"
  gem "capistrano-rails"
  gem "capistrano-rvm"
  gem "capistrano3-puma"
end

Sau khi cài đặt các gem liên quan đến Capistrano, ta tạo ra các file config bằng cách:

bundle exec cap install

Tại file config/deploy.rb ta cần thiết lập các cài đặt chung cho các môi trường, có 2 cài đặt quan trọng là:

  • repo_url đây chính là nơi Capistrano lấy code trên Git về và copy vào server mình muốn deploy.
  • deploy_to là đường dẫn để copy code vào server.
# config/deploy.rb
set :application, "load_balancing"
set :repo_url, "[email protected]:NeverSmileK57CLC/load-balancing.git"

set :branch, "master"

set :deploy_to, "/var/www/html/app"
set :local_user, "bachngoc"

Tiếp theo ta cần khai báo linked_fileslinked_dirs nơi định nghĩa những file hay directory sẽ giữ nguyên qua các lần deploy.

# config/deploy.rb
set :linked_files, fetch(:linked_files, []).push(
  "config/database.yml",
  "config/secrets.yml",
)

set :linked_dirs, fetch(:linked_dirs, []).push(
  "log",
  "tmp/pids",
  "tmp/cache",
)

Config server trên production

Đầu tiên ta tạo server VPS, ở đây tôi tạo ra 4 con VPS ...

Tiếp theo, ta cài đặt Ruby, Rails, Nginx... trên các con server này

Config Nginx

Để cài đặt load balancer, ta sẽ cần sử dụng Nginx upstream module, mở file config Nginx ra:

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

Ta cần thêm cài đăt cho load balancer, ta cần upstream module và sau đó reference module đó vào server:

upstream loadbalancing  {
  server 35.164.240.167;
  server 35.167.212.102;
  server 35.167.171.130;
}

server {
  location / {
    proxy_pass  http://loadbalancing;
  }
}

Restart nginx:

sudo service nginx restart

Deploy

Ta cần tạo các file đã khai báo là shared_files ở phía trên gồm database.ymlsecrets.yml ở thư mục shared/config

Tiếp theo ta cần deploy Rails app mà ta vừa tạo lên VPS, ta đã config deploy tự động Capistrano ở phần trên nên ta chỉ cần:

cap production deploy

Sau đó ta thử vào http://35.163.155.2 đề xem kết quả.