[RUBY] Procédure de publication d'une application à l'aide d'AWS (5) Publier une application

introduction

Nous décrirons la procédure de publication d'une application à l'aide d'AWS. Cet article publie l'application.

Préparation du clonage du code d'application sur le serveur EC2

Accédez au répertoire ".ssh"

Exécutez la commande suivante et accédez au répertoire ".ssh".

cd ~/.ssh/

connexion ssh

Exécutez la commande suivante pour accéder à l'instance EC2 avec ssh. (Lorsque le nom du fichier pem téléchargé est "xxx.pem" et que l'adresse IP Elastic est 12.345.67.890)

ssh -i xxx.pem [email protected]

Enregistrez la clé SSH sur Github

Pour accéder à Github à partir d'une instance EC2, vous devez enregistrer la clé publique SSH de l'instance EC2 avec Github. Si vous n'enregistrez pas la clé SSH, une erreur d'autorisation se produira et vous ne pourrez pas cloner. En enregistrant la clé SSH dans Github, vous serez authentifié et vous pourrez cloner le code.

Exécutez la commande suivante pour créer une paire de clés SSH pour le serveur EC2.

ssh-keygen -t rsa -b 4096

Exécutez la commande suivante pour afficher la clé publique SSH générée et copiez la valeur.

cat ~/.ssh/id_rsa.pub

Lorsque vous accédez à l'URL suivante, l'écran ressemble à l'image. https://github.com/settings/keys

SSH鍵登録スクショ.png

Entrez un titre arbitraire dans le champ "Titre", collez la clé publique SSH que vous avez copiée précédemment dans le champ "Clé" et cliquez sur "Ajouter une clé SSH".

Exécutez la commande suivante et vérifiez si la connexion SSH est possible.

ssh -T [email protected]

Si Autorisation refusée (clé publique). S'affiche, le paramètre de clé SSH est incorrect.

À propos des options de la commande "ssh-keygen"

La commande "ssh-keygen" est une commande pour créer une clé privée et une clé publique de la méthode d'authentification par clé publique. "-T" est une option pour spécifier le format de cryptage de la clé à créer à partir de "rsa", "dsa", "ecdsa" et "ed25519". "-B" est une commande pour spécifier le nombre de bits de la clé à créer. Cela signifie que la commande ci-dessus générera une clé de 4096 bits au format de cryptage RSA.

Paramètres du serveur d'applications

Le serveur d'applications est un logiciel qui exploite une application en réponse à une demande d'un navigateur.

Par exemple, lors de la vérification du fonctionnement d'une application Ruby on Rails dans un environnement local, entrez la commande "rails s". Cela démarre un serveur d'applications appelé "puma". Dans cet état, vous pouvez vérifier le fonctionnement de l'application rails en accédant à "localhost: 3000" depuis le navigateur. (localhost: 3000 points sur votre propre PC)

De même, pour exécuter une application sur le serveur EC2, il est nécessaire de démarrer le serveur d'applications sur le serveur EC2.

Installer Unicorn

Unicorn est l'un des serveurs d'applications les plus populaires. Unicorn peut être démarré avec la commande "unicorn_rails" au lieu de la commande "rails s".

La licorne est écrite en rubis et est gemme Ajoutez la description suivante au Gemfile. Unicorn est utilisé uniquement dans l'environnement de production, il n'est donc pas nécessaire dans l'environnement de développement.

Gemfile


group :production do
  gem 'unicorn', '5.4.1'
end

Exécutez la commande suivante dans le répertoire de l'application.

bundle install

Créez le fichier de configuration Unicorn suivant directement sous le répertoire de configuration.

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"

#Définir le temps maximum d'attente pour la réponse de l'application Rails
timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

Qu'est-ce qu'un processus

Un processus est une unité au moment de l'exécution de tous les programmes s'exécutant sur un PC (serveur). Le programme comprend ici un navigateur, un logiciel de lecture de musique, une interface graphique telle qu'Excel et l'exécution d'un langage de script tel que Ruby. Il y a autant de processus que de programmes en cours d'exécution.

Qu'est-ce qu'un travailleur

La licorne peut perturber le processus. Le processus divisé est appelé un travailleur. En fractionnant le processus, la réponse à la demande peut être effectuée plus rapidement. Définissez le nombre de nœuds de calcul dans l'élément appelé work_processes. Les travailleurs Unicorn exécutent des applications de rails lorsque les demandes proviennent de navigateurs. rails compare le contenu de la requête avec le routage et répond finalement avec la vue ou json appropriée. Unicorn reçoit la réponse et la renvoie au navigateur. Cette série de flux prend environ 0,1 à 0,5 seconde. Si l'application est telle que les demandes se produisent fréquemment à une vitesse plus élevée que cela, le traitement peut ne pas être en mesure de suivre le rythme d'un seul travailleur et il peut prendre beaucoup de temps pour répondre ou le serveur peut s'arrêter. Vous pouvez accélérer la réponse de votre application en augmentant le nombre de work_processes.

Paramètres de la licorne

Éléments de réglage Détails
worker_processes Accepter les demandes Déterminer le nombre de travailleurs pour générer des réponses
working_directory Quand Unicorn exécute du code rails, il spécifie un répertoire pour rechercher les fichiers auxquels il fait réellement référence, comme le routage.
pid Spécifie l'emplacement pour générer le fichier avec l'ID de processus au démarrage de Unicorn.
listen Spécifiez le numéro de port pour accepter la demande.

Commentez la description de Uglifier

Il existe un joyau appelé Uglifier pour réduire le poids de Javascript. Si Javascript utilise la notation littérale de modèle (`), Uglifier ne le prend pas en charge et provoquera une erreur lors du déploiement, alors commentez-le.

Commentez la description suivante dans config / environnements / production.rb.

config/environments/production.rb


# config.assets.js_compressor = :uglifier

Refléter les changements et les corrections dans le référentiel distant

Validez le fichier et transférez-le sur Github. Si vous avez une branche, fusionnez-la dans la branche principale.

Cloner le code de Github

Clonez le code configuré Unicorn sur une instance EC2.

Créer un répertoire / var / www

Après la connexion SSH à l'instance EC2, exécutez la commande suivante pour créer le répertoire / var / www.

sudo mkdir /var/www/

Changer les autorisations en ec2-user

Exécutez la commande suivante pour modifier les autorisations du répertoire www créé en ec2-user.

sudo chown ec2-user /var/www/

Obtenez l'URL du référentiel de Github

Accédez à la page de l'application de Github et copiez l'URL du référentiel faisant référence à l'image ci-dessous.

リポジトリURLスクショ.png

Code de clonage

Exécutez la commande suivante pour cloner le code. (Dans l'exemple ci-dessous, lorsque le nom d'utilisateur de Github est "test1234" et le nom du référentiel est "testapp")

cd /var/www/
git clone https://github.com/test1234/testapp.git(L'URL du référentiel que vous avez copiée précédemment)

Paramètres de l'environnement de production

Définissez les paramètres pour publier le service.

Développez les capacités d'EC2

L'instance EC2 actuelle n'a pas assez de mémoire et une erreur peut se produire lors de l'installation d'un gem. Par conséquent, augmentez d'abord la mémoire.

Préparer la zone d'échange

Lorsqu'un ordinateur effectue un traitement, le contenu du traitement est temporairement enregistré dans un endroit appelé mémoire. La capacité de la mémoire est fixe et si elle dépasse cette capacité, le traitement s'arrêtera avec une erreur. La zone Swap est un fichier préparé pour augmenter temporairement la quantité de mémoire lorsque la mémoire est sur le point d'être épuisée. EC2 n'a pas de zone de swap par défaut, donc préparer cela évitera une erreur de manque de mémoire.

Connectez-vous en SSH à l'instance EC2 et accédez à votre répertoire personnel.

cd

Exécutez les commandes suivantes afin de sécuriser la zone d'échange.

sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
sudo chmod 600 /swapfile1
sudo mkswap /swapfile1
sudo swapon /swapfile1
sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

Installer la gemme

Installez les gemmes nécessaires pour lancer l'application clonée.

Exécutez la commande suivante pour accéder au répertoire de l'application clonée.

cd /var/www/testapp

Exécutez la commande suivante pour vérifier si la version de Ruby installée par rbenv est utilisée.

ruby -v

Installer le bundler pour gérer les gemmes en production

Exécutez la commande suivante dans l'environnement local pour vérifier la version du bundler utilisé dans l'environnement de développement.

bundler -v

La version diffère selon l'environnement de développement, mais cette fois, il s'agissait de 2.0.1. Afin d'installer la même version dans l'environnement de production, connectez-vous SSH à l'instance EC2 à nouveau et exécutez la commande suivante.

gem install bundler -v 2.0.1(Même version que l'environnement local)
bundle install

Définir les variables d'environnement

Les informations qui ne peuvent pas être téléchargées sur Github pour des raisons de sécurité, telles que les mots de passe de base de données, sont définies à l'aide de variables d'environnement. Dans les rails, la valeur d'une variable d'environnement peut être utilisée en écrivant "ENV ['<nom de la variable d'environnement>']".

Créer secret_key_base

secret_key_base est une chaîne de caractères utilisée pour crypter les cookies. Vous devez le préparer lorsque vous exécutez l'application rails. Puisqu'il s'agit d'une valeur qui ne doit pas être divulguée vers l'extérieur, faites-y référence à partir de la variable d'environnement.

Exécutez la commande suivante pour créer secret_key_base. Lorsque vous exécutez la commande, une longue chaîne de caractères sera générée, donc copiez-la.

rake secret

Définir des variables d'environnement pour les instances EC2

Les variables d'environnement sont appliquées à l'ensemble du serveur en les enregistrant dans un fichier appelé / etc / environment. Utilisez la commande vim pour écrire des variables d'environnement.

Exécutez la commande suivante pour modifier / etc / enrvironment.

sudo vim /etc/environment

Modifiez / etc / environment comme suit.

/etc/environment


DATABASE_PASSWORD='<Mot de passe de l'utilisateur root MySQL>'
SECRET_KEY_BASE='<Le secret que vous avez copié plus tôt_key_base>'

Après la modification et l'enregistrement, exécutez la commande suivante et déconnectez-vous une fois.

exit

Connectez-vous à nouveau à l'instance EC2. Exécutez la commande suivante et vérifiez si les variables d'environnement sont appliquées.

env | grep DATABASE_PASSWORD
env | grep SECRET_KEY_BASE

Libérez le port

L'instance EC2 nouvellement lancée est accessible par SSH, mais ne peut être connectée par aucune autre méthode de communication telle que HTTP. Par conséquent, il est nécessaire d'ouvrir au préalable le port de l'instance EC2 utilisée comme serveur WEB pour que HTTP puisse être connecté.

Afin de définir le port, il est nécessaire de modifier le paramètre appelé groupe de sécurité EC2. Un groupe de sécurité est comme un groupe auquel appartient un serveur EC2 et est utilisé pour configurer collectivement les paramètres réseau pour plusieurs instances EC2.

Connectez-vous à AWS, sélectionnez l'instance cible dans l'écran de la liste des instances EC2, puis cliquez sur le lien du groupe de sécurité. 18_セキュリティグループリンクスクショ.png

L'écran passera à l'écran de paramétrage du groupe de sécurité, cliquez donc sur Modifier dans l'onglet entrant. 19_インバウンド編集スクショ.png

Lorsque l'écran contextuel Modifier la règle entrante apparaît, cliquez sur Ajouter une règle, saisissez «Règle TCP personnalisée», protocole «TCP», plage de ports «3000», source «Personnalisé», «0.0. Réglez sur "0.0 / 0". セキュリティグループポートスクショ.png

Rails de lancement en production

Avant de démarrer les rails dans l'environnement de production, les paramètres MySQL de l'environnement de développement et de l'environnement de production sont actuellement différents, donc ajustez les paramètres MySQL de l'environnement de développement à l'environnement de production.

Modifiez config / database.yml dans l'environnement de développement comme suit, validez et transmettez à Github.

config/database.yml


production:
  <<: *default
  database: ~~~(Ne modifiez pas ceci car cela dépend de chaque nom d'application)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

Connectez-vous en SSH à l'instance EC2 et exécutez la commande suivante.

git pull origin master

Exécutez la commande suivante pour accéder au répertoire de l'application.

cd /var/www/testapp

Exécutez la commande suivante pour créer une base de données.

rails db:create RAILS_ENV=production

Exécutez la commande suivante pour exécuter la migration.

rails db:migrate RAILS_ENV=production

Si l'erreur Mysql2 :: Error: Can't connect to local MySQL server via socket se produit ici, il est possible que MySQL n'ait pas démarré, alors exécutez la commande suivante pour démarrer MySQL. ..

sudo service mysqld start

Exécutez la commande suivante pour démarrer unicorn dans l'environnement de production. "-C config / unicorn.rb" signifie spécifier le fichier de paramétrage et "-E production" signifie fonctionner dans l'environnement de production. "-D" est une abréviation pour Daemon, qui est une commande qui vous permet de taper une autre commande dans le terminal lors du démarrage du programme.

bundle exec unicorn_rails -c config/unicorn.rb -E production -D

Maintenant, essayez d'accéder à http: //123.456.789: 3000 / avec votre navigateur. (Lorsque l'IP élastique est 123.456.789) Succès si un écran qui ne reflète pas le CSS est affiché.

Compilez le fichier d'actif

L'environnement de développement dispose d'un mécanisme pour compiler automatiquement les fichiers d'actifs (image, css, javascript) pour chaque accès, mais dans l'environnement de production, il n'est pas exécuté pour chaque accès en raison des performances. Par conséquent, il est nécessaire de compiler les actifs à l'avance dans l'environnement de production. Exécutez la commande suivante pour compiler l'actif.

rails assets:precompile RAILS_ENV=production

Si la compilation réussit, redémarrez les rails pour vérifier la réflexion. Tout d'abord, vérifiez le processus Unicorn à partir du terminal et tuez le processus.

Exécutez la commande suivante pour vérifier la commande Unicorn. La commande ps est une commande pour vérifier le processus en cours d'exécution, et aux est une option pour rendre le résultat d'affichage de la commande ps plus facile à voir. | En utilisant grep unicorn, seuls les processus liés à la licorne sont extraits du résultat de la commande ps.

ps aux | grep unicorn

Vérifiez le PID du maître unicorn_rails à partir du résultat affiché. Ici, on suppose qu'il s'agit de "17877" à titre d'exemple.

Exécutez la commande suivante pour arrêter le processus Unicorn.

kill 17877

Exécutez la commande suivante pour redémarrer Unicorn. À ce stade, ajoutez RAILS_SERVE_STATIC_FILES = 1 au début. Cela permettra à Unicorn de trouver l'actif compilé.

RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

Essayez à nouveau d'accéder à http://12.345.67.890:3000/ avec votre navigateur. (Lorsque l'IP élastique est 12.345.67.890) Cette fois, l'écran doit être affiché avec css reflété.

Vérifier quand les rails ne démarrent pas correctement

référence

commande ssh-keygen Notation littérale de modèle

Article associé

Procédure pour publier une application à l'aide d'AWS (1) Créer un compte AWS Procédure pour publier une application à l'aide d'AWS (2) Create EC2 instance [Comment publier une application à l'aide de la construction d'environnement d'instance AWS (3) EC2] (https://qiita.com/osawa4017/items/8dc09203f84e04bf0e66) [Procédure pour publier une application à l'aide de AWS (4) Create database] (https://qiita.com/osawa4017/items/7dba25f4fa30ab0b1246) [Procédure pour publier une application à l'aide d'AWS (6) Install Nginx] (https://qiita.com/osawa4017/items/9b707baf6ddde623068c)

Recommended Posts

Procédure de publication d'une application à l'aide d'AWS (5) Publier une application
Procédure de publication d'une application à l'aide d'AWS (6) Présentation de Nginx
Procédure de publication d'une application à l'aide d'AWS (4) Création d'une base de données
Comment publier une application à l'aide de la construction d'environnement d'instance AWS (3) EC2
Procédure de création d'un serveur d'autorisation avec Authlete (version compatible CIBA)
Étapes pour publier une application sur Heroku
Procédure de configuration d'AdMob pour les applications Android (décembre 2016)
Envoyer des e-mails à l'aide de JavaMail sur AWS
Procédure JAVA pour le chargement de MySQL JDBC à l'aide d'Eclipse
Procédure de construction d'environnement pour l'utilisation de PowerMock avec JUnit
[Pour les débutants] Procédure de création d'un contrôleur à l'aide de rails
J'ai essayé d'utiliser la boîte à outils de migration pour les fichiers binaires d'application
J'ai essayé d'utiliser l'instruction Extended for en Java
Un mémorandum pour créer un enregistreur étendu à l'aide de org.slf4j.Logger