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

介绍

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

多年来,Ruby MRI的性能有了很大的提高。 但是,它仍然缓慢相比,如Java或C,如果你有兴趣更快的写入时间,这是必要的关键,同时,分布式和企业级应用程序的语言,你应该使用的JRuby相反,Java实现的Ruby 。

JRuby对Ruby的一些优点

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

线程安全性 -大多数Ruby的核心类不是线程安全的。 在多线程应用程序中使用这样的类是容易出错的。 JRuby能够使用Java的类,而是为并行处理而设计的。

更多的图书馆 -当你使用JRuby的,您在您的处置不仅是一个RubyGem的剧目,而且所有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应用程序部署。

先决条件

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

按照通过RVM要求命令教程。

第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应用程序,称为简单

rails new simple

输入应用程序的目录。

cd ~/my_applications/simple

使用nano编辑Gemfile中并取消创业板therubyracer行。 这个gem必须添加,因为我们的Rails应用程序需要一个JavaScript运行时。

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

你想删除的, platforms: :ruby的注释部分therubyracer行,因为最终我们将使用JRuby,而不是Ruby。

安装在Gemfile中列出的所有Gem。

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访问您的浏览器应用程序:// <服务器IP>:3000。 创建几个记录,以确保一切正常工作。

应用程序在Ruby MRI WEBrick服务器上运行

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

第2步 - 安装Java 8

为了安装和使用JRuby,需要JDK。 加入甲骨文后JDK 8可以使用安装apt-get的 webupd8team/java PPA。

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

sudo add-apt-repository ppa:webupd8team/java

Enter键接受新的存储库。

更新易于得到的包索引文件。

sudo apt-get update

安装Oracle JDK 8。

sudo apt-get install oracle-java8-installer

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

Oracle许可协议页

选择<确定>,然后按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步 - 安装JRuby和JRuby on Rails

使用RVM来安装和使用JRuby。

rvm install jruby
rvm use jruby

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

jruby -v

这显示您的服务器正在使用Oracle JDK 8.您应该看到类似于以下的输出:

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

虽然很多Ruby MRIGem由JRuby无缝支持,一些具有本地代码的Gem不是。 大多数作为数据库接口的gem都属于这一类。 我们的应用程序目前使用的sqlite3的Gem,它不支持JRuby吧。ActiveRecord的-jdbcsqlite3适配器应改为使用。

同样,JRuby的使用therubyrhino代替therubyracer创业板作为一个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

如果你以前没有,现在你需要删除platformtherubyrhino线路设置。

我们的一些gem需要本机扩展。 键入以下内容以允许JRuby支持C扩展。

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

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

bundle install

如果你不使用SQLite3作为数据库,你可能需要一个gems:

  • 对于德比:ActiveRecord的-jdbcderby适配器
  • 对于MySQL:ActiveRecord的-jdbcmysql适配器
  • 对于Postgres的:ActiveRecord的-jdbcpostgresql适配器

第5步 - 更新Java的策略文件

使用浏览器下载JCE无限制强度仲裁策略文件 您必须先接受Oracle的许可协议。

(因为你必须接受该协议不能wget的文件。)

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

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

在您的服务器上 ,安装解压缩工具:

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:// <服务器IP>:3000和测试应用程序。 除了它当前在JVM上运行而不是使用Ruby MRI的事实之外,您应该发现应用程序没有什么不同。

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

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

要在像Tomcat这样的servlet容器上运行JRuby on Rails应用程序,应首先将其打包到WAR(Web应用程序ARchive)文件中。 这可以通过使用Gem来完成。

安装

gem install warbler

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

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

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

mkdir -p ~/databases/simple

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

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

采用纳米编辑database.yml文件。

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

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

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

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

Warbler还需要知道Rails环境中的WAR。 在本教程中,我们坚持发展环境。 这是使用一个指定的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文件。 此文件可以独立使用(无需任何外部服务器),如下所示:

java -jar simple.war

这是检查WAR文件的任何问题的好方法。 现在,您可以使用浏览器访问http:// <服务器IP>: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:// <服务器IP>:8080。 你应该可以看到Tomcat的欢迎页面。

Apache 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:// <服务器IP>:8080 /简单/看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上运行一个。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏