Comment déployer une application Rails avec Puma et Nginx sur Ubuntu 14.04

introduction

Lorsque vous êtes prêt à déployer votre application Ruby on Rails, de nombreuses configurations valides doivent être prises en compte. Ce tutoriel vous aidera à déployer l’environnement de production de votre application Ruby on Rails, avec PostgreSQL comme base de données, en utilisant Puma et Nginx sur Ubuntu 14.04.

Puma est un serveur d’application, comme Passenger ou Unicorn, qui permet à votre Application Rails pour traiter les demandes simultanément. Puma n’étant pas conçu pour être accédé directement par les utilisateurs, nous utiliserons Nginx en tant que proxy inverse qui mettra en mémoire tampon les demandes et les réponses entre les utilisateurs et votre application Rails.

Conditions préalables

Ce tutoriel suppose que vous avez un serveur Ubuntu 14.04 avec le logiciel suivant installé sur l’utilisateur qui déploiera l’application:

Si vous ne l’avez pas encore configuré, suivez les tutoriels liés ci-dessus. Nous supposerons que votre utilisateur s’appelle * deploy *.

De plus, ce didacticiel ne couvre pas la configuration de vos environnements de développement ou de test. Si vous avez besoin d’aide, suivez l’exemple de la https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu- 14-04 [Tutoriel PostgreSQL avec Rails].

Créer une application Rails

Idéalement, vous avez déjà une application Rails que vous souhaitez déployer. Si tel est le cas, vous pouvez ignorer cette section et procéder aux substitutions appropriées en suivant. Sinon, la première étape consiste à créer une nouvelle application Rails qui utilise PostgreSQL comme base de données.

Cette commande créera une nouvelle application Rails, nommée «appname», qui utilisera PostgreSQL comme base de données. N’hésitez pas à remplacer le «nom de l’application» en surbrillance par quelque chose d’autre:

rails new  -d postgresql

Puis changez dans le répertoire de l’application:

cd

Prenons un moment pour créer l’utilisateur PostgreSQL qui sera utilisé par l’environnement de production de votre application Rails.

Créer un utilisateur de base de données de production

Pour simplifier les choses, appelons l’utilisateur de la base de données de production le même nom que le nom de votre application. Par exemple, si votre application s’appelle “appname”, vous devez créer un utilisateur PostgreSQL comme ceci:

sudo -u postgres createuser -s

Nous voulons définir le mot de passe de l’utilisateur de la base de données. Entrez donc la console PostgreSQL de la manière suivante:

sudo -u postgres psql

Définissez ensuite le mot de passe de l’utilisateur de la base de données, "appname" dans l’exemple, comme suit:

\password

Entrez votre mot de passe souhaité et confirmez-le.

Quittez la console PostgreSQL avec cette commande:

\q

Nous sommes maintenant prêts à configurer votre application avec les informations de connexion de base de données appropriées.

Configurer la connexion à la base de données

Assurez-vous d’être dans le répertoire racine de votre application (+ cd ~ / +).

Ouvrez le fichier de configuration de la base de données de votre application dans votre éditeur de texte préféré. Nous allons utiliser vi:

vi config/database.yml

Mettez à jour la section + production afin qu’elle ressemble à ceci:

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

Notez que le nom d’utilisateur et le mot de passe de la base de données sont configurés pour être lus par les variables d’environnement + _DATABASE_USER + et + _DATABASE_PASSWORD +. Il est recommandé de conserver les mots de passe de production et les secrets en dehors de la base de code de votre application, car ils peuvent facilement être exposés si vous utilisez un système de contrôle de version distribué tel que Git. Nous verrons ensuite comment configurer l’authentification de la base de données avec les variables d’environnement.

Sauvegarder et quitter.

Installer le plugin rbenv-vars

Avant de déployer une application Rails de production, vous devez définir la clé secrète de production et le mot de passe de la base de données à l’aide de variables d’environnement. Un moyen simple de gérer les variables d’environnement, que nous pouvons utiliser pour charger des mots de passe et des secrets dans notre application au moment de l’exécution, consiste à utiliser le plugin * rbenv-vars *.

Pour installer le plugin rbenv-vars, il suffit de passer au répertoire + .rbenv / plugins + et de le cloner à partir de GitHub. Par exemple, si rbenv est installé dans votre répertoire personnel, exécutez les commandes suivantes:

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

Définir les variables d’environnement

Maintenant que le plug-in rbenv-vars est installé, définissons les variables d’environnement requises.

Commencez par générer la clé secrète, qui sera utilisée pour vérifier l’intégrité des cookies signés:

cd ~/appname
rake secret

Copiez la clé secrète générée, puis ouvrez le fichier + .rbenv-vars + avec votre éditeur favori. Nous allons utiliser vi:

vi .rbenv-vars

Toutes les variables d’environnement que vous avez définies ici peuvent être lues par votre application Rails.

Commencez par définir la variable + SECRET_KEY_BASE + comme suit (remplacez le texte en surbrillance par le secret que vous venez de générer et de copier):

SECRET_KEY_BASE=

Ensuite, définissez la variable + _DATABASE_USER + comme ceci (remplacez le «APPNAME» en surbrillance par votre nom d’application, et «appname» par votre nom d’utilisateur pour la base de données de production):

_DATABASE_USER=

Enfin, définissez la variable + _DATABASE_PASSWORD + comme ceci (remplacez le «APPNAME» en surbrillance par le nom de votre application et «prod_db_pass» par le mot de passe de l’utilisateur de la base de production):

_DATABASE_PASSWORD=

Sauvegarder et quitter.

Vous pouvez voir quelles variables d’environnement sont définies pour votre application avec le plug-in rbenv-vars en exécutant cette commande:

rbenv vars

Si vous modifiez votre mot de passe secret ou de base de données, mettez à jour votre fichier + .rbenv-vars +. Veillez à garder ce fichier privé et à ne pas l’inclure dans les référentiels de code publics.

Créer une base de données de production

Maintenant que votre application est configurée pour communiquer avec votre base de données PostgreSQL, créons la base de données de production:

RAILS_ENV=production rake db:create

Générer un contrôleur

Si vous suivez l’exemple, nous allons générer un contrôleur d’échafaudage pour que notre application ait quelque chose à regarder:

rails generate scaffold Task title:string note:text

Maintenant, exécutez cette commande pour mettre à jour la base de données de production:

RAILS_ENV=production rake db:migrate

Vous devez également précompiler les actifs:

RAILS_ENV=production rake assets:precompile

Pour vérifier si votre application fonctionne, vous pouvez exécuter l’environnement de production et le lier à l’adresse IP publique de votre serveur (en remplaçant l’adresse IP publique de votre serveur):

RAILS_ENV=production rails server --binding=

Maintenant, visitez cette URL dans un navigateur Web:

http://:3000/tasks

Si cela fonctionne correctement, vous devriez voir cette page:

image: https: //assets.digitalocean.com/articles/rails_unicorn/tasks.png [Contrôleur de tâches]

Retournez sur votre serveur Rails et appuyez sur les touches + Ctrl-c + pour arrêter l’application.

Installer Puma

Nous sommes maintenant prêts à installer Puma.

Une façon simple de le faire est de l’ajouter au fichier + Gemfile + de votre application. Ouvrez Gemfile dans votre éditeur favori (assurez-vous d’être dans le répertoire racine de votre application):

vi Gemfile

À la fin du fichier, ajoutez le joyau Puma avec cette ligne:

gem 'puma'

Sauvegarder et quitter.

Pour installer Puma et toutes les dépendances en suspens, exécutez Bundler:

bundle

Puma est maintenant installé, mais nous devons le configurer.

Configurer Puma

Avant de configurer Puma, vous devez rechercher le nombre de cœurs de processeur de votre serveur. Vous pouvez facilement le faire avec cette commande:

grep -c processor /proc/cpuinfo

Ajoutons maintenant notre configuration Puma à + ​​config / puma.rb +. Ouvrez le fichier dans un éditeur de texte:

vi config/puma.rb

Copiez et collez cette configuration dans le fichier:

# 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

Changez le nombre de + travailleurs + par le nombre de cœurs de processeur de votre serveur.

Sauvegarder et quitter. Cela configure Puma avec l’emplacement de votre application et l’emplacement de ses sockets, journaux et PID. N’hésitez pas à modifier le fichier ou à ajouter toute autre option dont vous avez besoin.

Créez maintenant les répertoires auxquels il est fait référence dans le fichier de configuration:

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

Créer un script Puma Upstart

Créons un script d’initialisation Upstart pour pouvoir démarrer et arrêter Puma facilement et pour nous assurer qu’il démarrera au démarrage.

Téléchargez l’outil Jungle Upstart du référentiel Puma GitHub dans votre répertoire personnel:

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

Ouvrez maintenant le fichier + puma.conf + fourni afin de pouvoir configurer l’utilisateur de déploiement Puma:

vi puma.conf

Recherchez les deux lignes spécifiant + setuid + et + setgid +, et remplacez «applications» par le nom de votre utilisateur et de votre groupe de déploiement. Par exemple, si votre utilisateur de déploiement s’appelle «deploy», les lignes doivent ressembler à ceci:

setuid
setgid

Sauvegarder et quitter.

Maintenant, copiez les scripts dans le répertoire des services Upstart:

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

Le script + puma-manager.conf + fait référence à + ​​/ etc / puma.conf + pour les applications qu’il devrait gérer. Créons et modifions maintenant ce fichier d’inventaire:

sudo vi /etc/puma.conf

Chaque ligne de ce fichier doit être le chemin d’une application que vous voulez gérer avec + puma-manager +. Ajoutez le chemin à votre application maintenant. Par exemple:

/home//

Sauvegarder et quitter.

Votre application est maintenant configurée pour démarrer au démarrage, via Upstart. Cela signifie que votre application démarrera même après le redémarrage de votre serveur.

Démarrer les applications Puma manuellement

Pour démarrer toutes vos applications Puma gérées maintenant, exécutez cette commande:

sudo start puma-manager

Vous pouvez également démarrer une seule application Puma en utilisant le script + puma + Upstart, comme ceci:

sudo start puma app=/home//

Vous pouvez également utiliser + stop et` + restart` pour contrôler l’application, comme ceci:

sudo stop puma-manager
sudo restart puma-manager

Maintenant, votre environnement de production d’application Rails s’exécute sous Puma et l’écoute s’effectue sur le socket + shared / sockets / puma.sock. Avant que votre application ne soit accessible à un utilisateur externe, vous devez configurer le proxy inverse Nginx.

Installer et configurer Nginx

Installez Nginx en utilisant apt-get:

sudo apt-get install nginx

Ouvrez maintenant le bloc serveur par défaut avec un éditeur de texte:

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

Remplacez le contenu du fichier par le bloc de code suivant. Assurez-vous de remplacer les pièces surlignées par le nom d’utilisateur et le nom d’application appropriés (deux emplacements):

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;
}

Sauvegarder et quitter. Cela configure Nginx en tant que proxy inverse. Ainsi, les demandes HTTP sont transférées au serveur d’applications Puma via un socket Unix. N’hésitez pas à apporter des modifications à votre convenance.

Redémarrez Nginx pour appliquer les modifications:

sudo service nginx restart

L’environnement de production de votre application Rails est désormais accessible via l’adresse IP publique ou le nom de domaine complet de votre serveur. Pour accéder au contrôleur de tâches que nous avons créé précédemment, visitez votre serveur d’applications dans un navigateur Web:

http:///tasks

Vous devriez voir la même page que celle que vous avez vue la première fois que vous testez votre application, mais elle est maintenant servie par Nginx et Puma.

Conclusion

Toutes nos félicitations! Vous avez déployé l’environnement de production de votre application Ruby on Rails à l’aide de Nginx et Puma.

Si vous souhaitez améliorer le déploiement de votre application Rails de production, consultez notre série de didacticiels à l’adresse https://www.digitalocean.com/community/tutorial_series/how-to-use-capistrano-to-automate-deployments&How To Utiliser Capistrano pour automatiser les déploiements]. La série est basée sur CentOS, mais elle devrait quand même vous aider à automatiser vos déploiements.