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:
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ế USER
và APP_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.
Các tin liên quan
Cách cung cấp ứng dụng flask với Gunicorn và Nginx trên CentOS 72015-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