Развёртывание Rails-приложений на Passenger и Nginx в CentOS 6.5
Centos, Ruby | Комментировать запись
Данное руководство поможет создать надёжную основу для развёртывания приложений 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: CentOS 6.5, NGINX, Passenger, Phusion Passenger, Rails, Ruby