介绍

Ruby on Rails(RoR)是一个非常流行的框架,使开发人员能够快速创建符合现代设计模式的Web应用程序。使用Rails,只需几个命令,您就可以构建可用于生产环境的普通CRUD(创建,读取,更新,删除)应用程序,而无需编写任何代码。 Apache Phusion Passenger,Unicorn和Puma是一些流行的服务器,用于运行Rails应用程序。

多年来,Ruby MRI的性能已有很大提高。但是,与Java或C之类的语言相比,它仍然很慢。如果您对更快的写入速度(这对于关键,并发,分布式和企业级应用程序是必需的)感兴趣,则应改用JRuby(Ruby的Java实现) 。

JRuby优于Ruby MRI的一些优势

并发性— Ruby MRI使用GIL(全局解释器锁定),因此并发性有限。另一方面,JRuby能够使用JVM的线程,从而使您可以实现更高级别的并发性。通常,这是为什么选择JRuby而不是其他红宝石的最重要原因。

线程安全-Ruby的大多数核心类都不是线程安全的。在多线程应用程序中使用此类很容易出错。 JRuby可以改为使用Java的类,这些类是为并行处理而设计的。

更多的库—使用JRuby时,不仅可以使用Ruby gems的全部库,还可以使用所有Java和Scala库。这使您可以将更多精力放在应用程序的核心功能上。

易于部署-JRuby on Rails应用程序可以打包到单个WAR文件中,该文件可以轻松地部署到任何Java EE服务器。他们中的许多人甚至都具有基于浏览器的界面来管理应用程序。

本教程涵盖的内容

在本教程中,您将学习:

  • 使用Rails创建一个简单的CRUD应用程序(一个使用Ruby MRI的应用程序)
  • 将我们的Ruby on Rails应用程序转换为JRuby on Rails应用程序
  • 为应用程序生成WAR文件
  • 安装Apache Tomcat 7
  • 将WAR文件部署到Tomcat服务器

在本教程的最后,您将部署一个有效的JRuby on Rails应用程序。

先决条件

  • 部署32位Ubuntu 14.04 Droplet。 Tomcat和JRuby将在64位服务器上运行,但运行速度可能较慢。
  • 创建一个sudo用户。
  • 如果您的Droplet的RAM少于2 GB,则应至少添加1 GB的交换空间。有关更多信息,请参考以下教程:如何在Ubuntu 14.04上添加交换。
  • 在计算机上安装最新版本的RVM。请参考以下教程的第一步:如何在具有RVM的Ubuntu 12.04 LTS(精确的穿山甲)上安装Ruby on Rails。在安装RVM之前,可能需要添加密钥:
gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3

通过rvm requirements命令遵循该教程。

步骤1 —创建一个简单的CRUD RoR应用程序

初始化RVM。对于您打开的每个新终端,此初始化都是必需的。

. ~/.rvm/scripts/rvm
注意:如果您已经具有使用Ruby 1.9.3的Rails应用程序,则现在可以跳到步骤2。

创建一个目录以容纳所有的Rails应用程序,然后输入该目录。

mkdir ~/my_applications
cd ~/my_applications

我们在本教程中使用Ruby 1.9.3,因为这是JRuby支持的最新Ruby版本。

rvm install 1.9.3
rvm use 1.9.3

安装Rails。

gem install rails -N

创建一个新的Rails应用程序,名为simple。

rails new simple

输入应用程序的目录。

cd ~/my_applications/simple

使用nano编辑Gemfile并取消注释gem therubyracer的行。由于我们的Rails应用程序需要JavaScript运行时,因此必须添加该gem。

nano ~/my_applications/simple/Gemfile

忽略注释,更新后的文件应如下所示:

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

您需要删除已注释的therubyracer行中的,platform::ruby部分,因为最终我们将使用JRuby而不是Ruby。

安装Gemfile中列出的所有宝石。

bundle install

使用Rails的脚手架功能向应用程序添加几页。

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

rails g scaffold命令可生成一些迁移。应用它们:

rake db:migrate

更改应用程序的根目录以显示所有员工的列表。使用nano编辑〜/ my_applications / simple / config / routes.rb并将其内容更改为下面显示的内容,减去注释:

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

现在可以使用Ruby MRI的Rails应用程序了。输入以下内容在开发服务器上运行它:

rails s

这将需要一两分钟才能启动。

您可以通过访问http:// :3000在浏览器中访问该应用程序。创建几个记录,以确保一切正常。

返回控制台,然后按Ctrl + C停止服务器。

第2步-安装Java 8

为了安装和使用JRuby,需要JDK。添加webupd8team / java PPA之后,可以使用apt-get安装Oracle JDK 8。

通过输入以下内容来添加存储库:

sudo add-apt-repository ppa:webupd8team/java

按Enter接受新的存储库。

更新apt-get的软件包索引文件。

sudo apt-get update

安装Oracle JDK 8。

sudo apt-get install oracle-java8-installer

注意:在实际安装开始之前,系统将提示您接受许可协议。

选择<确定>,然后按Enter,然后选择<是>,然后按Enter。

安装完成后,运行命令:

java -version

您应该能够看到以下输出,这意味着Java已正确安装:

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)

第3步-在Rails上安装JRuby和JRuby

使用RVM安装和使用JRuby。

rvm install jruby
rvm use jruby

现在可以使用最新版本的JRuby(截至2014年11月为1.7.16.1)。检查版本:

jruby -v

这表明您的服务器正在使用Oracle JDK8。您应该看到类似以下的输出:

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]

安装JRuby on Rails。

gem install rails -N

现在已安装JRuby on Rails。

步骤4 —配置应用程序以使用JRuby

JRuby无缝支持许多Ruby MRI宝石,但某些具有本机代码的宝石却不受支持。作为数据库接口的大多数gem都属于此类。我们的应用程序当前使用sqlite3 gem,JRuby不支持它。应该改用activerecord-jdbcsqlite3-adapter。

同样,JRuby使用therubyrhino代替therubyracer gem作为JavaScript引擎。

使用nano编辑〜/ my_applications / simple / Gemfile进行此更改。

nano ~/my_applications/simple/Gemfile

更新两行后,减去注释后,您的文件应如下所示:

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

如果您以前没有使用过,现在您需要从therubyrhino行中删除平台设置。

我们的某些宝石需要本机扩展。输入以下内容以允许JRuby支持C扩展。

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

现在,您可以安装新添加的gem。

bundle install

如果您没有将SQLite3用作数据库,则可能需要以下其中之一:

  • 对于Derby:activerecord-jdbcderby-adapter
  • 对于MySQL:activerecord-jdbcmysql-adapter
  • 对于Postgres:activerecord-jdbcpostgresql-adapter

第5步-更新Java策略文件

使用浏览器下载“ JCE无限强度管辖权”策略文件。您必须先接受Oracle的许可协议。

(由于必须接受协议,因此无法获取文件。)

在本地计算机上,使用scp将文件上传到服务器:

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

在您的服务器上,安装unzip实用程序:

sudo apt-get install unzip

将文件解压缩到/ tmp中的目录中。

cd /tmp
unzip ~/jce_policy-8.zip

将策略文件复制到JRE的lib / security目录。

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

返回您的应用程序目录。

cd ~/my_applications/simple

执行以下命令以加快JVM的启动速度。这是必需的,因为虚拟服务器环境往往会自行产生很少的随机性。

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

至此,我们的Rails应用程序已完全配置为使用JRuby。启动开发服务器:

rails s

此服务器可能需要几秒钟才能启动。等待直到看到以下输出,然后继续:

=> 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

使用浏览器访问http:// :3000并测试您的应用程序。除了它当前正在JVM上运行而不是使用Ruby MRI的事实之外,您都不会发现该应用程序有什么不同。

返回终端,然后按Ctrl + C停止服务器。

步骤6 —将应用程序打包为可部署的WAR文件

要在Tomcat之类的servlet容器上运行JRuby on Rails应用程序,应首先将其打包到WAR(Web应用程序存档)文件中。这可以使用莺莺来完成。

安装莺。

gem install warbler

我们的应用程序使用的SQLite数据库当前位于应用程序的目录中。生成WAR文件时,当前状态的数据库将放置在WAR文件中。我们不希望这样做,因为如果重新部署应用程序,则部署后对数据库所做的任何更改都将被覆盖。

因此,应将SQLite数据库文件移动到应用程序目录之外的位置。

为数据库创建一个新目录:

mkdir -p ~/databases/simple

在本教程中,我们仅关注开发数据库。因此,将开发数据库文件移动到新创建的目录中:

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

使用nano编辑database.yml文件。

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

更新开发数据库的路径。您也可以删除其他环境的详细信息,因为在本教程中不需要它们。更改后,您的文件应如下所示:

default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: ~/databases/simple/development.sqlite3

鸣鸟还需要了解WAR的Rails环境。在本教程中,我们坚持开发环境。这是使用config / warble.rb文件指定的。

使用nano创建一个名为warble.rb的新文件

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

将以下内容添加到文件中:

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

现在,我们的应用程序已准备好可以打包到WAR文件中。运行以下命令以生成文件:

warble executable war

这将需要一些时间。

成功的输出应如下所示:

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

此时,您的应用程序目录中将有一个名为simple.war的文件。在命令中添加可执行文件参数会生成一个WAR文件,其中包含一个小型嵌入式服务器(称为Winstone)。该文件可以独立使用(没有任何外部服务器),如下所示:

java -jar simple.war

这是检查WAR文件是否存在任何问题的好方法。现在,您可以使用浏览器访问http:// :8080。几分钟后,您应该能够看到您的应用程序正常运行。您之前在数据库应用程序中所做的所有输入都应在此处可见。

您应该等到看到类似于以下内容的输出,才可以知道服务器已启动:

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

返回终端,然后按Ctrl + C停止嵌入式服务器。

现在,您已经确认该应用程序正在作为WAR工作,请使用以下命令为Tomcat生成一个新的WAR:

warble war

它将用旧的可执行WAR替换为其中没有任何嵌入式服务器的新WAR文件。

步骤7 —安装并启动Tomcat

下载最新版本的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

为Tomcat创建一个新目录,然后输入该目录。

mkdir ~/Tomcat
cd ~/Tomcat

提取档案:

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

将可用于Tomcat的最大堆大小设置为512m,以避免java.lang.OutOfMemoryError。每次启动Tomcat服务器时,都必须完成此导出。

export CATALINA_OPTS="-Xmx512m"

和以前一样,设置随机性生成:

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

启动Tomcat:

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

该服务器也需要花费几秒钟来启动。要监视其日志,请输入:

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

服务器准备就绪后,您将看到以下日志消息:

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

按Ctrl + C结束tail命令。

Tomcat现在已安装并正在运行。您可以使用浏览器访问http:// :8080。您应该可以看到Tomcat的欢迎页面。

步骤8 —将应用程序部署到Tomcat

要将WAR部署到Tomcat,您要做的就是将其复制到Tomcat的webapps文件夹中。

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

自动部署您的应用程序可能需要一分钟左右的时间。等待期间,您可以使用以下方法监视Tomcat日志文件的内容:

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

准备使用您的应用程序时,您将看到以下日志消息:

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

按Ctrl + C结束tail命令。

现在,您可以使用浏览器访问http:// :8080 / simple /,并查看在Tomcat上运行的JRuby on Rails应用程序。

重新开始会议

如果您随时与SSH会话断开连接,则应运行以下三个命令:

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

如果需要重新启动Tomcat,请运行前面的三个命令,并确保在启动服务器之前设置了两个环境变量:

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

结论

因此,只需进行一些配置更改就可以将Ruby on Rails应用程序转换为JRuby on Rails应用程序。 JRuby on Rails应用程序可以在几乎所有servlet容器上运行。在本教程中,您已经了解了如何在Apache Tomcat和Winstone上运行一个。