- Развертывание Rails-приложения на Puma и Nginx в Ubuntu 14.04
- Требования
- 1: Создание приложения Rails
- 2: Создание пользователя базы данных
- 3: Настройка соединения с БД
- 4: Установка плагина rbenv-vars
- Установка переменных среды
- 5: Создание базы данных
- Генерирование контроллера
- 6: Установка Puma
- 7: Настройка сервера Puma
- 8: Создание сценария инициализации Unicorn
- Запуск приложения Puma вручную
- 9: Установка и настройка Nginx
Развертывание Rails-приложения на Puma и Nginx в Ubuntu 14.04
Когда приложение Ruby on Rails готово к развертыванию, следует рассмотреть несколько вариантов настройки. Данный мануал поможет развернуть среду производства для приложения Ruby on Rails на основе PostgreSQL, Unicorn и Nginx в Ubuntu 14.04.
Читайте также:
Puma – это сервер приложений, который позволяет Rails-приложению обрабатывать запросы. Поскольку сервер Puma не предназначен для непосредственного доступа пользователей, Nginx используется в качестве обратного прокси-сервера, который будет буферизовать запросы и ответы между пользователями и Rails-приложением.
Требования
- Сервер Ubuntu 14.04, настроенный по этому мануалу. В руководстве используется условный пользователь deploy.
- Ruby on Rails, установленный с помощью rbenv (все инструкции можно найти здесь).
- СУБД PostgreSQL, настроенная для поддержки Rails (читайте мануал Приложение Ruby on Rails на PostgreSQL в Ubuntu 14.04).
В этом мануале не рассматривается настройка среды разработки или тестирования. Если вам нужна помощь в этом, следуйте руководству Приложение Ruby on Rails на PostgreSQL в Ubuntu 14.04.
1: Создание приложения Rails
В идеале у вас уже есть готовое приложение. Если это так, можете пропустить этот раздел.
Если же у вас нет приложения, создайте простое тестовое приложение Rails на БД PostgreSQL.
Эта команда создаст новое приложение Rails по имени appname, которое будет использовать PostgreSQL в качестве базы данных. Замените appname именем своего приложения.
rails new appname -d postgresql
Теперь нужно создать пользователя БД для среды производства.
2: Создание пользователя базы данных
Для простоты назовите пользователя базы данных так же, как называется ваше приложение. Например, если приложение называется «appname», создайте одноименного пользователя PostgreSQL:
sudo -u postgres createuser -s appname
Откройте консоль PostgreSQL:
Затем установите пароль для пользователя базы данных appname:
Введите свой пароль и подтвердите его.
Закройте консоль PostgreSQL:
3: Настройка соединения с БД
Убедитесь, что вы в корневом каталоге приложения (cd ~/appname).
Откройте конфигурационный файл БД приложения в редакторе:
В конце файла вы найдете раздел production. Укажите в нем данные о своем приложении:
production:
host: localhost
adapter: postgresql
encoding: utf8
database: appname_production
pool: 5
username:
password:
Обратите внимание, пароль базы данных хранится в переменной среды APPNAME_DATABASE_PASSWORD. Рекомендуется хранить пароли и секретные ключи производства вне кодовой базы приложения, поскольку их можно легко открыть, если вы используете систему управления версиями типа Git. Далее вы узнаете, как настроить аутентификацию базы данных с помощью переменных среды.
Сохраните и закройте файл.
4: Установка плагина 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 можно определить необходимые переменные.
Сгенерируйте секретный ключ для подтверждения целостности cookies-файлов.
Скопируйте полученный ключ и поместите его в .rbenv-vars.
В этом файле Rails-приложение может читать все переменные.
Установите переменную SECRET_KEY_BASE и присвойте ей скопированный секретный ключ:
Затем установите переменную APPNAME_DATABASE_USER; замените APPNAME именем вашего приложения, а appname – именем пользователя базы данных производства.
Теперь установите переменную APPNAME_DATABASE_PASSWORD; замените APPNAME именем вашего приложения, а prod_db_pass – паролем пользователя базы данных производства.
Сохраните и закройте файл.
Вы можете просмотреть переменные среды приложения с помощью плагина rbenv-vars, выполнив следующую команду:
Если вы измените свой секретный ключ или пароль базы данных, обновите файл .rbenv-vars. Этот файл следует хранить в секрете и не включать его в какие-либо общедоступные репозитории.
5: Создание базы данных
Создайте базу данных для производства:
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-адресу сервера.
RAILS_ENV=production rails server —binding=server_public_IP
Откройте в браузере этот URL:
Если все работает правильно, вы увидите:
Listing Tasks
Title Note
New Task
Вернитесь на сервер Rails и нажмите Ctrl-c, чтобы остановить приложение.
6: Установка Puma
Теперь нужно установить сервер приложений Puma.
Легкий способ сделать это – добавить его в Gemfile приложения. Откройте Gemfile в редакторе (убедитесь, что вы находитесь в корневом каталоге приложения):
Добавьте gem для Puma в конец файла.
Сохраните и закройте файл.
Чтобы установить сервер Puma и его зависимости, запустите:
7: Настройка сервера Puma
Прежде чем приступить к настройке Puma, проверьте количество ядер CPU на своем сервере:
grep -c processor /proc/cpuinfo
Добавьте конфигурацию Unicorn в config/unicorn.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 = «#/shared»
# Default to production
rails_env = ENV[‘RAILS_ENV’] || «production»
environment rails_env
# Set up socket location
bind «unix://#/sockets/puma.sock»
# Logging
stdout_redirect «#/log/puma.stdout.log», «#/log/puma.stderr.log», true
# Set master PID and state locations
pidfile «#/pids/puma.pid»
state_path «#/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(«#/config/database.yml»)[rails_env])
end
В параметре workers укажите количество ядер CPU сервера.
Сохраните и закройте файл. Теперь Puma знает, где находится приложение, сокеты и логи. В случае необходимости просто откорректируйте файл согласно вашим требованиям.
Создайте каталоги, на которые ссылается предыдущий файл:
mkdir -p shared/pids shared/sockets shared/log
8: Создание сценария инициализации Unicorn
Создайте сценарий инициализации, чтобы иметь возможность запускать и останавливать Unicorn и добавить его в автозагрузку.
Загрузите инструмент Jungle Upstart из GitHub-репозитория Puma в домашний каталог:
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, чтобы настроить пользователя для развертывания:
Найдите строки setuid и setgid и замените apps именем пользователя и группы для развертывания. В данном мануале они условно называются deploy.
setuid deploy
setgid deploy
Сохраните и закройте файл.
Скопируйте сценарий в каталог сервисов Upstart:
sudo cp puma.conf puma-manager.conf /etc/init
Сценарий puma-manager.conf ссылается на /etc/puma.conf, чтобы найти приложения, которыми он должен управлять. Создайте этот вспомогательный файл:
В этом файле в отдельных строках перечислите приложения, которыми будет управлять puma-manager. Добавьте путь к своему приложению:
Сохраните и закройте файл.
Теперь приложение добавлено в автозагрузку.
Запуск приложения Puma вручную
Чтобы вручную запустить приложение, введите:
Также для этого можно запустить Upstart-сценарий puma:
sudo start puma app=/home/deploy/appname
Для управления приложением используйте команды:
sudo stop puma-manager
sudo restart puma-manager
Теперь среда производства приложения обслуживается сервером Puma, который прослушивает сокет shared/sockets/puma.sock. Но пока что приложение недоступно в сети. Нужно настроить обратный прокси-сервер Nginx.
9: Установка и настройка Nginx
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-запросы на сервер приложений Unicorn через сокет Unix.
sudo service nginx restart
Теперь приложение Rails доступно через внешний IP-адрес сервера или FQDN. Чтобы открыть контроллер Tasks, перейдите по ссылке:
Вы должны увидеть ту же страницу, что видели ранее. Но теперь она обслуживается серверами Nginx и Unicorn.