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