Развёртывание Rails-приложений на Passenger и Nginx в CentOS 6.5

Данное руководство поможет создать надёжную основу для развёртывания приложений Rails в системе CentOS с помощью простого и производительного сервера приложений Phusion Passenger и HTTP-сервера Nginx.

Серверы и их роль в развёртывании приложений

Phusion Passenger – это производительный сервер приложений, который предназначен для обслуживания приложений и выступает в качестве вторичной точки входа для входящих запросов.

Nginx – это многоцелевой веб-сервер HTTP, который может обслуживать статические файлы (например, изображения, текстовые файлы и т.д.) и выполнять балансировку нагрузки. Он выступает в качестве первой точки входа всех запросов, и передает их серверу Passenger для обработки и возвращает ответ.

Сервер приложений Phusion Passenger

Многие разработчики рекомендуют использовать Phusion Passenger (или mod_rails) для поддержки приложений Rails. Это зрелый полнофункциональный сервер, который отвечает всем требованиям развёртываний и не нуждается в сложных настройках. Он устраняет необходимость использовать промежуточный сервер.

Passenger очень популярен и широко используется в производстве.

Версия Passenger с открытым исходным кодом предоставляет мультипроцессный однопоточный режим, а коммерческая версия поддерживает однопоточный и многопоточный режимы.

Примечание: Больше информации о Passenger можно найти на сайте проекта.

Обратный прокси-сервер Nginx

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

Примечание: Больше информации о Nginx можно получить на сайте проекта.

Подготовка сервера

Сначала нужно подготовить окружение для развёртывания приложения:

  • Обновить операционную систему;
  • Установить основные инструменты для развертывания;
  • Установить Ruby, Rails и дополнительные библиотеки;
  • Установить серверы Passenger и Nginx.

Обновление операционной системы

Чтобы обновить CentOS, введите:

yum -y update

Эта команда обновит все базовые приложения CentOS.

Установите инструменты для развёртывания:

yum groupinstall -y 'development tools'

В более новых версиях системы можно использовать:

yum groupinstall -y development

Этот набор инструментов содержит всё необходимое: gcc, make, automake, binutils, git и т.п.

Некоторых необходимых инструментов нет в официальном репозитории CentOS. Чтобы получить их, нужно добавить репозиторий EPEL.

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

После этого нужно обновить систему ещё раз:

yum -y update

Для взаимодействия Passenger и Nginx нужна библиотека curl-devel, а для работы Rails – sqlite-devel.

yum install -y curl-devel nano sqlite-devel libyaml-devel

Установка Ruby и Rails

Для загрузки и установки пакетов Ruby используйте менеджер версий RVM. Чтобы установить RVM, введите:

curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

Чтобы установить Ruby с помощью RVM, введите:

rvm reload
rvm install 2.1.0

Пакет RubyGems поможет установить остальные инструменты Ruby (например, фреймворк Rails).

Для работы Rails необходим интерпретатор JavaScript, потому сначала нужно установить Node.js:

yum install -y nodejs

Чтобы загрузить и установить Rails, введите:

gem install bundler rails

Установка серверов

Примечание: Если на сервере меньше 1 GB RAM, нужно добавить своп-файл. Инструкции можно найти здесь.

Установка Phusion Passenger

В репозитории системы можно найти пакеты Phusion Passenger, но они очень устарели. Потому сервер приложений лучше установить с помощью RubyGem.

gem install passenger

Чтобы убедиться, что установка прошла успешно, запустите:

passenger

Команда должна вернуть:

Phusion Passenger Standalone, the easiest way to deploy Ruby web apps.
Available commands:
passenger start            Start Phusion Passenger Standalone.
..

Установка Nginx

Как правило, Nginx устанавливается с помощью стандартного пакетного менеджера (yum) или из репозитория EPEL. Однако в таком случае Nginx не сможет взаимодействовать с Passenger. Чтобы исправить это, нужно установить Nginx из исходного кода, предварительно откорректировав его.

Чтобы начать компиляцию кода Nginx со встроенным модулем Passenger, запустите:

passenger-install-nginx-module

Программа предложит выбрать язык программирования (в данном случае это Ruby):

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.
‣ ⬢  Ruby
⬢  Python
⬢  Node.js
⬡  Meteor

В следующем окне выберите вариант 1:

1. Yes: download, compile and install Nginx for me. (recommended)
The easiest way to get started. A stock Nginx 1.4.4 with Passenger
support, but with no other additional third party modules, will be
installed for you to a directory of your choice.

Чтобы продолжить, нажмите Enter.

Исходный код будет загружен, скомпилирован и установлен с поддержкой Passenger.

Подготовка приложения к развёртыванию

В данном разделе вы найдёте инструкции по развёртыванию простого приложения Ruby On Rails. Чтобы развернуть приложение, загрузите базу кода и установите зависимости.

Создание простого приложения/ Загрузка кода

Для начала создайте простейшее приложение Rails в домашнем каталоге. Для этого запустите команды:

# Create a sample Rails application
cd /var
mkdir www
cd www
rails new my_app
# Enter the application directory
cd my_app
# Create a sample resource
rails generate scaffold Task title:string note:text
# Create a sample database
RAILS_ENV=development rake db:migrate

Чтобы убедиться, что приложение работает, откройте каталог приложения и запустите простой сервер приложений:

# Enter the application directory
cd /var/www/my_app
# Run a simple server
rails s
# You should now be able to access it by
# visiting: http://[your droplet's IP]:3000/tasks
# In order to terminate the server process,
# Press CTRL+C

Чтобы загрузить исходный код приложения, используйте SFTP или FileZilla.

Сценарий управления Nginx

Теперь нужно написать простой сценарий для сервера Nginx.

nano /etc/rc.d/init.d/nginx

Скопируйте и вставьте в файл такой код:

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

Сохраните и закройте файл.

Сделайте его исполняемым:

chmod +x /etc/rc.d/init.d/nginx

Настройка Nginx

Теперь нужно создать виртуальный хост Nginx (или блок server).

Откройте конфигурационный файл:

nano /opt/nginx/conf/nginx.conf

Найдите раздел http { и добавьте в него директивы passenger_root и passenger_ruby.

# Only for development purposes.
# For production environment, set it accordingly (i.e. production)
# Remove this line when you upload an actual application.
# For * TESTING * purposes only.
passenger_app_env development;

Затем найдите раздел server { .. и закомментируйте его:

..
#    location / {
#            root   html;
#            index  index.html index.htm;
#        }
..

Укажите root-каталог приложения:

root /var/www/my_app/public;
passenger_enabled on;

Сохраните и закройте файл.

Перезапустите Nginx:

/etc/init.d/nginx restart

Проверьте состояние Nginx:

/etc/init.d/nginx status

Чтобы протестировать приложение, откройте в браузере:

http://[server IP]/tasks
# Listing tasks
# Title    Note
# New Task

Примечание: Больше информации о настройке сервера Nginx можно найти здесь.

Tags: , , , , ,

Добавить комментарий