如何使用 JRuby 在 Apache Tomcat 7 和 Ubuntu 14.04 上运行 Rails 应用程序

介绍

Ruby on Rails (RoR) 是一个非常流行的框架,允许开发人员快速创建符合现代设计模式的Web应用程序. 使用 Rails,只需使用几个命令,您可以创建一个生产准备的vanilla CRUD(创建,阅读,更新,删除)应用程序,而无需写任何代码。

然而,与Java或C等语言相比,Ruby MRI的性能有所改善,如果您对更快的写入时间感兴趣,这对于关键、同时、分布式和企业级的应用程序是必要的,您应该使用JRuby,而不是Java的Ruby实现。

JRuby 对 Ruby MRI 的优点

竞争性 — Ruby MRI使用GIL(全球解释器锁),因此具有有限的同步性。JRuby,另一方面,能够使用JVM的线程,允许您达到更高的同步性水平。

** 线程安全** — 大多数 Ruby 核心类不是线程安全的。在多线程应用中使用此类类是容易出现错误的。

** 更多图书馆** – 当您使用 JRuby 时,您不仅可以使用 Ruby 宝石,还可以使用所有 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 具有不到 2 GB 的 RAM,您应该添加至少 1 GB 的交换空间。 请参阅以下教程以获取更多信息: 如何在 Ubuntu 14.04 上添加交换
  • 在您的机器上安装最新版本的 RVM。 请参阅以下教程的步骤之一: [如何在 Ubuntu 12.04 LTS 上安装 Ruby on Rails (Precise Pangolin) 与 RVM([INKL2])]. 您可能需要在安装 RVM
1gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3

按照这个教程通过 rvm 要求命令。

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

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

1. ~/.rvm/scripts/rvm

注意:如果您已经拥有使用 Ruby 1.9.3 的 Rails 应用程序,您现在可以跳过步骤 2。

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

1mkdir ~/my_applications
2cd ~/my_applications

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

1rvm install 1.9.3
2rvm use 1.9.3

安装铁路。

1gem install rails -N

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

1rails new simple

进入应用程序目录。

1cd ~/my_applications/simple

使用 nano 来编辑 Gemfile 并对宝石 therubyracer 发表评论. 这个宝石必须添加,因为我们的 Rails 应用程序需要 JavaScript 运行时间。

1nano ~/my_applications/simple/Gemfile

忽略了评论,更新的文件应该是这样的:

 1source 'https://rubygems.org'
 2
 3gem 'rails', '4.1.7'
 4gem 'sqlite3'
 5gem 'sass-rails', '~> 4.0.3'
 6gem 'uglifier', '>= 1.3.0'
 7gem 'coffee-rails', '~> 4.0.0'
 8gem 'therubyracer'
 9gem 'jquery-rails'
10gem 'turbolinks'
11gem 'jbuilder', '~> 2.0'
12gem 'sdoc', '~> 0.4.0', group: :doc
13gem 'spring', group: :development

您将想要删除评论的therubyracer行中的平台:ruby部分,因为最终我们将使用JRuby而不是Ruby。

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

1bundle install

使用 Rails 的排列功能向应用程序添加几个页面。

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

「rails g scaffold」命令生成了一些迁移。

1rake db:migrate

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

1Rails.application.routes.draw do
2  resources :employees
3  root 'employees#index'
4end

使用 Ruby MRI 的 Rails 应用程序现在已经准备好了. 在开发服务器上运行,键入:

1rails s

这将需要一两分钟才能开始。

您可以访问您的浏览器中的应用程序,访问 http://:3000. 创建几个记录,以确保一切都按预期工作。

Application running on Ruby MRI WEBrick server

回到您的控制台,并通过按 Ctrl+C来停止服务器。

第2步:安装Java 8

要安装和使用 JRuby,需要一个 JDK。Oracle JDK 8 可以通过添加webupd8team/java PPA 来安装 apt-get。

添加存储器,键入如下:

1sudo add-apt-repository ppa:webupd8team/java

点击Enter以接受新的存储库。

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

1sudo apt-get update

安装 Oracle JDK 8。

1sudo apt-get install oracle-java8-installer

**注:在实际安装开始之前,您将被要求接受许可协议。

Oracle's License Agreement Page

选择 ,然后按 Enter,然后选择 ,然后按 Enter

安装完成后,运行命令:

1java -version

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

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

步骤 3 — 安装 JRuby 和 JRuby on Rails

使用 RVM 来安装和使用 JRuby。

1rvm install jruby
2rvm use jruby

JRuby 的最新版本 (2014 年 11 月 1.7.16.1) 现在已经准备好使用。

1jruby -v

這顯示您的伺服器正在使用 Oracle JDK 8,您應該看到類似的輸出:

1jruby 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。

1gem install rails -N

JRuby on Rails 已安装。

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

虽然许多Ruby MRI宝石都被JRuby无缝支持,但有些具有原生代码的宝石并非如此。大多数是数据库接口的宝石属于这个类别。

同样,JRuby 使用 therubyrhino 作为 JavaScript 引擎而不是 therubyracer 宝石。

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

1nano ~/my_applications/simple/Gemfile

更新两个行后,你的文件应该是这样的,减去评论:

 1source 'https://rubygems.org'
 2
 3gem 'rails', '4.1.7'
 4gem 'activerecord-jdbcsqlite3-adapter'
 5gem 'sass-rails', '~> 4.0.3'
 6gem 'uglifier', '>= 1.3.0'
 7gem 'coffee-rails', '~> 4.0.0'
 8gem 'therubyrhino'
 9gem 'jquery-rails'
10gem 'turbolinks'
11gem 'jbuilder', '~> 2.0'
12gem 'sdoc', '~> 0.4.0', group: :doc
13gem 'spring', group: :development

如果你以前没有,现在你需要从terubyrhino线中删除平台设置。

我们的某些宝石需要本地扩展。 键入以下,以允许 JRuby 支持 C 扩展。

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

您现在可以安装新增的宝石。

1bundle install

如果您不使用 SQLite3 作为数据库,您可能需要这些宝石之一:

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

步骤 5 – 更新 Java 策略文件

使用浏览器,下载 JCE Unlimited Strength Jurisdiction 政策文件

(您不能将文件加载,因为您必须接受协议。

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

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

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

1sudo apt-get install unzip

在 /tmp 中的目录中删除文件。

1cd /tmp
2unzip ~/jce_policy-8.zip

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

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

回到您的应用程序目录。

1cd ~/my_applications/simple

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

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

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

1rails s

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

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

使用浏览器访问 http://:3000并测试您的应用程序. 除非它目前在JVM上运行,而不是使用Ruby MRI,您不应该发现应用程序的不同。

返回终端并按 Ctrl + C 来停止服务器。

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

要在像 Tomcat 这样的服务器容器上运行 JRuby on Rails 应用程序,它首先应该被包装到 WAR (Web application ARchive) 文件中。

点击安装Warbler

1gem install warbler

我们的应用程序使用的 SQLite 数据库目前存在于应用程序的目录中.当生成 WAR 文件时,当前状态的数据库将放置在 WAR 文件中。

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

创建数据库的新目录:

1mkdir -p ~/databases/simple

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

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

使用 nano 编辑 database.yml 文件。

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

更新开发数据库的路径. 您也可以删除其他环境的详细信息,因为您将不需要这些信息用于本教程。

1default: &default
2  adapter: sqlite3
3  pool: 5
4  timeout: 5000
5
6development:
7  <<: *default
8  database: ~/databases/simple/development.sqlite3

Warbler 还需要知道 WAR 的 Rails 环境. 在本教程中,我们坚持开发环境。

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

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

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

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

我们的应用程序现在已经准备好被包装成一个WAR文件. 运行以下命令来生成该文件:

1warble executable war

这将需要几分钟。

成功的结果应该看起来像:

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

在此时,你的应用程序目录中会有一个名为 simple.war 的文件. 将可执行的参数添加到命令中会生成一个 WAR 文件,其中有一个微小的嵌入式服务器(称为 Winstone)。

1java -jar simple.war

现在您可以使用浏览器访问 http://:8080. 几分钟后,您应该能够看到您的应用程序正常工作。 您之前在数据库应用程序中创建的所有条目应该在这里可见。

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

1Nov 13, 2014 12:24:37 PM winstone.Logger logInternal
2INFO: 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:

1warble war

它将用一个没有嵌入式服务器的新的 WAR 文件代替旧的可执行 WAR。

步骤 7 — 安装和启动 Tomcat

下载最新版本的Tomcat。

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

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

1mkdir ~/Tomcat
2cd ~/Tomcat

提取档案:

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

将 Tomcat 可用的最大堆积大小设置为 512m,以避免java.lang.OutOfMemoryError

1export CATALINA_OPTS="-Xmx512m"

如前所述,设置随机性一代:

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

点击点击 Tomcat:

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

这个服务器也需要几秒钟才能启动. 要监控其日志,键入:

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

当服务器准备好时,您将看到这样的日志信息:

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

按 Ctrl + C 以完成尾巴命令。

您可以使用浏览器访问 http://:8080. 您应该能够看到Tomcat的欢迎页面。

Apache Tomcat welcome page

步骤 8 – 部署应用程序到Tomcat

要将WAR部署到Tomcat,您只需将其复制到Tomcat的webapps文件夹。

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

您的应用程序可能需要一分钟或更长时间才能自动部署,而您正在等待,您可以使用以下方式监控 Tomcat 日志文件的内容:

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

当您的应用程序准备好使用时,您将看到如下类似的日志信息:

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

按 Ctrl + C 以结束尾巴命令。

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

重新启动您的会议

如果您随时脱离 SSH 会话,您应该执行以下三个命令:

1cd ~/my_applications/simple
2. ~/.rvm/scripts/rvm
3rvm use jruby

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

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

结论

因此,Ruby on Rails 应用程序可以通过几个配置更改转换为 JRuby on Rails 应用程序。JRuby on Rails 应用程序可以在几乎所有服务器容器上运行。

Published At
Categories with 技术
comments powered by Disqus