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

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


Введение

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

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

Предпосылки

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

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

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

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

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

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

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

rails new appname -d postgresql

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

cd appname

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

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

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

sudo -u postgres createuser -s appname

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

sudo -u postgres psql

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

\password appname

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

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

\q

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

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

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

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

vi config/database.yml

Обновите раздел production, чтобы он выглядел примерно так:

production:
  <<: *default
  host: localhost
  adapter: postgresql
  encoding: utf8
  database: appname_production
  pool: 5
  username: <%= ENV['APPNAME_DATABASE_USER'] %>
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

Обратите внимание, что имя пользователя и пароль базы данных настроены для чтения переменными среды, APPNAME_DATABASE_USER и APPNAME_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=your_generated_secret

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

APPNAME_DATABASE_USER=appname

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

APPNAME_DATABASE_PASSWORD=prod_db_pass

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

Вы можете просмотреть, какие переменные среды установлены для вашего приложения с помощью плагина 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

Вы также должны предварительно скомпилировать активы:

RAILS_ENV=production rake assets:precompile

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

RAILS_ENV=production rails server --binding=server_public_IP

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

http://server_public_IP:3000/tasks

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

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

Установить Пума

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

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

vi Gemfile

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

gem 'puma'

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

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

bundle

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

Настроить Пуму

Перед настройкой Puma вам следует узнать количество ядер ЦП на вашем сервере. Вы можете легко сделать это с помощью этой команды:

grep -c processor /proc/cpuinfo

Теперь давайте добавим нашу конфигурацию Puma в config/puma.rb. Откройте файл в текстовом редакторе:

vi config/puma.rb

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

# Change to match your CPU core count
workers 2

# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app

on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

Измените количество воркеров на количество ядер ЦП вашего сервера.

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

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

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

Создать сценарий запуска Puma

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

Загрузите инструмент Jungle Upstart из репозитория Puma GitHub в свой домашний каталог:

cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

Теперь откройте предоставленный файл puma.conf, чтобы мы могли настроить пользователя развертывания Puma:

vi puma.conf

Найдите две строки, в которых указаны setuid и setgid, и замените \apps именем пользователя и группы развертывания. Например, если имя пользователя развертывания \deploy, строки должны выглядеть так:

setuid deploy
setgid deploy

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

Теперь скопируйте скрипты в каталог сервисов Upstart:

sudo cp puma.conf puma-manager.conf /etc/init

Сценарий puma-manager.conf ссылается на /etc/puma.conf для приложений, которыми он должен управлять. Давайте сейчас создадим и отредактируем этот файл инвентаря:

sudo vi /etc/puma.conf

Каждая строка в этом файле должна быть путем к приложению, которым должен управлять puma-manager. Добавьте путь к вашему приложению сейчас. Например:

/home/deploy/appname

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

Теперь ваше приложение настроено на запуск во время загрузки через Upstart. Это означает, что ваше приложение запустится даже после перезагрузки сервера.

Запуск приложений Puma вручную

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

sudo start puma-manager

Вы также можете запустить отдельное приложение Puma с помощью скрипта puma Upstart, например:

sudo start puma app=/home/deploy/appname

Вы также можете использовать stop и restart для управления приложением, например:

sudo stop puma-manager
sudo restart puma-manager

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

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

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

sudo apt-get install nginx

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

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

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

upstream app {
    # Path to Puma SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/puma.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-запросы перенаправляются на сервер приложений Puma через сокет Unix. Не стесняйтесь вносить любые изменения по своему усмотрению.

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

sudo service nginx restart

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

http://server_public_IP/tasks

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

Заключение

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

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