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

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

Примечание: Данная установка выполнена на одном сервере, но со временем вы можете масштабировать её (как горизонтально, так и вертикально).

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

Unicorn – это зрелый многофункциональный сервер приложений для Rails.

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

Примечание: Чтобы узнать больше о серверах приложений Ruby, читайте эту статью.

Сервер приложений Unicorn

Unicorn – это производительный сервер приложений для Ruby. Принцип работы Unicorn таков: веб-сервер выполняет не все задачи, а только те, за которые отвечает непосредственно он, остальные задачи он передаёт другим программам, которые лучше справляются с их выполнением.

Главный процесс Unicorn порождает рабочие процессы для обработки запросов согласно заданным параметрам. Также этот процесс отслеживает рабочие процессы, чтобы предотвратить проблемы с ресурсами. То есть, если процесс требует много времени или ресурсов, сервер остановит его Unicorn.

Как говорилось раньше, Unicorn использует операционную систему для балансировки нагрузки; для этого он может передавать задачи другим сервисам. Благодаря этому запросы не скапливаются.

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

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

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

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

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

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

Установить серверы Unicorn и 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

Теперь установите библиотеки curl-devel и sqlite-devel.

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

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

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

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

gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

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

rvm reload
rvm install 2.1.0

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

yum install -y nodejs

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

gem install bundler rails

Установка Nginx

Установите пакет Nginx из репозитория EPEL:

yum install -y nginx

Установка Unicorn

Поскольку Unicorn является зависимостью приложения, рекомендуется загрузить этот пакет с помощью RubyGems. Для этого введите:

gem install unicorn

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

В данном разделе вы найдёте инструкции по развёртыванию простого приложения 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
RAILS_ENV=production  rake db:migrate
# Create a directory to hold the PID files
mkdir pids

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

# 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.

Настройка серверов

Настройка Unicorn

Рассмотрим процесс создания конфигурационного файла Unicorn с самого начала.

Откройте пустой документ unicorn.rb в каталоге config/:

nano config/unicorn.rb

Поместите в него следующий код:

# Set the working application directory
# working_directory "/path/to/your/app"
working_directory "/var/www/my_app"
# Unicorn PID file location
# pid "/path/to/pids/unicorn.pid"
pid "/var/www/my_app/pids/unicorn.pid"
# Path to logs
# stderr_path "/path/to/log/unicorn.log"
# stdout_path "/path/to/log/unicorn.log"
stderr_path "/var/www/my_app/log/unicorn.log"
stdout_path "/var/www/my_app/log/unicorn.log"
# Unicorn socket
listen "/tmp/unicorn.[app name].sock"
listen "/tmp/unicorn.myapp.sock"
# Number of processes
# worker_processes 4
worker_processes 2
# Time-out
timeout 30

Сохраните и закройте файл (CTRL+X, Y).

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

Настройка Nginx

Теперь нужно настроить Nginx для взаимодействия с Unicorn. Для этого нужно отредактировать конфигурационный файл по умолчанию, default.conf.

Примечание: Файл nginx.conf включает в себя параметры из default.conf, потому его не нужно редактировать.

nano /etc/nginx/conf.d/default.conf

Замените содержимое файла следующим кодом:

upstream app {
# Path to Unicorn SOCK file, as defined previously
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
# Application root, as defined previously
root /root/my_app/public;
try_files $uri/index.html $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}

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

Примечание: Чтобы узнать о настройке Nginx больше, читайте это руководство.

Управление сервером

Теперь можно развернуть приложение. Сначала запустите Unicorn:

# Make sure that you are inside the application directory
# i.e. /my_app
unicorn_rails -c config/unicorn.rb -D
# You can set the environment by chaining -E flag
# i.e. unicorn_rails .. .. .. -E [env. name]

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

service nginx restart

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

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

Tags: , , ,

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