Thứ sáu, 14/11/2014 | 00:00 GMT+7

Cách sử dụng JRuby để chạy ứng dụng Rails trên Apache Tomcat 7 và Ubuntu 14.04

Ruby on Rails (RoR) là một khuôn khổ rất phổ biến cho phép các nhà phát triển nhanh chóng tạo ra các ứng dụng web tuân theo các mẫu thiết kế hiện đại. Sử dụng Rails, chỉ với một vài lệnh, bạn có thể xây dựng một ứng dụng vanilla CRUD (Tạo, Đọc, Cập nhật, Xóa) sẵn sàng production mà không cần phải viết bất kỳ mã nào. Apache Phusion Passenger, Unicorn và Puma là một số server phổ biến được sử dụng để chạy các ứng dụng Rails.

Hiệu suất của Ruby MRI đã được cải thiện đáng kể trong những năm qua. Tuy nhiên, nó vẫn còn chậm so với các ngôn ngữ như Java hoặc C. Nếu bạn quan tâm đến thời gian ghi nhanh hơn, điều này cần thiết cho các ứng dụng cấp doanh nghiệp, đồng thời, phân tán và quan trọng, bạn nên sử dụng JRuby , một triển khai Java của Ruby. .

Một số ưu điểm của JRuby so với Ruby MRI

Đồng thời - Ruby MRI sử dụng GIL (Khóa thông dịch viên global ) và do đó có giới hạn về tính đồng thời. Mặt khác, JRuby có thể sử dụng các stream của JVM, cho phép bạn đạt được mức độ đồng thời cao hơn nhiều. Đây thường là lý do quan trọng nhất tại sao JRuby được chọn hơn những viên Hồng ngọc khác.

An toàn stream - Hầu hết các lớp lõi của Ruby không an toàn cho stream . Sử dụng các lớp như vậy trong các ứng dụng đa stream rất dễ xảy ra lỗi. JRuby có khả năng sử dụng các lớp của Java thay thế, được thiết kế để xử lý song song.

Nhiều thư viện hơn - Khi bạn sử dụng JRuby, bạn có quyền sử dụng không chỉ kho các viên ngọc Ruby mà còn tất cả các thư viện Java và Scala. Điều này cho phép bạn tập trung nhiều hơn vào chức năng cốt lõi của ứng dụng.

Dễ dàng triển khai - Ứng dụng JRuby on Rails có thể được đóng gói thành một file WAR duy nhất, file này có thể được triển khai nhanh chóng cho bất kỳ server Java EE nào. Nhiều người trong số họ thậm chí còn có giao diện dựa trên trình duyệt để quản lý các ứng dụng.

Hướng dẫn này bao gồm những gì

Trong hướng dẫn này, bạn sẽ học cách:

  • Tạo một ứng dụng CRUD đơn giản với Rails (một ứng dụng sử dụng Ruby MRI)
  • Chuyển đổi ứng dụng Ruby on Rails của ta thành ứng dụng JRuby on Rails
  • Tạo file WAR cho ứng dụng
  • Cài đặt Apache Tomcat 7
  • Triển khai file WAR đến server Tomcat

Ở phần cuối của hướng dẫn, bạn sẽ triển khai ứng dụng JRuby on Rails đang hoạt động.

Yêu cầu

gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 

Làm theo hướng dẫn đó thông qua lệnh rvm Request .

Bước 1 - Tạo một ứng dụng CRUD RoR đơn giản

Khởi tạo RVM. Việc khởi tạo này là cần thiết cho mọi terminal mới mà bạn mở.

. ~/.rvm/scripts/rvm 

Lưu ý : Nếu bạn đã có ứng dụng Rails sử dụng Ruby 1.9.3, bây giờ bạn có thể chuyển sang Bước 2.

Tạo một folder để chứa tất cả các ứng dụng Rails của bạn và nhập folder đó.

mkdir ~/my_applications cd ~/my_applications 

Ta sử dụng Ruby 1.9.3 cho hướng dẫn này, vì đó là version Ruby mới nhất mà JRuby hỗ trợ.

rvm install 1.9.3 rvm use 1.9.3 

Cài đặt Rails.

gem install rails -N 

Tạo một ứng dụng Rails mới, được gọi là đơn giản .

rails new simple 

Nhập folder của ứng dụng.

cd ~/my_applications/simple 

Sử dụng nano để chỉnh sửa Gemfile và bỏ comment cho therubyracer đá quý. Đá quý này phải được thêm vào vì ứng dụng Rails của ta cần thời gian chạy JavaScript.

nano ~/my_applications/simple/Gemfile 

Bỏ qua các comment , file cập nhật của bạn sẽ giống như sau:

source 'https://rubygems.org'  gem 'rails', '4.1.7' gem 'sqlite3' gem 'sass-rails', '~> 4.0.3' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'therubyracer' gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 2.0' gem 'sdoc', '~> 0.4.0',          group: :doc gem 'spring',        group: :development 

Bạn cần xóa phần , platforms: :ruby của dòng therubyracer đã comment , vì cuối cùng ta sẽ sử dụng JRuby thay vì Ruby.

Cài đặt tất cả các đá quý được liệt kê trong Gemfile .

bundle install 

Thêm một vài trang vào ứng dụng bằng cách sử dụng tính năng giàn giáo của Rails.

rails g scaffold Employee name:string age:integer address:text 

Lệnh rails g scaffold tạo ra một vài lần di chuyển. Áp dụng chúng:

rake db:migrate 

Thay đổi folder root của ứng dụng để hiển thị danh sách tất cả nhân viên. Sử dụng nano để chỉnh sửa ~/my_applications/simple/config/routes.rb và thay đổi nội dung của nó thành những gì được hiển thị bên dưới, trừ các comment :

Rails.application.routes.draw do   resources :employees   root 'employees#index' end 

Ứng dụng Rails sử dụng Ruby MRI của bạn hiện đã sẵn sàng. Chạy nó trên server phát triển bằng lệnh :

rails s 

Quá trình này sẽ mất một hoặc hai phút để khởi động.

Bạn có thể truy cập ứng dụng trong trình duyệt của bạn bằng cách truy cập http: // <server-IP>: 3000 . Tạo một vài bản ghi đảm bảo mọi thứ đang hoạt động như mong đợi.

Ứng dụng chạy trên  server  Ruby MRI WEBrick

Quay lại console của bạn và dừng server bằng cách nhấn Ctrl + C.

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

Để cài đặt và sử dụng JRuby, cần phải có JDK. Oracle JDK 8 có thể được cài đặt bằng apt-get sau khi thêm webupd8team/java .

Thêm repository bằng lệnh vào thông tin sau:

sudo add-apt-repository ppa:webupd8team/java 

Nhấn Enter để chấp nhận repository mới.

Cập nhật các file index gói của apt-get .

sudo apt-get update 

Cài đặt Oracle JDK 8.

sudo apt-get install oracle-java8-installer 

Lưu ý : Bạn sẽ được yêu cầu chấp nhận thỏa thuận cấp phép trước khi quá trình cài đặt thực sự bắt đầu.

Trang Thỏa thuận Cấp phép của Oracle

Chọn <Ok> và nhấn Enter , sau đó chọn <Yes> và nhấn Enter .

Sau khi cài đặt xong, hãy chạy lệnh:

java -version 

Bạn có thể thấy kết quả sau, nghĩa là Java đã được cài đặt đúng cách:

java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode) 

Bước 3 - Cài đặt JRuby và JRuby trên Rails

Sử dụng RVM để cài đặt và sử dụng JRuby.

rvm install jruby rvm use jruby 

Phiên bản mới nhất của JRuby (1.7.16.1 tính đến tháng 11 năm 2014) hiện đã sẵn sàng để sử dụng. Kiểm tra version :

jruby -v 

Điều này cho bạn thấy server của bạn đang sử dụng Oracle JDK 8. Bạn sẽ thấy kết quả tương tự như sau:

jruby 1.7.16.1 (1.9.3p392) 2014-10-28 4e93f31 on Java HotSpot(TM) Client VM 1.8.0_25-b17 +jit [linux-i386] 

Cài đặt JRuby trên Rails.

gem install rails -N 

JRuby on Rails hiện đã được cài đặt.

Bước 4 - Cấu hình ứng dụng để sử dụng JRuby

Mặc dù rất nhiều viên ngọc Ruby MRI được JRuby hỗ trợ liền mạch, nhưng một số viên đá quý có mã root thì không. Hầu hết các đá quý là giao diện cho database đều thuộc loại này. Ứng dụng của ta hiện đang sử dụng gem sqlite3 , không được JRuby hỗ trợ. Activerecord-jdbcsqlite3-adapter nên được sử dụng thay thế.

Tương tự, JRuby sử dụng therubyrhino thay vì therubyracer gem như một công cụ JavaScript.

Sử dụng nano để chỉnh sửa ~/my_applications/simple/Gemfile để thực hiện thay đổi này.

nano ~/my_applications/simple/Gemfile 

Tệp của bạn sẽ trông như thế này sau khi cập nhật hai dòng, trừ đi các comment :

source 'https://rubygems.org'  gem 'rails', '4.1.7' gem 'activerecord-jdbcsqlite3-adapter' gem 'sass-rails', '~> 4.0.3' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'therubyrhino' gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 2.0' gem 'sdoc', '~> 0.4.0',          group: :doc gem 'spring',        group: :development 

Nếu trước đây bạn chưa làm, bây giờ bạn cần xóa cài đặt platform khỏi dòng therubyrhino .

Một số đá quý của ta yêu cầu phần mở rộng root . Nhập thông tin sau để cho phép JRuby hỗ trợ các phần mở rộng C.

echo "cext.enabled=true" >> ~/.jrubyrc 

Đến đây bạn có thể cài đặt các đá quý mới được thêm vào.

bundle install 

Nếu bạn không sử dụng SQLite3 làm database , bạn có thể cần một trong những viên ngọc sau:

  • Đối với Derby: activerecord-jdbcderby-adapter
  • Đối với MySQL: activerecord-jdbcmysql-adapter
  • Đối với Postgres: activerecord-jdbcpostgresql-adapter

Bước 5 - Cập nhật file policy của Java

Sử dụng trình duyệt, download tệp policy Quyền hạn sức mạnh không giới hạn của JCE . Bạn sẽ phải chấp nhận Thỏa thuận Cấp phép của Oracle trước.

(Bạn không thể wget các file vì bạn phải chấp nhận thỏa thuận.)

Trên máy tính local của bạn, tải file lên server của bạn bằng cách sử dụng scp :

scp Downloads/jce_policy-8.zip user@server-ip:~ 

Trên server của bạn, hãy cài đặt tiện ích extract :

sudo apt-get install unzip 

Extract file trong folder trong / tmp .

cd /tmp unzip ~/jce_policy-8.zip 

Sao chép các file policy vào folder lib / security của JRE.

cd /tmp/UnlimitedJCEPolicyJDK8 sudo cp *.jar /usr/lib/jvm/java-8-oracle/jre/lib/security/ 

Quay lại folder ứng dụng của bạn.

cd ~/my_applications/simple 

Thực hiện lệnh sau để tăng tốc khởi động JVM. Điều này là cần thiết vì các môi trường server ảo có xu hướng tự tạo ra rất ít ngẫu nhiên.

export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"  

Đến đây, ứng dụng Rails của ta đã được cấu hình đầy đủ để sử dụng JRuby. Khởi động server phát triển:

rails s 

Server này có thể mất vài giây để khởi động. Chờ cho đến khi bạn thấy kết quả sau trước khi tiếp tục:

=> Booting WEBrick => Rails 4.1.7 application starting in development on http://0.0.0.0:3000 => Run `rails server -h` for more startup options => Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option) => Ctrl-C to shutdown server [2014-11-06 04:38:15] INFO  WEBrick 1.3.1 [2014-11-06 04:38:15] INFO  ruby 1.9.3 (2014-09-25) [java] [2014-11-06 04:38:15] INFO  WEBrick::HTTPServer#start: pid=2620 port=3000 

Sử dụng trình duyệt để truy cập http: // <server-ip>: 3000 và kiểm tra ứng dụng của bạn. Ngoại trừ thực tế là nó hiện đang chạy trên JVM thay vì sử dụng Ruby MRI, bạn sẽ không thấy gì khác biệt về ứng dụng.

Quay lại terminal và nhấn Ctrl + C để dừng server .

Bước 6 - Đóng gói ứng dụng dưới dạng file WAR có thể triển khai

Để chạy ứng dụng JRuby on Rails trên một container servlet như Tomcat, trước tiên nó phải được đóng gói thành một file WAR (Web application ARchive). Điều này có thể được thực hiện bằng cách sử dụng đá quý chim chích .

Cài đặt chim chích chòe .

gem install warbler 

Database SQLite mà ứng dụng của ta sử dụng hiện có trong folder của ứng dụng. Khi file WAR được tạo, database ở trạng thái hiện tại của nó sẽ được đặt bên trong file WAR. Ta không muốn điều này, bởi vì bất kỳ thay đổi nào được thực hiện đối với database sau khi triển khai sẽ bị overrides nếu ứng dụng được triển khai lại.

Do đó, các file database SQLite nên được chuyển đến vị trí bên ngoài folder của ứng dụng.

Tạo một folder mới cho database :

mkdir -p ~/databases/simple 

Trong hướng dẫn này, ta chỉ quan tâm đến database phát triển. Do đó, hãy di chuyển file database phát triển đến folder mới được tạo:

mv ~/my_applications/simple/db/development.sqlite3 ~/databases/simple 

Chỉnh sửa file database.yml bằng nano .

nano ~/my_applications/simple/config/database.yml 

Cập nhật đường dẫn của database phát triển. Bạn cũng có thể xóa các chi tiết cho các môi trường khác, vì bạn sẽ không cần chúng cho hướng dẫn này. Sau khi thay đổi, file của bạn sẽ giống như sau:

default: &default   adapter: sqlite3   pool: 5   timeout: 5000  development:   <<: *default   database: ~/databases/simple/development.sqlite3 

Warbler cũng cần biết môi trường Rails của WAR. Trong hướng dẫn này, ta bám sát môi trường phát triển . Điều này được chỉ định bằng cách sử dụng file config/warble.rb .

Sử dụng nano để tạo một file mới có tên warble.rb

nano ~/my_applications/simple/config/warble.rb 

Thêm phần sau vào file :

Warbler::Config.new do |config|   config.webxml.rails.env = 'development' end 

Ứng dụng của ta hiện đã sẵn sàng để được đóng gói thành file WAR. Chạy lệnh sau để tạo file :

warble executable war 

Quá trình này sẽ mất một vài phút.

Đầu ra thành công sẽ giống như sau:

Downloading winstone-0.9.10-jenkins-43.jar rm -f simple.war Creating simple.war 

Đến đây, sẽ có một file có tên simple.war trong folder ứng dụng của bạn. Thêm đối số thực thi vào lệnh sẽ tạo file WAR có một server nhúng nhỏ (được gọi là Winstone) trong đó. Tệp này được dùng một cách bí mật (không có bất kỳ server bên ngoài nào) như sau:

java -jar simple.war 

Đây là một cách tốt để kiểm tra bất kỳ vấn đề nào với file WAR của bạn. Đến đây bạn có thể sử dụng trình duyệt để truy cập http: // <server-ip>: 8080 . Sau một vài phút, bạn có thể thấy ứng dụng của bạn hoạt động bình thường. Tất cả các mục bạn đã thực hiện trong ứng dụng database trước đó sẽ hiển thị ở đây.

Bạn nên đợi cho đến khi bạn thấy kết quả tương tự như sau để cho bạn biết rằng server đã khởi động:

Nov 13, 2014 12:24:37 PM winstone.Logger logInternal INFO: Started GET "/assets/application.js?body=1" for 108.29.37.206 at 2014-11-13 12:24:37 -0500 

Quay lại terminal và nhấn Ctrl + C để dừng server nhúng.

Đến đây bạn đã xác nhận ứng dụng đang hoạt động như một WAR, hãy tạo một WAR mới cho Tomcat bằng lệnh sau:

warble war 

Nó sẽ thay thế WAR thực thi cũ bằng một file WAR mới không có bất kỳ server nhúng nào trong đó.

Bước 7 - Cài đặt và khởi động Tomcat

Download version mới nhất của Tomcat.

cd ~ wget http://mirror.cc.columbia.edu/pub/software/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz 

Tạo một folder mới cho Tomcat và nhập folder đó.

mkdir ~/Tomcat cd ~/Tomcat 

Extract repository :

tar -xvzf ~/apache-tomcat-7.0.56.tar.gz 

Đặt kích thước đống tối đa có sẵn cho Tomcat thành 512m để tránh java.lang.OutOfMemoryError . Quá trình xuất này phải được thực hiện mỗi khi bạn khởi động server Tomcat.

export CATALINA_OPTS="-Xmx512m" 

Như trước đây, hãy đặt tạo ngẫu nhiên:

export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 

Khởi động Tomcat:

~/Tomcat/apache-tomcat-7.0.56/bin/catalina.sh start 

Server này cũng mất vài giây để khởi động. Để theo dõi log của nó, hãy nhập:

tail -f ~/Tomcat/apache-tomcat-7.0.56/logs/catalina.out 

Khi server sẵn sàng, bạn sẽ thấy các thông báo log như sau:

Nov 10, 2014 4:12:32 AM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deployment of web application directory ~/Tomcat/apache-tomcat-7.0.56/webapps/manager has finished in 210 ms Nov 10, 2014 4:12:32 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"] Nov 10, 2014 4:12:32 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-bio-8009"] Nov 10, 2014 4:12:32 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 3390 ms 

Nhấn Ctrl + C để kết thúc lệnh đuôi .

Tomcat hiện đã được cài đặt và chạy. Bạn có thể sử dụng trình duyệt để truy cập http: // <server-ip>: 8080 . Bạn có thể xem trang chào mừng của Tomcat.

Trang chào mừng Apache Tomcat

Bước 8 - Triển khai ứng dụng cho Tomcat

Để triển khai WAR cho Tomcat, tất cả những gì bạn phải làm là sao chép nó vào folder webapps của Tomcat.

cp ~/my_applications/simple/simple.war ~/Tomcat/apache-tomcat-7.0.56/webapps 

Có thể mất một phút hoặc lâu hơn để ứng dụng của bạn được triển khai tự động. Trong khi chờ đợi, bạn có thể theo dõi nội dung của file log của Tomcat bằng cách sử dụng:

tail -f ~/Tomcat/apache-tomcat-7.0.56/logs/catalina.out 

Khi ứng dụng của bạn đã sẵn sàng để sử dụng, bạn sẽ thấy các thông báo log như sau:

INFO: Deploying web application archive ~/Tomcat/apache-tomcat-7.0.56/webapps/simple.war Oct 30, 2014 4:42:35 AM org.apache.catalina.startup.HostConfig deployWAR INFO: Deployment of web application archive ~/Tomcat/apache-tomcat-7.0.56/webapps/simple.war has finished in 47,131 ms 

Nhấn Ctrl + C để kết thúc lệnh tail .

Đến đây bạn có thể sử dụng trình duyệt để truy cập http: // <server-ip>: 8080 / simple / và xem ứng dụng JRuby on Rails của bạn đang chạy trên Tomcat.

Khởi động lại phiên của bạn

Nếu bạn ngắt kết nối khỏi phiên SSH của bạn bất kỳ lúc nào, bạn nên chạy ba lệnh sau:

cd ~/my_applications/simple . ~/.rvm/scripts/rvm rvm use jruby 

Và nếu bạn cần khởi động lại Tomcat, hãy chạy ba lệnh trước đó và đảm bảo bạn đặt hai biến môi trường trước khi khởi động server :

export CATALINA_OPTS="-Xmx512m" export JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" ~/Tomcat/apache-tomcat-7.0.56/bin/catalina.sh start 

Kết luận

Do đó, một ứng dụng Ruby on Rails có thể được chuyển đổi thành một ứng dụng JRuby on Rails chỉ với một vài thay đổi cấu hình. Các ứng dụng JRuby trên Rails có thể chạy trên hầu hết tất cả các container servlet. Trong hướng dẫn này, bạn đã biết cách chạy một chương trình trên Apache Tomcat và Winstone.


Tags:

Các tin liên quan

Cách cấu hình quyền truy cập WebDAV với Apache trên Ubuntu 14.04
2014-09-22
Cách cài đặt và bảo mật phpMyAdmin với Apache trên server CentOS 7
2014-08-07
Cách sử dụng Apache JMeter để thực hiện kiểm tra tải trên web server
2014-06-24
Cách cấu hình OCSP Stapling trên Apache và Nginx
2014-06-12
Cách tạo chứng chỉ SSL trên Apache cho Ubuntu 14.04
2014-04-23
Cách thiết lập server ảo Apache trên Ubuntu 14.04 LTS
2014-04-22
Cách cài đặt Apache Tomcat 7 trên Ubuntu 14.04 qua Apt-Get
2014-04-18
Cách thiết lập server ảo Apache trên Ubuntu 13.10
2014-04-16
Cách chạy Django với mod_wsgi và Apache với môi trường Python virtualenv trên VPS Debian
2014-04-10
Cách di chuyển cấu hình Apache của bạn từ cú pháp 2.2 sang 2.4.
2014-03-31