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

Вступление

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

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

Предпосылки

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

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

Кроме того, в этом руководстве не рассматриваются способы настройки среды разработки или тестирования. Если вам нужна помощь в этом, следуйте примеру в https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu- 14-04 Учебник по 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

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

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

Обратите внимание, что имя пользователя и пароль базы данных настроены для чтения переменными среды, + _DATABASE_USER + и + _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_USER + следующим образом (замените выделенное «APPNAME» на имя вашего приложения, а «appname» на имя пользователя вашей производственной базы данных):

_DATABASE_USER=

Наконец, установите переменную + _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

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

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 +, чтобы остановить приложение.

Установить Puma

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

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

vi Gemfile

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

gem 'puma'

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

Чтобы установить Puma и все выдающиеся зависимости, запустите Bundler:

bundle

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

Настроить Puma

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

grep -c processor /proc/cpuinfo

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

vi config/puma.rb

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

# Change to match your CPU core count
workers

# 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

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

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

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

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

Создать скрипт Puma Upstart

Давайте создадим скрипт инициализации 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
setgid

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

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

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

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

sudo vi /etc/puma.conf

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

/home//

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

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

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

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

sudo start puma-manager

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

sudo start puma app=/home//

Вы также можете использовать + 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///shared/sockets/puma.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-запросы перенаправляются на сервер приложений Puma через сокет Unix. Не стесняйтесь вносить любые изменения по своему усмотрению.

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

sudo service nginx restart

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

http:///tasks

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

Заключение

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

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

Related