Поиск по сайту:

Как развернуть приложение Rails с помощью Unicorn и Nginx в Ubuntu 14.04


Введение

Когда вы будете готовы развернуть свое приложение Ruby on Rails, необходимо рассмотреть множество допустимых настроек. Это руководство поможет вам развернуть производственную среду вашего приложения Ruby on Rails с PostgreSQL в качестве базы данных, используя Unicorn и Nginx в Ubuntu 14.04.

Unicorn — это сервер приложений, такой как Puma, который позволяет вашему приложению Rails обрабатывать запросы одновременно. Поскольку Unicorn не предназначен для прямого доступа пользователей, мы будем использовать Nginx в качестве обратного прокси-сервера, который будет буферизовать запросы и ответы между пользователями и вашим приложением Rails.

Предпосылки

В этом руководстве предполагается, что у вас есть сервер Ubuntu 14.04 со следующим программным обеспечением, установленным для пользователя, который будет развертывать приложение:

  • Ruby on Rails с использованием rbenv
  • PostgreSQL с Rails

Если вы еще не настроили это, следуйте инструкциям, указанным выше. Предположим, что ваш пользователь называется deploy.

Кроме того, в этом учебнике не рассматривается, как настроить среду разработки или тестирования. Если вам нужна помощь в этом, следуйте примеру в руководстве по PostgreSQL с Rails.

Создать приложение Rails

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

Эта команда создаст новое приложение Rails с именем \appname, которое будет использовать PostgreSQL в качестве базы данных. Не стесняйтесь заменять выделенное \appname чем-то другим:

  1. rails new appname -d postgresql

Затем перейдите в каталог приложения:

  1. cd appname

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

Создать пользователя производственной базы данных

Для простоты давайте назовем пользователя рабочей базы данных так же, как имя вашего приложения. Например, если ваше приложение называется \имя_приложения, вы должны создать пользователя PostgreSQL следующим образом:

  1. sudo -u postgres createuser -s appname

Мы хотим установить пароль пользователя базы данных, поэтому войдите в консоль PostgreSQL следующим образом:

  1. sudo -u postgres psql

Затем установите пароль для пользователя базы данных, в примере \appname, например:

  1. \password appname

Введите желаемый пароль и подтвердите его.

Выйдите из консоли PostgreSQL с помощью этой команды:

  1. \q

Теперь мы готовы настроить ваше приложение с правильной информацией о подключении к базе данных.

Настройка подключения к базе данных

Убедитесь, что вы находитесь в корневом каталоге вашего приложения (cd ~/appname).

Откройте файл конфигурации базы данных вашего приложения в вашем любимом текстовом редакторе. Мы будем использовать vi:

  1. vi config/database.yml

В разделе default найдите строку \pool: 5 и добавьте под ней следующую строку (если она еще не существует):

  host: localhost

Если вы прокрутите файл до конца, вы заметите, что раздел production установлен следующим образом:

  username: appname
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

Если ваше производственное имя пользователя не совпадает с именем пользователя базы данных, которое вы создали ранее, установите его сейчас.

Обратите внимание, что пароль базы данных настроен для чтения переменной среды APPNAME_DATABASE_PASSWORD. Рекомендуется хранить производственные пароли и секреты за пределами кодовой базы вашего приложения, поскольку они могут быть легко раскрыты, если вы используете распределенную систему управления версиями, такую как Git. Далее мы рассмотрим, как настроить аутентификацию базы данных с переменными среды.

Установите плагин rbenv-vars

Перед развертыванием рабочего приложения Rails вы должны установить производственный секретный ключ и пароль базы данных, используя переменные среды. Простой способ управления переменными среды, которые мы можем использовать для загрузки паролей и секретов в наше приложение во время выполнения, заключается в использовании плагина rbenv-vars.

Чтобы установить подключаемый модуль rbenv-vars, просто перейдите в каталог .rbenv/plugins и клонируйте его с GitHub. Например, если rbenv установлен в вашем домашнем каталоге, выполните следующие команды:

  1. cd ~/.rbenv/plugins
  2. git clone https://github.com/sstephenson/rbenv-vars.git

Установить переменные среды

Теперь, когда плагин rbenv-vars установлен, давайте настроим необходимые переменные среды.

Сначала сгенерируйте секретный ключ, который будет использоваться для проверки целостности подписанных файлов cookie:

  1. cd ~/appname
  2. rake secret

Скопируйте сгенерированный секретный ключ, затем откройте файл .rbenv-vars в своем любимом редакторе. Мы будем использовать vi:

  1. vi .rbenv-vars

Любые переменные среды, которые вы устанавливаете здесь, могут быть прочитаны вашим приложением Rails.

Сначала установите переменную SECRET_KEY_BASE следующим образом (замените выделенный текст секретом, который вы только что сгенерировали и скопировали):

SECRET_KEY_BASE=your_generated_secret

Затем установите переменную APPNAME_DATABASE_PASSWORD следующим образом (замените выделенное \APPNAME именем вашего приложения, а \prod_db_pass - паролем пользователя рабочей базы данных):

APPNAME_DATABASE_PASSWORD=prod_db_pass

Сохранить и выйти.

Вы можете просмотреть, какие переменные среды установлены для вашего приложения с помощью плагина rbenv-vars, выполнив эту команду:

  1. rbenv vars

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

Создать производственную базу данных

Теперь, когда ваше приложение настроено для взаимодействия с вашей базой данных PostgreSQL, давайте создадим рабочую базу данных:

  1. RAILS_ENV=production rake db:create

Создать контроллер

Если вы будете следовать примеру, мы создадим контроллер скаффолда, чтобы нашему приложению было на что посмотреть:

  1. rails generate scaffold Task title:string note:text

Теперь запустите эту команду, чтобы обновить производственную базу данных:

  1. RAILS_ENV=production rake db:migrate

Прекомпилировать активы

На этом этапе приложение должно работать, но вам нужно будет предварительно скомпилировать его ресурсы, чтобы загрузились любые изображения, CSS и скрипты. Для этого выполните эту команду:

  1. RAILS_ENV=production rake assets:precompile

Тестовое приложение

Чтобы проверить, работает ли ваше приложение, вы можете запустить производственную среду и привязать ее к общедоступному IP-адресу вашего сервера (замените общедоступный IP-адрес вашего сервера):

  1. RAILS_ENV=production rails server --binding=server_public_IP

Теперь перейдите по этому URL-адресу в веб-браузере:

http://server_public_IP:3000/tasks

Если он работает правильно, вы должны увидеть эту страницу:

Вернитесь на свой сервер Rails и нажмите Ctrl-c, чтобы остановить приложение.

Установить Единорог

Теперь мы готовы установить Unicorn.

Самый простой способ сделать это — добавить его в Gemfile вашего приложения. Откройте Gemfile в вашем любимом редакторе (убедитесь, что вы находитесь в корневом каталоге вашего приложения):

  1. vi Gemfile

В конце файла добавьте гем Unicorn с помощью этой строки:

gem 'unicorn'

Сохранить и выйти.

Чтобы установить Unicorn и любые незавершенные зависимости, запустите Bundler:

  1. bundle

Теперь Unicorn установлен, но нам нужно его настроить.

Настроить единорога

Давайте добавим нашу конфигурацию Unicorn в config/unicorn.rb. Откройте файл в текстовом редакторе:

  1. vi config/unicorn.rb

Скопируйте и вставьте эту конфигурацию в файл:

# set path to application
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir


# Set unicorn options
worker_processes 2
preload_app true
timeout 30

# Set up socket location
listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64

# Logging
stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stdout.log"

# Set master PID location
pid "#{shared_dir}/pids/unicorn.pid"

Сохранить и выйти. Это настраивает Unicorn с расположением вашего приложения и расположением его сокета, журналов и PID. Не стесняйтесь изменять файл или добавлять любые другие параметры, которые вам нужны.

Теперь создайте каталоги, на которые ссылались в файле конфигурации:

  1. mkdir -p shared/pids shared/sockets shared/log

Создать сценарий инициализации единорога

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

Создайте скрипт и откройте его для редактирования с помощью этой команды (замените выделенную часть на имя вашего приложения, если хотите):

  1. sudo vi /etc/init.d/unicorn_appname

Скопируйте и вставьте в него следующий блок кода и обязательно замените USER и APP_NAME (выделены) соответствующими значениями:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the unicorn app server
# Description:       starts unicorn using start-stop-daemon
### END INIT INFO

set -e

USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"

# app settings
USER="deploy"
APP_NAME="appname"
APP_ROOT="/home/$USER/$APP_NAME"
ENV="production"

# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"

# make sure the app exists
cd $APP_ROOT || exit 1

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case $1 in
  start)
    sig 0 && echo >&2 "Already running" && exit 0
    echo "Starting $APP_NAME"
    su - $USER -c "$CMD"
    ;;
  stop)
    echo "Stopping $APP_NAME"
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
  force-stop)
    echo "Force stopping $APP_NAME"
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
  restart|reload|upgrade)
    sig USR2 && echo "reloaded $APP_NAME" && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    $CMD
    ;;
  rotate)
    sig USR1 && echo rotated logs OK && exit 0
    echo >&2 "Couldn't rotate logs" && exit 1
    ;;
  *)
    echo >&2 $USAGE
    exit 1
    ;;
esac

Сохранить и выйти. Это позволит вам использовать service unicorn_appname для запуска и остановки вашего Unicorn и вашего приложения Rails.

Обновите разрешения скрипта и включите запуск Unicorn при загрузке:

  1. sudo chmod 755 /etc/init.d/unicorn_appname
  2. sudo update-rc.d unicorn_appname defaults

Давайте начнем прямо сейчас:

  1. sudo service unicorn_appname start

Теперь производственная среда вашего приложения Rails работает под управлением Unicorn и прослушивает сокет shared/sockets/unicorn.sock. Прежде чем ваше приложение станет доступным для внешнего пользователя, вы должны настроить обратный прокси-сервер Nginx.

Установить и настроить Nginx

Установите Nginx с помощью apt-get:

  1. sudo apt-get install nginx

Теперь откройте блок сервера по умолчанию в текстовом редакторе:

  1. sudo vi /etc/nginx/sites-available/default

Замените содержимое файла следующим блоком кода. Обязательно замените выделенные части соответствующим именем пользователя и названием приложения:

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/unicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/appname/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

Сохранить и выйти. Это настраивает Nginx в качестве обратного прокси-сервера, поэтому HTTP-запросы перенаправляются на сервер приложений Unicorn через сокет Unix. Не стесняйтесь вносить любые изменения по своему усмотрению.

Перезапустите Nginx, чтобы изменения вступили в силу:

  1. sudo service nginx restart

Теперь производственная среда вашего приложения Rails доступна через общедоступный IP-адрес или полное доменное имя вашего сервера. Чтобы получить доступ к контроллеру задач, который мы создали ранее, посетите свой сервер приложений в веб-браузере:

http://server_public_IP/tasks

Вы должны увидеть ту же страницу, которую видели при первом тестировании приложения, но теперь оно обслуживается через Nginx и Unicorn.

Заключение

Поздравляем! Вы развернули рабочую среду своего приложения Ruby on Rails с помощью Nginx и Unicorn.

Если вы хотите улучшить развертывание вашего рабочего приложения Rails, вам следует ознакомиться с нашей серией руководств «Как использовать Capistrano для автоматизации развертывания». Эта серия основана на CentOS, но она все же должна быть полезна для автоматизации ваших развертываний.