Comment déployer une application Rails avec Unicorn 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 Unicorn et Nginx sur Ubuntu 14.04.

Unicorn est un serveur d’application, tel que Passenger ou Puma, qui permet à votre Application Rails pour traiter les demandes simultanément. Comme Unicorn n’est pas conçu pour être accessible 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 à ce sujet, suivez l’exemple du 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

Ensuite, définissez 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

Dans la section + default, recherchez la ligne« pool: 5 »et ajoutez-y la ligne suivante (si elle n’existe pas déjà):

 host: localhost

Si vous faites défiler vers le bas du fichier, vous remarquerez que la section + production est définie comme suit:

 username:
 password: <%= ENV['_DATABASE_PASSWORD'] %>

Si votre nom d’utilisateur de production ne correspond pas à l’utilisateur de la base de données que vous avez créé précédemment, définissez-le maintenant.

Notez que le mot de passe de la base de données est configuré pour être lu par une variable d’environnement, + _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.

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=

Définissez ensuite 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

Actifs précompilés

À ce stade, l’application devrait fonctionner, mais vous devrez précompiler ses ressources pour que toutes les images, CSS et scripts se chargent. Pour ce faire, exécutez cette commande:

RAILS_ENV=production rake assets:precompile

Application de test

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.

Installez Licorne

Nous sommes maintenant prêts à installer Unicorn.

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

vi Gemfile

A la fin du fichier, ajoutez le joyau Unicorn avec cette ligne:

gem 'unicorn'

Sauvegarder et quitter.

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

bundle

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

Configurer la Licorne

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

vi config/unicorn.rb

Copiez et collez cette configuration dans le fichier:

# set path to application
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir


# Set unicorn options
worker_processes 2
preload_app true
timeout 30

# Set up socket location
listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64

# Logging
stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stdout.log"

# Set master PID location
pid "#{shared_dir}/pids/unicorn.pid"

Sauvegarder et quitter. Ceci configure Unicorn avec l’emplacement de votre application, ainsi que l’emplacement de son socket, de ses journaux et de ses 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 Init Licorne

Créons un script d’initialisation afin que nous puissions facilement démarrer et arrêter Unicorn et nous assurer qu’il démarrera au démarrage.

Créez un script et ouvrez-le pour édition avec cette commande (remplacez la partie en surbrillance par votre nom d’application, si vous le souhaitez):

sudo vi /etc/init.d/unicorn_

Copiez et collez le bloc de code suivant dans celui-ci et assurez-vous de remplacer + USER n et` + APP_NAME` (en surbrillance) par les valeurs appropriées:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the unicorn app server
# Description:       starts unicorn using start-stop-daemon
### END INIT INFO

set -e

USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"

# app settings
USER=""
APP_NAME=""
APP_ROOT="/home/$USER/$APP_NAME"
ENV="production"

# environment settings
PATH="/home/$USER/.rbenv/shims:/home/$USER/.rbenv/bin:$PATH"
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"

# make sure the app exists
cd $APP_ROOT || exit 1

sig () {
 test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
 test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case $1 in
 start)
   sig 0 && echo >&2 "Already running" && exit 0
   echo "Starting $APP_NAME"
   su - $USER -c "$CMD"
   ;;
 stop)
   echo "Stopping $APP_NAME"
   sig QUIT && exit 0
   echo >&2 "Not running"
   ;;
 force-stop)
   echo "Force stopping $APP_NAME"
   sig TERM && exit 0
   echo >&2 "Not running"
   ;;
 restart|reload|upgrade)
   sig USR2 && echo "reloaded $APP_NAME" && exit 0
   echo >&2 "Couldn't reload, starting '$CMD' instead"
   $CMD
   ;;
 rotate)
   sig USR1 && echo rotated logs OK && exit 0
   echo >&2 "Couldn't rotate logs" && exit 1
   ;;
 *)
   echo >&2 $USAGE
   exit 1
   ;;
esac

Sauvegarder et quitter. Cela vous permettra d’utiliser + service unicorn_ + pour démarrer et arrêter votre licorne et votre application Rails.

Mettez à jour les autorisations du script et activez le démarrage de Licorne au démarrage:

sudo chmod 755 /etc/init.d/unicorn_appname
sudo update-rc.d unicorn_appname defaults

Commençons maintenant:

sudo service unicorn_ start

Maintenant, votre environnement de production d’application Rails s’exécute sous Unicorn et l’écoute s’effectue sur le socket + shared / sockets / unicorn.socks. 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 parties surlignées par le nom d’utilisateur et le nom d’application appropriés:

upstream app {
   # Path to Unicorn SOCK file, as defined previously
   server unix:/home///shared/sockets/unicorn.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 Unicorn 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 traitée par Nginx et Unicorn.

Conclusion

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

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.

Related