Вступление
Когда вы будете готовы к развертыванию приложения 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, но все же должна помочь в автоматизации ваших развертываний.