La procédure pour «utiliser le serveur AWS» est écrite en 5 parties.
Veuillez consulter les articles ci-dessous.
① Configuration initiale de EC2 ② Créer une base de données dans l'environnement de production ③ Rails de démarrage de EC2 ④ Configurer le serveur Web ⑤ Automatiser le déploiement ← Imakoko
Le travail de déploiement manuel (signifie démarrer le serveur à l'aide de la "commande unicorn_rails"), Vous permet de le faire avec une seule commande depuis votre terminal local. Pour cela, nous utilisons ce qu'on appelle un "outil de déploiement automatique".
Cette fois, nous allons introduire un outil de déploiement automatique appelé Capistrano.
Installez Gem pour utiliser Capistrano dans Gemfile Puis regroupez l'installation dans le répertoire de l'application
group :development, :test do
gem 'capistrano'
gem 'capistrano-rbenv'
gem 'capistrano-bundler'
gem 'capistrano-rails'
gem 'capistrano3-unicorn'
end
Après avoir chargé la gemme, entrez la commande suivante
Terminal (local)
% bundle exec cap install
Le fichier est généré comme ci-dessous
capfile
require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
config/deploy/production.rb
server 'IP élastique préparé', user: 'ec2-user', roles: %w{app db web}
Supprimez toute la description de deploy.rb et collez le code suivant Points d'attention "Version Capistrano" → décrit dans Gemfile.lock "Nom de l'application" "Nom d'utilisateur GitHub, nom du référentiel" "La version de ruby utilisée dans cette application" "Nom de la paire de clés propre"
config/deploy.rb
#Décrit la version de capistrano. Continuer à utiliser la version fixe et éviter les problèmes dus aux changements de version
lock 'Version Capistrano'
#Utilisé pour afficher les journaux Capistrano
set :application, 'Nom de l'application propre'
#Spécifiez à partir de quel référentiel extraire l'application
set :repo_url, '[email protected]:Nom d'utilisateur Github/Nom du référentiel.git'
#Spécifiez un répertoire qui est couramment référencé même si la version change
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')
set :rbenv_type, :user
set :rbenv_ruby, 'La version de ruby utilisée dans cette application' #Si vous procédez selon l'article, «2.6.5’
#Quelle clé publique utiliser pour le déploiement
set :ssh_options, auth_methods: ['publickey'],
keys: ['~/.ssh/Nom de la paire de clés propre.pem']
#Emplacement du fichier contenant le numéro de processus
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }
#Emplacement du fichier de configuration Unicorn
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5
#Description du redémarrage de Unicorn une fois le processus de déploiement terminé
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:restart'
end
end
Une fois le déploiement automatique par Capistrano exécuté, le répertoire de l'application dans l'environnement de production change. Plusieurs répertoires sont créés, comme la sauvegarde d'applications avec Capistrano.
** Les trois suivants sont particulièrement importants **
Le «répertoire des versions» est une collection d'applications déployées via Capistrano. En conservant les anciennes applications ici, vous pouvez revenir à la version précédente même si quelque chose ne va pas pendant le déploiement. La description de "set: keep_releases" dans deploy.rb spécifie le nombre de fichiers enregistrés dans le passé. Cette fois, 5 sont configurés pour enregistrer la version précédente.
Dans le "répertoire courant", le plus récent dans le dossier des versions est Il semble qu'il est copié automatiquement. En d'autres termes, "contenu actuellement déployé = contenu actuel".
Un répertoire qui stocke les répertoires qui sont couramment référencés même si la version change. Plus précisément, les répertoires log, public, tmp et vendor sont stockés.
Le répertoire de l'application Rails est plus volumineux lors du déploiement automatique que lors du déploiement manuel. C'est un pas de plus. Par conséquent, il est nécessaire d'apporter des modifications.
[Avant de modifier] config/unicorn.rb
#Placez le répertoire où le code de l'application sur le serveur est installé dans une variable
app_path = File.expand_path('../../', __FILE__)
#Déterminer les performances du serveur d'applications
worker_processes 1
#Spécifiez le répertoire dans lequel l'application est installée
working_directory app_path
#Spécifiez l'emplacement des fichiers requis pour démarrer Unicorn
pid "#{app_path}/tmp/pids/unicorn.pid"
#Spécifiez le numéro de port
listen 3000
#Spécifiez un fichier pour consigner les erreurs
stderr_path "#{app_path}/log/unicorn.stderr.log"
#Spécifiez un fichier pour enregistrer les journaux normaux
stdout_path "#{app_path}/log/unicorn.stdout.log"
(réduction)
[Après modification] config/unicorn.rb
# 「../Augmente de un
app_path = File.expand_path('../../../', __FILE__)
#Déterminer les performances du serveur d'applications
worker_processes 1
#Spécifiez "courant"
working_directory "#{app_path}/current"
#Changé pour faire référence à l'intérieur "partagé"
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
#Changé pour faire référence à l'intérieur "partagé"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
#Changé pour faire référence à l'intérieur "partagé"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
#Changé pour faire référence à l'intérieur "partagé"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
(réduction)
Similaire au fichier de configuration d'Unicorn, comparé au déploiement manuel Les répertoires d'applications Rails sont une étape plus profonde lors du déploiement automatique. Par conséquent, il est nécessaire d'apporter des modifications.
Exécuter dans le terminal (dans EC2)
$ sudo vim /etc/nginx/conf.d/rails.conf
Modifier ci-dessous ① 3e ligne: modifiez en "~ nom de l'application / shared / tmp / ~" ② 14ème ligne: Ajoutez la ligne entière → root / var / www / nom de l'application / current / public; ③ 20e ligne: ajoutez toute la ligne → root / var / www / nom de l'application / current / public;
/etc/nginx/conf.d/rails.conf
upstream app_server {
#Paramètres de liaison avec Unicorn
server unix:/var/www/Nom de l'application/shared/tmp/sockets/unicorn.sock;
}
# {}La partie entourée s'appelle un bloc. Peut définir le serveur
server {
#Numéro de port où ce programme accepte les connexions
listen 80;
#Demande d'URL pour accepter la connexion Impossible d'accéder avec l'URL non écrite ici
server_name Elastic IP;
#Définissez la taille maximale des fichiers téléchargés depuis le client sur 2 giga. La valeur par défaut est de 1 méga, alors gardez-la grande
client_max_body_size 2g;
#Répertoire racine lors de la connexion
root /var/www/Nom de l'application/current/public;
#fichier des actifs(Fichiers CSS et JavaScript, etc.)Paramètres appliqués lors de l'accès
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
root /var/www/Nom de l'application/current/public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
error_page 500 502 503 504 /500.html;
}
Une fois la saisie terminée, exécutez dans l'ordre "touche esc" → ": wq" et enregistrez. N'oubliez pas de recharger / redémarrer après avoir modifié les paramètres Nginx
Exécuter dans le terminal (dans EC2)
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl reload nginx
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart nginx
Si la base de données n'est pas démarrée, le déploiement échouera, vérifiez donc l'état de la base de données avec la commande suivante.
Exécuter dans le terminal (dans EC2)
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl status mariadb
Si «actif» s'affiche comme indiqué ci-dessous, il est en cours d'exécution.
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Active: active (running)depuis Kim 2020-07-17 03:46:51 UTC; 8s ago
Process: 17044 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
Process: 17008 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
Main PID: 17043 (mysqld_safe)
CGroup: /system.slice/mariadb.service
├─17043 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
└─17206 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --so...
Vous devez tuer le processus de la licorne avant le déploiement automatique. Si vous déployez automatiquement avec le serveur Unicorn déjà en cours d'exécution, Parce que vous devrez démarrer le serveur deux fois. (Le déploiement automatique joue également un rôle dans le lancement du serveur)
① Vérifiez le processus
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ ps aux | grep unicorn
ec2-user 17877 0.4 18.1 588472 182840 ? Sl 01:55 0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881 0.0 17.3 589088 175164 ? Sl 01:55 0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911 0.0 0.2 110532 2180 pts/0 S+ 02:05 0:00 grep --color=auto unicorn
② tuer le processus
#Dans l'exemple ci-dessus, "7877"
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$numéro de processus de destruction
Assurez-vous que toutes les modifications du code local sont transmises à master. La préparation du déploiement automatique est maintenant terminée.
Revenez au terminal local et exécutez le déploiement automatique avec la commande suivante
#Exécuter dans le répertoire des applications
% bundle exec cap production deploy
Exécuter dans le terminal (dans EC2)
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart mariadb
[ec2-user@ip-***-**-**-*** ~]$ sudo systemctl restart nginx
Accès avec Elastic IP depuis un navigateur.
c'est tout. Je vous remercie pour votre travail acharné.
Recommended Posts