Thứ năm, 26/03/2015 | 00:00 GMT+7

Cách triển khai ứng dụng Rails với Unicorn và Nginx trên Ubuntu 14.04

Khi đã sẵn sàng triển khai ứng dụng Ruby on Rails, có nhiều cài đặt hợp lệ cần xem xét. Hướng dẫn này sẽ giúp bạn triển khai môi trường production của ứng dụng Ruby on Rails, với PostgreSQL làm database , sử dụng Unicorn và Nginx trên Ubuntu 14.04.

Unicorn là một server ứng dụng, như Passenger hoặc Puma , cho phép ứng dụng Rails của bạn xử lý các yêu cầu đồng thời. Vì Unicorn không được thiết kế để user truy cập trực tiếp, ta sẽ sử dụng Nginx làm Reverse Proxy để đệm các yêu cầu và phản hồi giữa user và ứng dụng Rails của bạn.

Yêu cầu

Hướng dẫn này giả định bạn có server Ubuntu 14.04 được cài đặt phần mềm sau, trên user sẽ triển khai ứng dụng:

Nếu bạn chưa cài đặt , hãy làm theo các hướng dẫn được liên kết ở trên. Ta sẽ giả định user của bạn được gọi là triển khai .

Ngoài ra, hướng dẫn này không đề cập đến cách cài đặt môi trường phát triển hoặc thử nghiệm của bạn. Nếu bạn cần trợ giúp về điều đó, hãy làm theo ví dụ trong hướng dẫn PostgreSQL với Rails.

Tạo ứng dụng Rails

Lý tưởng nhất là bạn đã có một ứng dụng Rails mà bạn muốn triển khai. Nếu đúng như vậy, bạn có thể bỏ qua phần này và thực hiện các thay thế thích hợp trong khi theo dõi. Nếu không, bước đầu tiên là tạo một ứng dụng Rails mới sử dụng PostgreSQL làm database của nó.

Lệnh này sẽ tạo một ứng dụng Rails mới, có tên là “appname” sẽ sử dụng PostgreSQL làm database . Vui lòng thay thế “tên ứng dụng” được đánh dấu bằng một cái gì đó khác:

  • rails new appname -d postgresql

Sau đó thay đổi vào folder ứng dụng:

  • cd appname

Hãy dành một chút thời gian để tạo user PostgreSQL sẽ được sử dụng bởi môi trường production của ứng dụng Rails của bạn.

Tạo user database production

Để đơn giản hóa mọi thứ, hãy đặt tên user database production giống với tên ứng dụng của bạn. Ví dụ: nếu ứng dụng của bạn được gọi là “appname”, bạn nên tạo một user PostgreSQL như sau:

  • sudo -u postgres createuser -s appname

Ta muốn đặt password của user database , vì vậy hãy nhập console PostgreSQL như sau:

  • sudo -u postgres psql

Sau đó, đặt password cho user database , “tên ứng dụng” trong ví dụ, như sau:

  • \password appname

Nhập password mong muốn của bạn và xác nhận nó.

Thoát khỏi console PostgreSQL bằng lệnh này:

  • \q

Bây giờ ta đã sẵn sàng để cấu hình ứng dụng của bạn với thông tin kết nối database thích hợp.

Cấu hình kết nối database

Đảm bảo rằng bạn đang ở trong folder root của ứng dụng ( cd ~/ appname ).

Mở file cấu hình database của ứng dụng trong editor yêu thích của bạn. Ta sẽ sử dụng vi:

  • vi config/database.yml

Trong phần default , tìm dòng có nội dung “pool: 5” và thêm dòng sau vào bên dưới (nếu nó chưa tồn tại):

  host: localhost 

Nếu bạn cuộn xuống cuối file , bạn sẽ nhận thấy rằng phần production được đặt như sau:

  username: appname   password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %> 

Nếu tên user production của bạn không trùng với user database mà bạn đã tạo trước đó, hãy đặt nó ngay bây giờ.

Lưu ý password database được cấu hình để được đọc bởi một biến môi trường, APPNAME _DATABASE_PASSWORD . Phương pháp hay nhất được coi là giữ password production và bí mật bên ngoài cơ sở mã ứng dụng của bạn, vì chúng có thể dễ dàng bị lộ nếu bạn đang sử dụng hệ thống kiểm soát version phân tán như Git. Tiếp theo, ta sẽ xem xét cách cài đặt xác thực database với các biến môi trường.

Cài đặt Plugin rbenv-vars

Trước khi triển khai ứng dụng Rails production , bạn nên đặt khóa bí mật production và password database bằng cách sử dụng các biến môi trường. Một cách dễ dàng để quản lý các biến môi trường, mà ta có thể sử dụng để tải password và bí mật vào ứng dụng của bạn trong thời gian chạy, là sử dụng plugin rbenv-vars .

Để cài đặt plugin rbenv-vars, chỉ cần thay đổi thành folder .rbenv/plugins và sao chép nó từ GitHub. Ví dụ: nếu rbenv được cài đặt trong folder chính của bạn, hãy chạy các lệnh sau:

  • cd ~/.rbenv/plugins
  • git clone https://github.com/sstephenson/rbenv-vars.git

Đặt các biến môi trường

Bây giờ plugin rbenv-vars đã được cài đặt, hãy cài đặt các biến môi trường bắt buộc.

Đầu tiên, tạo khóa bí mật, khóa này sẽ được sử dụng để xác minh tính toàn vẹn của cookie đã ký:

  • cd ~/appname
  • rake secret

Sao chép khóa bí mật được tạo, sau đó mở .rbenv-vars bằng editor yêu thích của bạn. Ta sẽ sử dụng vi:

  • vi .rbenv-vars

Ứng dụng Rails của bạn có thể đọc bất kỳ biến môi trường nào bạn đặt ở đây.

Đầu tiên, hãy đặt biến SECRET_KEY_BASE như thế này (thay thế văn bản được đánh dấu bằng bí mật mà bạn vừa tạo và sao chép):

SECRET_KEY_BASE=your_generated_secret 

Tiếp theo, đặt biến APPNAME _DATABASE_PASSWORD như thế này (thay thế “APPNAME” được đánh dấu bằng tên ứng dụng của bạn và “prod_db_pass” bằng password user database production của bạn):

APPNAME_DATABASE_PASSWORD=prod_db_pass 

Lưu và thoát.

Bạn có thể xem biến môi trường nào được đặt cho ứng dụng của bạn bằng plugin rbenv-vars bằng cách chạy lệnh này:

  • rbenv vars

Nếu bạn thay đổi password database hoặc bí mật của bạn , hãy cập nhật .rbenv-vars của bạn. Hãy cẩn thận giữ file này ở chế độ riêng tư và không đưa vào bất kỳ repository mã công khai nào.

Tạo database production

Bây giờ ứng dụng của bạn đã được cấu hình để nói chuyện với database PostgreSQL của bạn, hãy tạo database production :

  • RAILS_ENV=production rake db:create

Tạo bộ điều khiển

Nếu bạn đang làm theo cùng với ví dụ, ta sẽ tạo một bộ điều khiển giàn giáo để ứng dụng của ta sẽ có một cái gì đó để xem xét:

  • rails generate scaffold Task title:string note:text

Bây giờ hãy chạy lệnh này để cập nhật database production :

  • RAILS_ENV=production rake db:migrate

Biên dịch trước tài sản

Đến đây, ứng dụng sẽ hoạt động nhưng bạn cần phải biên dịch trước nội dung của nó để mọi hình ảnh, CSS và tập lệnh sẽ tải. Để làm như vậy, hãy chạy lệnh sau:

  • RAILS_ENV=production rake assets:precompile

Ứng dụng thử nghiệm

Để kiểm tra xem ứng dụng của bạn có hoạt động hay không, bạn có thể chạy môi trường production và liên kết nó với địa chỉ IP công cộng của server của bạn (thay thế địa chỉ IP công cộng của server ):

  • RAILS_ENV=production rails server --binding=server_public_IP

Bây giờ hãy truy cập URL này trong trình duyệt web:

http://server_public_IP:3000/tasks 

Nếu nó hoạt động bình thường, bạn sẽ thấy trang này:

Bộ điều khiển công việc

Quay lại server Rails của bạn và nhấn Ctrl-c để dừng ứng dụng.

Cài đặt Unicorn

Bây giờ ta đã sẵn sàng cài đặt Unicorn.

Một cách dễ dàng để làm điều này là thêm nó vào Gemfile của ứng dụng của bạn. Mở Gemfile trong trình soạn thảo yêu thích của bạn ( đảm bảo bạn đang ở trong folder root của ứng dụng):

  • vi Gemfile

Ở cuối file , thêm đá quý Unicorn với dòng này:

gem 'unicorn' 

Lưu và thoát.

Để cài đặt Unicorn và bất kỳ phụ thuộc nào còn tồn đọng, hãy chạy Bundler:

  • bundle

Unicorn hiện đã được cài đặt, nhưng ta cần phải cấu hình nó.

Cấu hình Unicorn

Hãy thêm cấu hình Unicorn của ta vào config/unicorn.rb . Mở file trong editor :

  • vi config/unicorn.rb

Copy paste cấu hình này vào file :

# set path to application app_dir = File.expand_path("../..", __FILE__) shared_dir = "#{app_dir}/shared" working_directory app_dir   # Set unicorn options worker_processes 2 preload_app true timeout 30  # Set up socket location listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64  # Logging stderr_path "#{shared_dir}/log/unicorn.stderr.log" stdout_path "#{shared_dir}/log/unicorn.stdout.log"  # Set master PID location pid "#{shared_dir}/pids/unicorn.pid" 

Lưu và thoát. Điều này cấu hình Unicorn với vị trí của ứng dụng của bạn và vị trí của socket , log và PID của nó. Vui lòng sửa đổi file hoặc thêm bất kỳ tùy chọn nào khác mà bạn yêu cầu.

Bây giờ hãy tạo các folder được tham chiếu trong file cấu hình:

  • mkdir -p shared/pids shared/sockets shared/log

Tạo Unicorn Init Script

Hãy tạo một tập lệnh init để ta có thể dễ dàng bắt đầu và dừng Unicorn, đồng thời đảm bảo nó sẽ bắt đầu khi server khởi động .

Tạo một tập lệnh và mở nó để chỉnh sửa bằng lệnh này (thay thế phần được đánh dấu bằng tên ứng dụng của bạn, nếu bạn muốn):

  • sudo vi /etc/init.d/unicorn_appname

Copy paste khối mã sau vào đó và đảm bảo thay thế USERAPP_NAME (được đánh dấu) bằng các giá trị thích hợp:

#!/bin/sh  ### BEGIN INIT INFO # Provides:          unicorn # Required-Start:    $all # Required-Stop:     $all # Default-Start:     2 3 4 5 # Default-Stop:      0 1 6 # Short-Description: starts the unicorn app server # Description:       starts unicorn using start-stop-daemon ### END INIT INFO  set -e  USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"  # app settings USER="deploy" APP_NAME="appname" APP_ROOT="/home/$USER/$APP_NAME" ENV="production"  # environment settings PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH" CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D" PID="$APP_ROOT/shared/pids/unicorn.pid" OLD_PID="$PID.oldbin"  # make sure the app exists cd $APP_ROOT || exit 1  sig () {   test -s "$PID" && kill -$1 `cat $PID` }  oldsig () {   test -s $OLD_PID && kill -$1 `cat $OLD_PID` }  case $1 in   start)     sig 0 && echo >&2 "Already running" && exit 0     echo "Starting $APP_NAME"     su - $USER -c "$CMD"     ;;   stop)     echo "Stopping $APP_NAME"     sig QUIT && exit 0     echo >&2 "Not running"     ;;   force-stop)     echo "Force stopping $APP_NAME"     sig TERM && exit 0     echo >&2 "Not running"     ;;   restart|reload|upgrade)     sig USR2 && echo "reloaded $APP_NAME" && exit 0     echo >&2 "Couldn't reload, starting '$CMD' instead"     $CMD     ;;   rotate)     sig USR1 && echo rotated logs OK && exit 0     echo >&2 "Couldn't rotate logs" && exit 1     ;;   *)     echo >&2 $USAGE     exit 1     ;; esac 

Lưu và thoát. Điều này sẽ cho phép bạn sử dụng service unicorn_ appname để bắt đầu và dừng Unicorn và ứng dụng Rails của bạn.

Cập nhật các quyền của tập lệnh và cho phép Unicorn bắt đầu khi server khởi động :

  • sudo chmod 755 /etc/init.d/unicorn_appname
  • sudo update-rc.d unicorn_appname defaults

Hãy bắt đầu ngay bây giờ:

  • sudo service unicorn_appname start

Như vậy, môi trường production ứng dụng Rails của bạn đang chạy dưới Unicorn và nó đang lắng nghe trên shared/sockets/unicorn.sock . Trước khi user bên ngoài có thể truy cập ứng dụng của bạn, bạn phải cài đặt Reverse Proxy Nginx.

Cài đặt và cấu hình Nginx

Cài đặt Nginx bằng apt-get:

  • sudo apt-get install nginx

Bây giờ hãy mở khối server mặc định bằng editor :

  • sudo vi /etc/nginx/sites-available/default

Thay thế nội dung của file bằng khối mã sau. Đảm bảo thay thế các phần được đánh dấu bằng tên user và tên ứng dụng thích hợp:

upstream app {     # Path to Unicorn SOCK file, as defined previously     server unix:/home/deploy/appname/shared/sockets/unicorn.sock fail_timeout=0; }  server {     listen 80;     server_name localhost;      root /home/deploy/appname/public;      try_files $uri/index.html $uri @app;      location @app {         proxy_pass http://app;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header Host $http_host;         proxy_redirect off;     }      error_page 500 502 503 504 /500.html;     client_max_body_size 4G;     keepalive_timeout 10; } 

Lưu và thoát. Điều này cấu hình Nginx như một Reverse Proxy , vì vậy các yêu cầu HTTP được chuyển tiếp đến server ứng dụng Unicorn thông qua socket Unix. Hãy thoải mái thực hiện bất kỳ thay đổi nào khi bạn thấy phù hợp.

Khởi động lại Nginx để các thay đổi có hiệu lực:

  • sudo service nginx restart

Như vậy, môi trường production của ứng dụng Rails của bạn có thể truy cập được thông qua địa chỉ IP công cộng của server hoặc FQDN. Để truy cập bộ điều khiển Công việc mà ta đã tạo trước đó, hãy truy cập server ứng dụng của bạn trong trình duyệt web:

http://server_public_IP/tasks 

Bạn sẽ thấy cùng một trang mà bạn đã thấy lần đầu tiên khi thử nghiệm ứng dụng của bạn , nhưng bây giờ nó đang được cung cấp thông qua Nginx và Unicorn.

Kết luận

Xin chúc mừng! Bạn đã triển khai môi trường production ứng dụng Ruby on Rails của bạn bằng Nginx và Unicorn.

Nếu bạn đang tìm cách cải thiện việc triển khai ứng dụng Rails production của bạn , bạn nên xem loạt bài hướng dẫn của ta về Cách sử dụng Capistrano để triển khai tự động . Loạt bài này dựa trên CentOS, nhưng nó vẫn hữu ích trong việc tự động hóa các triển khai của bạn.


Tags:

Các tin liên quan

Cách cung cấp ứng dụng flask với Gunicorn và Nginx trên CentOS 7
2015-03-23
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 14.04
2015-03-20
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên CentOS 7
2015-03-20
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 14.04
2015-03-19
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 14.04
2015-03-18
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên CentOS 7
2015-03-18
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên CentOS 7
2015-03-13
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên CentOS 7
2015-03-13
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Ubuntu 14.04
2015-03-11
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên Ubuntu 14.04
2015-03-06