介绍
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应用程序部署。
先决条件
部署一个32位的Ubuntu 14.04Droplet。 Tomcat和JRuby将在64位服务器上运行,但可能会更慢。
创建一个sudo的用户。
如果您的Droplet具有少于2 GB的RAM,则应至少添加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要求命令教程。
第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。 创建几个记录,以确保一切正常工作。
返回到您的控制台,并通过按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
注 :系统将提示您在实际安装开始之前接受许可协议。
选择<确定>,然后按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
如果你以前没有,现在你需要删除platform
从therubyrhino线路设置。
我们的一些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的欢迎页面。
第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上运行一个。