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.