Как использовать JRuby для запуска Rails-приложения на Apache Tomcat 7 и Ubuntu 14.04

Вступление

Ruby on Rails (RoR) - это очень популярный фреймворк, позволяющий разработчикам быстро создавать веб-приложения, придерживающиеся современных шаблонов проектирования. Используя Rails всего несколькими командами, вы можете создавать готовое к использованию приложение CRUD (создание, чтение, обновление, удаление) без необходимости написания какого-либо кода. Apache Phusion Passenger, Unicorn и Puma являются одними из популярных серверов, которые используются для запуска приложений Rails.

Производительность Ruby MRI значительно улучшилась за эти годы. Тем не менее, он все еще медленный по сравнению с такими языками, как Java или C. Если вас интересует более быстрое время записи, которое необходимо для критических, параллельных, распределенных приложений и приложений корпоративного уровня, вам следует вместо этого использовать * JRuby *, Java-реализацию Ruby.

Некоторые преимущества JRuby по сравнению с Ruby MRI

  • Concurrency * - Ruby MRI использует GIL (Global Interpreter Lock) и, следовательно, имеет ограниченный параллелизм. JRuby, с другой стороны, может использовать потоки JVM, что позволяет вам достичь гораздо более высокого уровня параллелизма. Обычно это самая важная причина, по которой JRuby выбирается среди других рубинов.

  • Потоковая безопасность * - большинство базовых классов Ruby не являются поточно-ориентированными. Использование таких классов в многопоточных приложениях подвержено ошибкам. Вместо этого JRuby может использовать классы Java, которые предназначены для параллельной обработки.

  • Больше библиотек * - Когда вы используете JRuby, в вашем распоряжении не только набор драгоценных камней Ruby, но и все библиотеки Java и Scala. Это позволяет вам сосредоточиться на основных функциях вашего приложения.

  • Простота развертывания. * Приложение JRuby on Rails можно упаковать в один файл WAR, который можно легко развернуть на любом сервере Java EE. Многие из них даже имеют браузерные интерфейсы для управления приложениями.

Что охватывает этот учебник

В этом уроке вы научитесь:

  • Создайте простое приложение CRUD с Rails (которое использует 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 ГБ ОЗУ, вам следует добавить как минимум 1 ГБ пространства подкачки. Обратитесь к следующему руководству для получения дополнительной информации: Как добавить своп в Ubuntu 14.04.

  • Установите последнюю версию RVM на вашем компьютере. Обратитесь к первому шагу из следующего учебного пособия: https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-on-ubuntu-12-04-lts-precise-pangolin-with -rvm # step-one% E2% 80% 94-install-ruby-with-rvm [Как установить Ruby on Rails в Ubuntu 12.04 LTS (Precise Pangolin) с помощью RVM]. Возможно, вам придется добавить ключ, прежде чем вы сможете установить RVM:

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

Следуйте этому руководству через команду.

Шаг 1 - Создайте простое приложение CRUD RoR

Инициализируйте RVM. Эта инициализация необходима для каждого нового терминала, который вы открываете.

. ~/.rvm/scripts/rvm

_ * Примечание *: Если у вас уже есть приложение Rails, которое использует Ruby 1.9.3, вы можете перейти к шагу 2. _

Создайте каталог для размещения всех ваших Rails-приложений и введите этот каталог.

mkdir ~/my_applications
cd ~/my_applications

Мы используем Ruby 1.9.3 для этого урока, потому что это последняя версия Ruby, которую поддерживает JRuby.

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 * для редактирования и раскомментируйте строку для драгоценного камня * therubyracer *. Этот драгоценный камень должен быть добавлен, потому что нашему приложению 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 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'spring',        group: :development
Вы захотите удалить часть `+, platform

ruby ​​` закомментированной строки ` therubyracer +`, потому что в конечном итоге мы будем использовать JRuby, а не Ruby.

Установите все драгоценные камни, перечисленные в.

bundle install

Добавьте несколько страниц в приложение, используя функцию лесов Rails.

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

Команда + rails g scaffold + генерирует несколько миграций. Примените их:

rake db:migrate

Измените корень приложения, чтобы показать список всех сотрудников. Используйте * nano *, чтобы отредактировать + ~ / my_applications / simple / config / rout.rb + и изменить его содержимое на то, что показано ниже, за исключением комментариев:

Rails.application.routes.draw do
 resources :employees

end

Ваше Rails-приложение, которое использует Ruby MRI, теперь готово. Запустите его на сервере разработки, введя:

rails s

Это займет минуту или две, чтобы начать.

Вы можете посетить приложение в своем браузере, посетив * http: // <server-IP>: 3000 *. Создайте пару записей, чтобы убедиться, что все работает как положено.

изображение: http: //i.imgur.com/dTBCir9.png [Приложение работает на сервере Ruby MRI WEBrick]

Вернитесь в консоль и остановите сервер, нажав * Ctrl + C *.

Шаг 2 - Установите Java 8

Для установки и использования JRuby требуется JDK. Oracle JDK 8 можно установить, используя после добавления PPA + webupd8team / java.

Добавьте репозиторий, введя следующее:

sudo add-apt-repository ppa:webupd8team/java

Нажмите * Enter *, чтобы принять новый репозиторий.

Обновите индексные файлы пакетов.

sudo apt-get update

Установите Oracle JDK 8.

sudo apt-get install oracle-java8-installer
  • Примечание *: Вам будет предложено принять лицензионное соглашение до начала фактической установки.

изображение: http: //i.imgur.com/UpKz5IL.png [Страница лицензионного соглашения Oracle]

Выберите * <Ok> * и нажмите * Enter *, затем выберите * <Yes> * и нажмите * 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 на Rails

Используйте RVM для установки и использования JRuby.

rvm install jruby
rvm use jruby

Последняя версия JRuby (1.7.16.1 по состоянию на ноябрь 2014 г.) теперь готова к использованию. Проверьте версию:

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 на Rails.

gem install rails -N

JRuby on Rails теперь установлен.

Шаг 4 - Настройте приложение для использования JRuby

Хотя многие гемы Ruby MRI полностью поддерживаются JRuby, некоторые гемы с собственным кодом не поддерживаются. Большинство драгоценных камней, которые являются интерфейсами к базам данных, попадают в эту категорию. Наше приложение в настоящее время использует гем * sqlite3 *, который не поддерживается 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
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'spring',        group: :development

Если вы не делали этого раньше, теперь вам нужно удалить настройку + platform из строки.

Некоторые из наших драгоценных камней требуют собственных расширений. Введите следующее, чтобы разрешить JRuby поддерживать расширения C.

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

Теперь вы можете установить недавно добавленные драгоценные камни.

bundle install

Если вы не используете SQLite3 в качестве базы данных, вам может понадобиться один из следующих гемов:

  • Для Derby: * activerecord-jdbcderby-adapter *

  • Для MySQL: * activerecord-jdbcmysql-adapter *

  • Для Postgres: * activerecord-jdbcpostgresql-adapter *

Шаг 5 - Обновите файлы политики Java

Используя браузер, загрузите JCE файле политики неограниченной юрисдикции. Сначала вам нужно будет принять лицензионное соглашение Oracle.

(Вы не можете файлы, потому что вы должны принять соглашение.)

На своем * локальном компьютере * загрузите файл на свой сервер, используя * scp *:

scp jce_policy-8.zip @:~

На вашем * сервере * установите утилиту распаковки:

sudo apt-get install unzip

Распакуйте файл в каталог в.

cd /tmp
unzip ~/jce_policy-8.zip

Скопируйте файлы политики в каталог JRE.

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: // <server-ip>: 3000 * и протестировать свое приложение. За исключением того факта, что он в настоящее время работает на JVM вместо Ruby MRI, вы не найдете ничего другого в приложении.

Вернитесь в терминал и нажмите * Ctrl + C *, чтобы остановить сервер.

Шаг 6 - Упакуйте приложение в развертываемый файл WAR

Чтобы запустить приложение JRuby on Rails в контейнере сервлета, таком как Tomcat, его необходимо сначала упаковать в файл WAR (веб-приложение ARchive). Это можно сделать с помощью драгоценного камня * warbler *.

Установите * warbler *.

gem install warbler

База данных SQLite, которую использует наше приложение, в настоящее время находится в каталоге приложения. Когда файл WAR генерируется, база данных в ее текущем состоянии будет помещена в файл WAR. Мы не хотим этого, потому что любые изменения, внесенные в базу данных после развертывания, будут перезаписаны при повторном развертывании приложения.

Таким образом, файлы базы данных SQLite должны быть перемещены в папку за пределами каталога приложения.

Создайте новый каталог для баз данных:

mkdir -p ~/databases/simple

В этом уроке нас интересует только разработка базы данных. Поэтому переместите файл базы данных разработки во вновь созданный каталог:

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

Отредактируйте файл, используя * nano *.

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

Обновите путь к базе данных разработки. Вы также можете удалить детали для других сред, потому что они вам не понадобятся для этого урока. После изменений ваш файл должен выглядеть следующим образом:

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

development:
 <<: *default
 database:

Славка также должен знать Rails-среду WAR. В этом уроке мы придерживаемся окружающей среды. Это указывается с помощью файла + config / warble.rb +.

Используйте * nano * для создания нового файла с именем

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

Добавьте следующее в файл:

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

Теперь наше приложение готово для упаковки в WAR-файл. Запустите следующую команду для создания файла:

warble executable war

Это займет несколько минут.

Успешный вывод должен выглядеть так:

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

На этом этапе в каталоге вашего приложения будет файл с именем. Добавление аргумента к команде создает файл WAR, в котором есть крошечный встроенный сервер (называемый Winstone). Этот файл может использоваться независимо (без какого-либо внешнего сервера) следующим образом:

java -jar simple.war

Это хороший способ проверить наличие проблем с файлом WAR. Теперь вы можете использовать браузер для посещения * http: // <server-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, создайте новый WAR для Tomcat, используя следующую команду:

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, равным * 512 м *, чтобы избежать + 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 *, чтобы завершить команду.

Tomcat теперь установлен и работает. Вы можете использовать браузер для посещения * http: // <server-ip>: 8080 *. Вы должны увидеть страницу приветствия Tomcat.

изображение: http: //i.imgur.com/AStL4HY.png [страница приветствия Apache Tomcat]

Шаг 8 - Разверните приложение на Tomcat

Чтобы развернуть WAR-файл в Tomcat, все, что вам нужно сделать, это скопировать его в папку Tomcat.

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: // <server-ip>: 8080 / simple / * и увидеть ваше приложение JRuby on Rails, работающее на Tomcat.

Перезапуск вашей сессии

Если вы отключитесь от сеанса 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 могут работать практически на всех контейнерах сервлетов. В этом уроке вы уже видели, как запустить его на Apache Tomcat и Winstone.

Related