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

Вступление

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

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

Предпосылки

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

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

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

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

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

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

rails new  -d postgresql

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

cd

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

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

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

sudo -u postgres createuser -s

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

sudo -u postgres psql

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

\password

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

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

\q

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

Настроить соединение с базой данных

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

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

vi config/database.yml

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

 host: localhost

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

 username:
 password: <%= ENV['_DATABASE_PASSWORD'] %>

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

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

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

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

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

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

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

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

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

cd ~/appname
rake secret

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

vi .rbenv-vars

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

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

SECRET_KEY_BASE=

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

_DATABASE_PASSWORD=

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

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

rbenv vars

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

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

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

RAILS_ENV=production rake db:create

Генерация контроллера

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

rails generate scaffold Task title:string note:text

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

RAILS_ENV=production rake db:migrate

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

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

RAILS_ENV=production rake assets:precompile

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

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

RAILS_ENV=production rails server --binding=

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

http://:3000/tasks

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

изображение: https: //assets.digitalocean.com/articles/rails_unicorn/tasks.png [Контроллер задач]

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

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

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

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

vi Gemfile

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

gem 'unicorn'

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

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

bundle

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

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

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

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. Не стесняйтесь изменять файл или добавлять любые другие параметры, которые вам требуются.

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

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

Создать Unicorn Init Script

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

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

sudo vi /etc/init.d/unicorn_

Скопируйте и вставьте в него следующий блок кода и обязательно замените + 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=""
APP_NAME=""
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_ + для запуска и остановки вашего Unicorn и вашего Rails-приложения.

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

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

Давайте начнем сейчас:

sudo service unicorn_ start

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

Установите и настройте Nginx

Установите Nginx, используя apt-get:

sudo apt-get install nginx

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

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

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

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

server {
   listen 80;
   server_name localhost;

   root /home///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, чтобы изменения вступили в силу:

sudo service nginx restart

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

http:///tasks

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

Заключение

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

Если вы хотите улучшить развертывание своего производственного приложения на Rails, ознакомьтесь с нашей серией руководств по адресу https://www.digitalocean.com/community/tutorial_series/how-to-use-capistrano-to-automate-deployments[How To Используйте Capistrano для автоматизации развертываний. Эта серия основана на CentOS, но все же должна помочь в автоматизации ваших развертываний.

Related