Thứ tư, 03/06/2015 | 00:00 GMT+7

Triển khai ứng dụng Rails trên Ubuntu 14.04 với Capistrano, Nginx và Puma

Rails là một khung ứng dụng web open-souce được viết bằng Ruby. Nó tuân theo triết lý của Công ước về cấu hình bằng cách đưa ra các giả định có cách làm việc 'tốt nhất'. Điều này cho phép bạn viết ít mã hơn trong khi vẫn hoàn thành nhiều công việc hơn mà không cần phải duyệt qua các file cấu hình vô tận.

Nginx là một server HTTP hiệu suất cao, Reverse Proxy và bộ cân bằng tải được biết đến với trọng tâm là tính đồng thời, tính ổn định, khả năng mở rộng và mức tiêu thụ bộ nhớ thấp. Giống như Nginx, Puma là một web server cực kỳ nhanh và đồng thời khác với bộ nhớ rất nhỏ nhưng được xây dựng cho các ứng dụng web Ruby.

Capistrano là một công cụ tự động hóa server từ xa tập trung chủ yếu vào các ứng dụng web Ruby. Nó được sử dụng để triển khai ứng dụng web một cách tin cậy cho bất kỳ số lượng máy từ xa nào bằng cách viết kịch bản các quy trình công việc tùy ý qua SSH và tự động hóa các việc phổ biến như biên dịch trước nội dung và khởi động lại server Rails.

Trong hướng dẫn này, ta sẽ cài đặt Ruby và Nginx trên DigitalOcean Ubuntu Server và cấu hình Puma và Capistrano trong ứng dụng web của ta . Nginx sẽ được sử dụng để nắm bắt các yêu cầu của khách hàng và chuyển chúng đến web server Puma đang chạy Rails. Ta sẽ sử dụng Capistrano để tự động hóa các việc triển khai thông thường, vì vậy mỗi khi ta phải triển khai một version mới của ứng dụng Rails lên server , ta có thể thực hiện điều đó bằng một vài lệnh đơn giản.

Yêu cầu

Để làm theo hướng dẫn này, bạn phải có những điều sau:

  • Ubuntu 14.04 x64 Server
  • User không phải root có tên deploy với quyền sudo ( Cài đặt server ban đầu với Ubuntu 14.04 giải thích cách cài đặt điều này.)
  • Ứng dụng Working Rails được lưu trữ trong repository lưu trữ git từ xa đã sẵn sàng để triển khai

Theo tùy chọn, để bảo mật cao hơn, bạn có thể tắt đăng nhập root qua SSH và thay đổi số cổng SSH như được mô tả trong Cài đặt server ban đầu với Ubuntu 14.04 .

Cảnh báo: Sau khi tắt đăng nhập root, hãy đảm bảo bạn có thể SSH tới Server của bạn với quyền là user deploy và sử dụng sudo cho user này trước khi đóng phiên SSH root mà bạn đã mở để áp dụng các thay đổi này.

Tất cả các lệnh trong hướng dẫn này phải được chạy với quyền user deploy . Nếu cần có quyền truy cập root cho lệnh, nó sẽ được đặt trước sudo .

Bước 1 - Cài đặt Nginx

Khi VPS được bảo mật, ta có thể bắt đầu cài đặt các gói. Cập nhật các file index gói :

  • sudo apt-get update

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

  • sudo apt-get install curl git-core nginx -y

Bước 2 - Cài đặt database

Cài đặt database mà bạn sẽ sử dụng trong ứng dụng Rails của bạn . Vì có rất nhiều database để lựa chọn, ta sẽ không trình bày chúng trong hướng dẫn này. Bạn có thể xem hướng dẫn cho những cái chính tại đây:

Cũng nhớ kiểm tra:

Bước 3 - Cài đặt RVM và Ruby

Ta sẽ không cài đặt Ruby trực tiếp. Thay vào đó, ta sẽ sử dụng Trình quản lý version Ruby. Có rất nhiều trong số chúng để lựa chọn (rbenv, chruby, v.v.), nhưng ta sẽ sử dụng RVM cho hướng dẫn này. RVM cho phép bạn dễ dàng cài đặt và quản lý nhiều hồng ngọc trên cùng một hệ thống và sử dụng hồng ngọc đúng theo ứng dụng của bạn. Điều này làm cho cuộc sống dễ dàng hơn nhiều khi bạn phải nâng cấp ứng dụng Rails của bạn để sử dụng một viên ruby mới hơn.

Trước khi cài đặt RVM, bạn cần nhập RVM GPG Key:

  • gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

Sau đó, cài đặt RVM để quản lý Hồng ngọc của ta :

  • curl -sSL https://get.rvm.io | bash -s stable

Lệnh này sử dụng curl để download tập lệnh Cài đặt RVM từ https://get.rvm.io . Tùy chọn -sSL bao gồm ba cờ:

  • -s yêu cầu curl download file ở 'chế độ im lặng'
  • -S nói với curl để hiển thị thông báo lỗi nếu nó không thành công
  • -L cho curl làm theo tất cả các chuyển hướng HTTP trong khi truy xuất lệnh cài đặt

Sau khi download , tập lệnh sẽ được chuyển sang bash . Tùy chọn -s chuyển stable làm đối số cho tập lệnh Cài đặt RVM để download và cài đặt bản phát hành ổn định của RVM.

Lưu ý: Nếu lệnh thứ hai không thành công với thông báo “Xác minh chữ ký GPG không thành công”, điều đó nghĩa là Khóa GPG đã thay đổi, chỉ cần sao chép lệnh từ kết quả lỗi và chạy nó để download chữ ký. Sau đó chạy lệnh curl cho Cài đặt RVM.

Ta cần tải tập lệnh RVM (dưới dạng một hàm) để có thể bắt đầu sử dụng nó. Sau đó, ta cần chạy lệnh requirements để tự động cài đặt các file và file phụ thuộc cần thiết cho RVM và Ruby hoạt động bình thường:

  • source ~/.rvm/scripts/rvm
  • rvm requirements

Bây giờ ta có thể cài đặt Ruby mà ta lựa chọn. Ta sẽ cài đặt Ruby 2.2.1 mới nhất (tại thời điểm viết bài) làm Ruby mặc định của ta :

  • rvm install 2.2.1
  • rvm use 2.2.1 --default

Bước 4 - Cài đặt Rails và Bundler

Sau khi Ruby được cài đặt , ta có thể bắt đầu cài đặt Rubygems. Ta sẽ bắt đầu bằng cách cài đặt đá quý Rails sẽ cho phép ứng dụng Rails của bạn chạy và sau đó ta sẽ cài đặt bundler có thể đọc Gemfile của ứng dụng của bạn và tự động cài đặt tất cả các đá quý cần thiết.

Để cài đặt Rails và Bundler:

  • gem install rails -V --no-ri --no-rdoc
  • gem install bundler -V --no-ri --no-rdoc

Ba lá cờ đã được sử dụng:

  • -V (Verbose Output): In thông tin chi tiết về cài đặt Gem
  • --no-ri - (Skips Ri Documentation): Không cài đặt Ri Docs, tiết kiệm dung lượng và cài đặt nhanh chóng
  • --no-rdoc - (Bỏ qua RDocs): Không cài đặt RDocs, tiết kiệm dung lượng và tăng tốc độ cài đặt

Lưu ý: Bạn cũng có thể cài đặt một version Rails cụ thể theo yêu cầu của bạn bằng cách sử dụng cờ -v :

  • gem install rails -v '4.2.0' -V --no-ri --no-rdoc

Bước 5 - Cài đặt SSH key

Vì ta muốn cài đặt triển khai trơn tru, ta sẽ sử dụng Khóa SSH để ủy quyền. Trước tiên, hãy bắt tay với GitHub, Bitbucket hoặc bất kỳ Git Remote nào khác nơi lưu trữ cơ sở mã cho ứng dụng Rails của bạn:

  • ssh -T git@github.com
  • ssh -T git@bitbucket.org

Đừng lo lắng nếu bạn nhận được thông báo Permission denied (publickey) . Bây giờ, tạo SSH key (Cặp public key / riêng tư) cho server của bạn:

  • ssh-keygen -t rsa

Thêm public key mới được tạo ( ~/.ssh/id_rsa.pub ) vào khóa triển khai của repository của bạn:

Nếu tất cả các bước được hoàn thành chính xác, bây giờ bạn có thể clone repository git của bạn (qua Giao thức SSH, không phải HTTP) mà không cần nhập password :

  • git clone git@example.com:username/appname.git

Nếu bạn cần một ứng dụng mẫu để thử nghiệm, bạn có thể tách ứng dụng thử nghiệm sau được tạo riêng cho hướng dẫn này: Ứng dụng Rails mẫu trên GitHub

Lệnh git clone sẽ tạo một folder có cùng tên với ứng dụng của bạn. Ví dụ, một folder có tên testapp_rails sẽ được tạo.

Ta chỉ nhân bản để kiểm tra xem các khóa triển khai của ta có hoạt động hay không, ta không cần sao chép hoặc kéo repository của bạn mỗi khi ta đẩy các thay đổi mới. Ta sẽ để Capistrano xử lý tất cả những việc đó cho ta . Đến đây bạn có thể xóa folder nhân bản này nếu bạn muốn.

Mở một terminal trên máy local của bạn. Nếu bạn không có Khóa SSH cho máy tính local của bạn , hãy tạo một khóa cho nó. Trong phiên terminal tại local của bạn:

  • ssh-keygen -t rsa

Thêm Khóa SSH local của bạn vào file Khóa được ủy quyền của Server (hãy nhớ thay thế số cổng bằng số cổng tùy chỉnh của bạn):

  • cat ~/.ssh/id_rsa.pub | ssh -p your_port_num deploy@your_server_ip 'cat >> ~/.ssh/authorized_keys'

Bước 6 - Thêm cấu hình triển khai trong ứng dụng Rails

Trên máy local của bạn, tạo file cấu hình cho Nginx và Capistrano trong ứng dụng Rails của bạn. Bắt đầu bằng cách thêm những dòng này vào Gemfile trong Ứng dụng Rails:

Gemfile
 group :development do     gem 'capistrano',         require: false     gem 'capistrano-rvm',     require: false     gem 'capistrano-rails',   require: false     gem 'capistrano-bundler', require: false     gem 'capistrano3-puma',   require: false end  gem 'puma' 

Sử dụng bundler để cài đặt các bundler mà bạn vừa chỉ định trong Gemfile của bạn . Nhập lệnh sau để group ứng dụng Rails của bạn:

  • bundle

Sau khi đóng gói, hãy chạy lệnh sau để cấu hình Capistrano:

  • cap install

Điều này sẽ tạo ra:

  • Capfile trong folder root của ứng dụng Rails của bạn
  • file deploy.rb trong folder config
  • deploy folder trong folder config

Thay thế nội dung của Capfile của bạn bằng nội dung sau:

Capfile
# Load DSL and Setup Up Stages require 'capistrano/setup' require 'capistrano/deploy'  require 'capistrano/rails' require 'capistrano/bundler' require 'capistrano/rvm' require 'capistrano/puma'  # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } 

Capfile này tải một số tác vụ được định nghĩa vào file cấu hình Capistrano của bạn để giúp việc triển khai của bạn không gặp rắc rối, chẳng hạn như tự động:

  • Chọn đúng Ruby
  • Biên dịch trước tài sản
  • Nhân bản repository Git của bạn vào đúng vị trí
  • Cài đặt các phụ thuộc mới khi Gem file đã thay đổi

Thay thế nội dung của config/deploy.rb bằng các trường sau, cập nhật các trường được đánh dấu màu đỏ với các thông số ứng dụng và Server:

config / deploy.rb
 # Change these server 'your_server_ip', port: your_port_num, roles: [:web, :app, :db], primary: true  set :repo_url,        'git@example.com:username/appname.git' set :application,     'appname' set :user,            'deploy' set :puma_threads,    [4, 16] set :puma_workers,    0  # Don't change these unless you know what you're doing set :pty,             true set :use_sudo,        false set :stage,           :production set :deploy_via,      :remote_cache set :deploy_to,       "/home/#{fetch(:user)}/apps/#{fetch(:application)}" set :puma_bind,       "unix://#{shared_path}/tmp/sockets/#{fetch(:application)}-puma.sock" set :puma_state,      "#{shared_path}/tmp/pids/puma.state" set :puma_pid,        "#{shared_path}/tmp/pids/puma.pid" set :puma_access_log, "#{release_path}/log/puma.error.log" set :puma_error_log,  "#{release_path}/log/puma.access.log" set :ssh_options,     { forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa.pub) } set :puma_preload_app, true set :puma_worker_timeout, nil set :puma_init_active_record, true  # Change to false when not using ActiveRecord  ## Defaults: # set :scm,           :git # set :branch,        :master # set :format,        :pretty # set :log_level,     :debug # set :keep_releases, 5  ## Linked Files & Directories (Default None): # set :linked_files, %w{config/database.yml} # set :linked_dirs,  %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}  namespace :puma do   desc 'Create Directories for Puma Pids and Socket'   task :make_dirs do     on roles(:app) do       execute "mkdir #{shared_path}/tmp/sockets -p"       execute "mkdir #{shared_path}/tmp/pids -p"     end   end    before :start, :make_dirs end  namespace :deploy do   desc "Make sure local git is in sync with remote."   task :check_revision do     on roles(:app) do       unless `git rev-parse HEAD` == `git rev-parse origin/master`         puts "WARNING: HEAD is not the same as origin/master"         puts "Run `git push` to sync changes."         exit       end     end   end    desc 'Initial Deploy'   task :initial do     on roles(:app) do       before 'deploy:restart', 'puma:start'       invoke 'deploy'     end   end    desc 'Restart application'   task :restart do     on roles(:app), in: :sequence, wait: 5 do       invoke 'puma:restart'     end   end    before :starting,     :check_revision   after  :finishing,    :compile_assets   after  :finishing,    :cleanup   after  :finishing,    :restart end  # ps aux | grep puma    # Get puma pid # kill -s SIGUSR2 pid   # Restart puma # kill -s SIGTERM pid   # Stop puma 

deploy.rb này chứa một số mặc định lành mạnh hoạt động hiệu quả để giúp bạn quản lý các bản phát hành ứng dụng của bạn và tự động thực hiện một số tác vụ khi bạn triển khai:

  • Sử dụng production làm môi trường mặc định cho ứng dụng Rails của bạn
  • Tự động quản lý nhiều bản phát hành ứng dụng của bạn
  • Sử dụng các tùy chọn SSH được tối ưu hóa
  • Kiểm tra xem điều khiển từ xa git của bạn đã cập nhật chưa
  • Quản lý log ứng dụng của bạn
  • Tải trước ứng dụng trong bộ nhớ khi quản lý công nhân Puma
  • Khởi động (hoặc khởi động lại) server Puma sau khi kết thúc triển khai
  • Mở socket cho server Puma tại một vị trí cụ thể trong bản phát hành của bạn

Bạn có thể thay đổi tất cả các tùy chọn tùy thuộc vào yêu cầu của bạn. Bây giờ, Nginx cần được cấu hình . Tạo config/nginx.conf trong folder dự án Rails của bạn và thêm phần sau vào nó ( , thay thế bằng các tham số của bạn):

config / nginx.conf
 upstream puma {   server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock; }  server {   listen 80 default_server deferred;   # server_name example.com;    root /home/deploy/apps/appname/current/public;   access_log /home/deploy/apps/appname/current/log/nginx.access.log;   error_log /home/deploy/apps/appname/current/log/nginx.error.log info;    location ^~ /assets/ {     gzip_static on;     expires max;     add_header Cache-Control public;   }    try_files $uri/index.html $uri @puma;   location @puma {     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     proxy_set_header Host $http_host;     proxy_redirect off;      proxy_pass http://puma;   }    error_page 500 502 503 504 /500.html;   client_max_body_size 10M;   keepalive_timeout 10; } 

Giống như file trước, nginx.conf này chứa các giá trị mặc định hoạt động khác với các cấu hình trong file deploy.rb của bạn. Điều này sẽ lắng nghe lưu lượng truy cập trên cổng 80 và chuyển yêu cầu đến socket Puma của bạn, ghi log nginx vào bản phát hành 'hiện tại' của ứng dụng của bạn, nén tất cả nội dung và lưu trữ chúng trong trình duyệt với thời hạn sử dụng tối đa, phục vụ các trang HTML công khai folder dưới dạng file tĩnh và đặt các giá trị Client Body Size tối đa và Request Timeout .

Bước 7 - Triển khai ứng dụng Rails của bạn

Nếu bạn đang sử dụng ứng dụng Rails của riêng mình, hãy xác nhận những thay đổi bạn vừa thực hiện và đẩy chúng sang điều khiển từ xa từ Máy local của bạn:

  • git add -A
  • git commit -m "Set up Puma, Nginx & Capistrano"
  • git push origin master

Lưu ý: Nếu đây là lần đầu tiên sử dụng GitHub từ hệ thống này, bạn có thể phải đưa ra các lệnh sau với tên user GitHub và địa chỉ email của bạn :

  • git config --global user.name 'Your Name'
  • git config --global user.email you@example.com

, từ máy local của bạn, hãy thực hiện triển khai đầu tiên của bạn:

  • cap production deploy:initial

Thao tác này sẽ đẩy ứng dụng Rails của bạn lên Server, cài đặt tất cả các đá quý cần thiết cho ứng dụng của bạn và khởi động web server Puma. Quá trình này có thể mất từ 5-15 phút tùy thuộc vào số lượng Đá quý mà ứng dụng của bạn sử dụng. Bạn sẽ thấy thông báo gỡ lỗi khi quá trình này xảy ra.

Nếu mọi thứ diễn ra suôn sẻ, ta hiện đã sẵn sàng kết nối web server Puma của bạn với Reverse Proxy Nginx.

Trên Server, Symlink nginx.conf với folder sites-enabled :

  • sudo rm /etc/nginx/sites-enabled/default
  • sudo ln -nfs "/home/deploy/apps/appname/current/config/nginx.conf" "/etc/nginx/sites-enabled/appname"

Khởi động lại dịch vụ Nginx:

  • sudo service nginx restart

Bây giờ, bạn có thể trỏ trình duyệt web của bạn tới IP server của bạn và xem ứng dụng Rails của bạn đang hoạt động!

Triển khai bình thường

Khi nào bạn áp dụng các thay đổi đối với ứng dụng của bạn và muốn triển khai bản phát hành mới cho server , hãy xác nhận các thay đổi, đẩy đến git remote của bạn như bình thường và chạy lệnh deploy :

  • git add -A
  • git commit -m "Deploy Message"
  • git push origin master
  • cap production deploy

Lưu ý: Nếu bạn thực hiện thay đổi đối với file config/nginx.conf , bạn sẽ phải reload hoặc khởi động lại dịch vụ Nginx trên server sau khi triển khai ứng dụng của bạn :

  • sudo service nginx restart

Kết luận

Được rồi, bây giờ bạn sẽ chạy ứng dụng Rails trên Server của bạn với Puma làm Web server của bạn cũng như Nginx và Capistrano được cấu hình với các cài đặt cơ bản. Đến đây bạn nên xem các tài liệu khác có thể giúp bạn tối ưu hóa cấu hình của bạn để khai thác tối đa ứng dụng Rails của bạn:


Tags:

Các tin liên quan

Cách xây dựng các SPA (Ứng dụng một trang) bằng NodeJS, SailsJS và DustJS trong Ubuntu 14.04
2015-05-27
Cách thiết lập môi trường puppet masterless trên Ubuntu 14.04
2015-04-29
Cách backup server Ubuntu 14.04 bằng Bacula
2015-04-17
Cách cài đặt WordPress với OpenLiteSpeed trên Ubuntu 14.04
2015-04-16
Cách triển khai Wordpress với Shipyard trên Ubuntu 14.04
2015-04-14
Cách quản lý Jenkins với Rancher trên Ubuntu 14.04
2015-03-25
Cách cài đặt Sandstorm trên Ubuntu 14.04
2015-03-19
Cách bảo vệ thông tin đăng nhập tài khoản WordPress của bạn với xác thực hai yếu tố trên Ubuntu 14.04
2015-03-16
Cách cài đặt Ruby on Rails với rbenv trên Ubuntu 14.04
2015-03-13
Cách thiết lập Gog trên Ubuntu 14.04
2015-03-11