Thứ tư, 01/04/2015 | 00:00 GMT+7

Cách triển khai ứng dụng Rails với Puma 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 Puma và Nginx trên Ubuntu 14.04.

Puma là một server ứng dụng, giống như Passenger hoặc Unicorn , cho phép ứng dụng Rails của bạn xử lý các yêu cầu đồng thời. Vì Puma không được thiết kế để user truy cập trực tiếp nên 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 

Cập nhật phần production để nó trông giống như sau:

production:   <<: *default   host: localhost   adapter: postgresql   encoding: utf8   database: appname_production   pool: 5   username: <%= ENV['APPNAME_DATABASE_USER'] %>   password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %> 

Lưu ý tên user và password database được cấu hình để đọc bởi các biến môi trường, APPNAME _DATABASE_USERAPPNAME _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.

Lưu và thoát.

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_USER như thế này (thay thế “APPNAME” được đánh dấu bằng tên ứng dụng của bạn và “tên ứng dụng” bằng tên user database production của bạn):

APPNAME_DATABASE_USER=appname 

Cuối cùng, đặ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 

Bạn cũng nên biên dịch trước các nội dung:

RAILS_ENV=production rake assets:precompile 

Để 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 Puma

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

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ý Puma với dòng này:

gem 'puma' 

Lưu và thoát.

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

bundle 

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

Cấu hình Puma

Trước khi cấu hình Puma, bạn nên tra cứu số lõi CPU mà server của bạn có. Bạn có thể dễ dàng làm điều đó với lệnh này:

grep -c processor /proc/cpuinfo 

Bây giờ, hãy thêm cấu hình Puma của ta vào config/puma.rb Mở file trong editor :

vi config/puma.rb 

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

# Change to match your CPU core count workers 2  # Min and Max threads per worker threads 1, 6  app_dir = File.expand_path("../..", __FILE__) shared_dir = "#{app_dir}/shared"  # Default to production rails_env = ENV['RAILS_ENV'] || "production" environment rails_env  # Set up socket location bind "unix://#{shared_dir}/sockets/puma.sock"  # Logging stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true  # Set master PID and state locations pidfile "#{shared_dir}/pids/puma.pid" state_path "#{shared_dir}/pids/puma.state" activate_control_app  on_worker_boot do   require "active_record"   ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished   ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env]) end 

Thay đổi số lượng workers thành số lõi CPU của server của bạn.

Lưu và thoát. Điều này cấu hình Puma 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 Puma Upstart Script

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

Download công cụ Jungle Upstart từ kho Puma GitHub vào folder chính của bạn:

cd ~ wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf 

Bây giờ hãy mở file puma.conf được cung cấp, vì vậy ta có thể cấu hình user triển khai Puma:

vi puma.conf 

Tìm hai dòng chỉ định setuidsetgid , đồng thời thay thế “ứng dụng” bằng tên của user và group triển khai của bạn. Ví dụ: nếu user triển khai của bạn được gọi là "triển khai", các dòng sẽ trông như thế này:

setuid deploy setgid deploy 

Lưu và thoát.

Bây giờ sao chép các tập lệnh vào folder Dịch vụ khởi động:

sudo cp puma.conf puma-manager.conf /etc/init 

Tập lệnh puma-manager.conf tham chiếu /etc/puma.conf cho các ứng dụng mà nó sẽ quản lý. Hãy tạo và chỉnh sửa file khoảng không quảng cáo đó ngay bây giờ:

sudo vi /etc/puma.conf 

Mỗi dòng trong file này phải là đường dẫn đến ứng dụng mà bạn muốn puma-manager quản lý. Thêm đường dẫn đến ứng dụng của bạn ngay bây giờ. Ví dụ:

/home/deploy/appname 

Lưu và thoát.

Bây giờ ứng dụng của bạn đã được cấu hình để bắt đầu lúc khởi động, thông qua Upstart. Điều này nghĩa là ứng dụng của bạn sẽ bắt đầu ngay cả sau khi server của bạn được khởi động lại.

Khởi động ứng dụng Puma theo cách thủ công

Để bắt đầu tất cả các ứng dụng Puma được quản lý của bạn ngay bây giờ, hãy chạy lệnh sau:

sudo start puma-manager 

Bạn cũng có thể bắt đầu một ứng dụng Puma bằng cách sử dụng tập lệnh puma Upstart, như sau:

sudo start puma app=/home/deploy/appname 

Bạn cũng có thể sử dụng tính năng stoprestart để kiểm soát ứng dụng, như sau:

sudo stop puma-manager sudo restart puma-manager 

Bây giờ môi trường production ứng dụng Rails của bạn đang chạy dưới Puma và nó đang lắng nghe trên shared/sockets/puma.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 (hai vị trí):

upstream app {     # Path to Puma SOCK file, as defined previously     server unix:/home/deploy/appname/shared/sockets/puma.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 Puma 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à Puma.

Kết luận

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

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 triển khai ứng dụng Rails với Unicorn và Nginx trên Ubuntu 14.04
2015-03-26
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