[RUBY] Lancez EC2 Rails

introduction

La procédure pour «utiliser le serveur AWS» est écrite en 5 parties.

Veuillez consulter les articles ci-dessous.

Configuration initiale de EC2Créer une base de données dans l'environnement de productionRails de départ de EC2 ← Imakoko ④ Configurer le serveur WebAutomatiser le déploiement

Paramètres de lancement de Rails sur EC2

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
3a:8c:1d:d1:a9:22:c7:6e:6b:43:22:31:0f:ca:63:fa ec2-user@ip-172-31-23-189
The key's randomart image is:
+--[ RSA 4096]----+
|    +            |
| . . =           |
|  = . o .        |
| * o . o         |
|= *     S        |
|.* +     .       |
|  * +            |
| .E+ .           |
| .o              |
+-----------------+

Ensuite, copiez la valeur de la clé publique ssh affichée par la "commande cat".

En exécutant la "commande cat", vous pouvez vérifier le contenu spécifique du fichier sur le terminal.

[ec2-user@ip-***-**-**-*** ~]$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2E......

Ensuite, enregistrez la clé publique affichée par la commande cat dans GitHub. Accédez à l'URL suivante

https://github.com/settings/keys

Remplissez "Titre" Collez la clé publique dans "Key" Appuyez sur "ADD SSH Key" pour enregistrer

Après avoir enregistré la clé dans GitHub, vérifiez si vous pouvez vous connecter avec ssh avec la commande suivante

[ec2-user@ip-***-**-**-*** ~]$ ssh -T [email protected]
Hi <Nom d'utilisateur Github>! You've successfully authenticated, but GitHub does not provide shell access.

Si «Autorisation refusée (clé publique).» S'affiche, Le réglage de la clé ssh est incorrect, alors vérifiez à nouveau le travail.

Paramètres du serveur d'applications

Le "serveur d'applications" accepte les "demandes" des navigateurs Logiciel qui exécute réellement les applications Rails

Il est également nécessaire d'exécuter le serveur d'applications sur le serveur EC2. Les outils nécessaires pour cela sont ** `ʻUnicorn`` **

"Unicorn" est un serveur d'applications souvent utilisé sur des serveurs ouverts sur le monde. Il peut être démarré par "commande unicorn_rails" au lieu de la commande rails.

Installer Unicorn

Ajoutez le contenu suivant au bas du Gemfile et installez le bundle

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

Créer et éditer "unicorn.rb"

Créez "config / unicorn.rb" et modifiez le contenu comme suit

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
#Travailleur qui accepte les demandes et génère des réponses(ouvrier)Déterminez le nombre de
worker_processes 1

#Spécifiez le répertoire dans lequel l'application est installée
#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.
working_directory app_path

#Spécifiez l'emplacement des fichiers requis pour démarrer Unicorn
#Unicorn générera un fichier avec l'identifiant du processus au démarrage. Spécifiez l'emplacement.
pid "#{app_path}/tmp/pids/unicorn.pid"

#Spécifiez le numéro de port
#Décidez du numéro de port pour lequel vous souhaitez accepter la demande. Cette fois, spécifiez le port 3000.
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

#Ce qui suit est un paramètre appliqué, donc l'explication est omise.

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

Refléter le contenu modifié dans le référentiel distant

"Commit → push" vers le référentiel distant Après l'avoir reflété dans le référentiel distant de GitHub, reflétez tout le contenu local jusqu'à présent dans EC2.

#Créez un nouveau répertoire avec la commande mkdir
[ec2-user@ip-***-**-**-*** ~]$ sudo mkdir /var/www/

#Autorisations Ec2 sur le répertoire www créé-Changer d'utilisateur
[ec2-user@ip-***-**-**-*** ~]$ sudo chown ec2-user /var/www/

Ensuite, récupérez l '"URL du dépôt" sur GitHub et clonez-la. Vous pouvez copier l'URL en appuyant sur le "Code" vert. Image from Gyazo

Une fois que vous avez copié l'URL, clonez le code

[ec2-user@ip-***-**-**-*** ~]$ cd /var/www/
[ec2-user@ip-***-**-**-*** www]$git clone collez l'URL copiée

Succès s'il n'y a pas d'erreur dans l'entrée ci-dessus.

Paramètres de production

L'instance EC2 en cours d'exécution n'a pas assez de puissance informatique, Une erreur peut survenir lors de l'installation de Gem. Plus précisément, il n'y a pas assez de mémoire liée à la puissance de traitement de l'ordinateur. C'est la limite des instances qui peuvent être exécutées gratuitement, donc ça ne peut pas être aidé ...

Par conséquent, avant de procéder à de futurs réglages, nous effectuerons un processus appelé "Swap file" pour augmenter la mémoire.

Un «fichier d'échange» est un fichier préparé pour augmenter temporairement la quantité de mémoire. EC2 ne prépare pas de fichier Swap par défaut, donc le préparer évitera les erreurs de traitement de mémoire insuffisante.

Développez la zone des fichiers d'échange

Établissez une connexion ssh à EC2 et accédez à votre répertoire personnel Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** ~]$ cd 

Exécutez les commandes suivantes dans l'ordre

[ec2-user@ip-***-**-**-*** ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512

#Attendez un moment et réussissez si ce qui suit s'affiche
512+0 Entrée d'enregistrement
512+0 sortie d'enregistrement
536870912 octets(537 MB)Copié, 7.35077 secondes, 73.0 MB/Secondes
[ec2-user@ip-***-**-**-*** ~]$ sudo chmod 600 /swapfile1
[ec2-user@ip-***-**-**-*** ~]$ sudo mkswap /swapfile1

#Succès si ce qui suit est affiché
Définir la taille de l'espace de swap version 1= 524284 KiB
Pas de label, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
[ec2-user@ip-***-**-**-*** ~]$ sudo swapon /swapfile1
[ec2-user@ip-***-**-**-*** ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

Ceci termine la sécurisation de la zone pour le fichier d'échange.

Installer gem dans EC2

Installez le gem requis pour lancer l'application clonée sur EC2 avec la commande suivante

Exécuter dans le terminal (dans EC2)

#Déplacer vers le répertoire cloné
[ec2-user@ip-***-**-**-*** www]$ cd  /var/www/Application en cours de développement

#Vérifiez la version de ruby
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]

Ensuite, installez le bundler pour gérer les gemmes dans l'environnement de production. Tout d'abord, vérifiez quelle version de bundler a été utilisée dans l'application développée localement.

Exécuter dans le terminal (local)

#Exécuter dans le répertoire de l'application en cours de développement

% bundler -v
Bundler version 2.1.4 ← Exemple

Introduit la même version de bundler que le local du côté EC2. Dans le cas ci-dessus, installez la version de "bundler 2.1.4" et exécutez l'installation du bundle.

Exécuter dans le terminal (dans EC2)

# 「2.1.Dans la partie "4", la version du bundler confirmé localement est introduite.
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ gem install bundler -v 2.1.4

#Le traitement des commandes suivantes peut prendre quelques minutes ou plus
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ bundle install

Définir les variables d'environnement

La valeur de la variable d'environnement peut être utilisée à partir de Rails en écrivant "ENV ['<nom de la variable d'environnement>']". Cette fois, spécifiez la variable d'environnement "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 une application Rails. De plus, étant donné qu'il s'agit d'une valeur qui ne doit pas être divulguée vers l'extérieur, elle est également désignée par la variable d'environnement.

Commencez par créer secret_key_base avec la commande suivante

Exécuter dans le terminal (dans EC2)

# 「2.1.Dans la partie "4", la version du bundler confirmé localement est introduite.
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d

Ensuite, définissez la variable d'environnement dans EC2. Enregistrez les variables d'environnement dans un fichier appelé "/ etc / environnement". Utilisez la commande vim pour écrire des variables d'environnement. À ce moment-là, utilisez l'option "sudo".

"Sudo" est une option avec le rôle d '"exécution de commandes avec pleine autorité". Puisque les "fichiers sous / etc" ne peuvent pas être écrits ou enregistrés sans une autorité forte, ajoutez "sudo" au début de la commande.

Exécuter dans le terminal (dans EC2)

# 「2.1.Dans la partie "4", la version du bundler confirmé localement est introduite.
[ec2-user@ip-***-**-**-*** ~]$ sudo vim /etc/environment

Tapez "i" pour accéder au mode d'entrée. Après cela, il est décrit comme suit.

#Entrez le mot de passe de l'utilisateur root de la base de données (vous pouvez vous référer à l'article à partir du lien ci-dessous)

DATABASE_PASSWORD='Mot de passe de l'utilisateur racine de la base de données'
SECRET_KEY_BASE='Le secret créé plus tôt_key_base'

Une fois la saisie terminée, exécutez dans l'ordre "touche esc" → ": wq" et enregistrez. Déconnectez-vous de l'environnement de production une fois pour refléter les variables d'environnement définies.

Exécuter dans le terminal (dans EC2)

# 「2.1.Dans la partie "4", la version du bundler confirmé localement est introduite.
[ec2-user@ip-***-**-**-*** ~]$ exit
logout
Connection to 52.xx.xx.xx closed.

Ensuite, vérifiez si les variables d'environnement que vous venez de définir sont correctement reflétées. Connectez-vous à nouveau à EC2 avec la commande suivante.

Terminal (local)

$ ssh -i [Le nom de la clé téléchargée].pem ec2-user@[Adresse IP élastique associée à l'instance EC2 créée]

Après la reconnexion, combinez la "commande env" et la "commande grep" pour Assurez-vous que les variables d'environnement que vous avez définies précédemment sont appliquées.

Commande env: une commande pour afficher les variables d'environnement définies Commande grep: commande utilisée pour rechercher des variables d'environnement, etc. L'utilisation est "grep (cible de recherche)".

Exécuter dans le terminal (dans EC2)

# 「2.1.Dans la partie "4", la version du bundler confirmé localement est introduite.
[ec2-user@ip-***-**-**-*** ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

[ec2-user@ip-***-**-**-*** ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='Mot de passe de l'utilisateur racine de la base de données'

Port de sortie

L'instance EC2 nouvellement lancée est accessible avec ssh, Il n'est pas du tout connecté par d'autres méthodes de communication telles que HTTP. Par conséquent, l'instance EC2 utilisée comme serveur doit ouvrir le "port" à l'avance afin que HTTP puisse être connecté. Auparavant, j'ai écrit "listen 3000" dans config / unicorn.rb, Cela signifie "démarrer le serveur Rails sur le port 3000".

Afin de définir le port, il est nécessaire de modifier le paramètre appelé "groupe de sécurité" de EC2.

Définir le port du groupe de sécurité

Sélectionnez l'instance cible dans l'écran de liste des instances EC2 et sélectionnez-la. Cliquez sur le lien "Security Group" en bas à droite de la figure ("launch-wizard-2" sur la figure) Image from Gyazo](https://gyazo.com/cef10db71b1cb250b5fcc8851bc46d1b)

Cliquez ensuite sur "Modifier la règle entrante" dans l'onglet "Entrant" Image from Gyazo

Après la transition d'écran, cliquez sur "Ajouter une règle" et modifiez comme suit Type: TCP personnalisé Protocole: TCP Portée: 3000 Source: personnalisé /0.0.0.0/0 Image from Gyazo

Après le réglage, cliquez sur "Enregistrer la règle". C'est tout pour ouvrir le port.

Rails de lancement en production

Utilisez la "commande unicorn_rails" pour démarrer Rails dans un environnement de production.

Tout d'abord, modifiez les paramètres de l'environnement de production de "database.yml" avec VS Code. Modifiez le fichier database.yml local comme suit pour qu'il corresponde aux paramètres mysql dans l'environnement de production.

config/database.yml (local)


production:
  <<: *default
  database:(* Ne modifiez pas ici)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

Ensuite, éditez "commit → push"

Ensuite, reflétez le contenu de GitHub dans EC2 Exécutez la commande suivante dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ git pull origin master

Ensuite, créez une base de données dans EC2. Il existe une option "RAILS_ENV = production". RAILS_ENV = production: Options qui sont attachées lors de l'exécution de commandes dans l'environnement de production.

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ rails db:create RAILS_ENV=production
Created database '<Nom de la base de données>'
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ rails db:migrate RAILS_ENV=production

Une fois cela fait, démarrez Rails.

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ cd /var/www/[Dépôt]
[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

Accédez à http: // : 3000 / avec votre navigateur et vérifiez si le site est affiché.

Lorsque je le vérifie avec un navigateur, la vue reste interrompue. Un message d'erreur (Désolé, mais une erreur s'est produite.) Peut s'afficher.

Ce n'est pas bon, alors organisez les "fichiers d'actifs".

Fichier d'actif: un fichier qui gère les images, CSS, JavaScript, etc. Le processus de compression de ce fichier d'actif et de transfert des données est appelé «compilation». Si vous ne le faites pas, le CSS ne sera pas reflété dans l'environnement de production et la vue sera corrompue. Des problèmes tels que le navigateur ne s'affichant pas en raison d'une erreur se produisent.

Compiler les fichiers d'actifs

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ rails assets:precompile RAILS_ENV=production

Quand j'ai terminé jusqu'à présent, j'ai redémarré Rails, mais comme le serveur est déjà opérationnel, je dois redémarrer Rails.

Suivez les étapes ci-dessous pour redémarrer Rails en production

Commencez par vérifier "Processus Unicorn". Utilisez la "commande ps" pour vérifier le processus depuis le terminal. Après cela, terminez le processus avec la "commande kill".

commande ps: une commande pour vérifier le processus en cours d'exécution. commande kill: une commande pour arrêter le processus en cours d'exécution.

Exécuter dans le terminal (dans EC2)

[ec2-user@ip-***-**-**-*** <Nom du référentiel>]$ ps aux | grep unicorn
...

Ensuite, vous devriez voir le processus comme ci-dessous.


#### **`Terminal`**
```bash

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

Au-dessus de "ec2-Le numéro à droite de "utilisateur" est l'identifiant du processus (PID) 「unicorn_Le processus appelé «maître des rails» est le corps du processus Unicorn L'ID de processus à ce moment est "17877"

Terminal (dans EC2))Courir

 [ec2-user @ ip - *** - ** - ** - *** <nom du référentiel>] $ kill <ID de processus maître confirmé de licorne rails> ← Cette fois 17878

Visualisez à nouveau le processus exécuté et confirmez qu'il a été arrêté.

 [ec2-user @ ip - *** - ** - ** - *** <nom du référentiel>] $ ps aux | grep unicorn
...
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn

Si le résultat de l'exécution est comme ci-dessus, l'arrêt de Unicorn est terminé.

###Enfin, exécutez la commande pour redémarrer Rails 「RAILS_SERVE_STATIC_FILES="1" a pour rôle de spécifier Rails pour trouver l'actif compilé.

Terminal (dans EC2))Courir

 [ec2-user @ ip - *** - ** - ** - *** <nom du référentiel>] $ RAILS_SERVE_STATIC_FILES = 1 unicorn_rails -c config / unicorn.rb -E production -D

Http dans le navigateur://<Elastic IP>:3000/Accédez à et vérifiez si le site est affiché.


##Quand Rails ne démarre pas bien unicorn_Lors de l'exécution de rails 「master failed to start, check stderr log for details」 Si vous obtenez, vous devez vérifier le journal des erreurs de la licorne.

Utilisez quelque chose appelé «moins de commande» lors de l'affichage des fichiers journaux

commande less: une commande qui vous permet de vérifier le contenu d'un fichier. La "commande cat" a un rôle similaire.

Terminal (dans EC2))Courir

 [ec2-user @ ip - *** - ** - ** - *** <nom du référentiel>] $ less log / unicorn.stderr.log
I, [2016-12-21T04:01:19.135154 #18813]  INFO -- : Refreshing Gem list
I, [2016-12-21T04:01:20.732521 #18813]  INFO -- : listening on addr=0.0.0.0:3000 fd=10
E, [2016-12-21T04:01:20.734067 #18813] Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
/var/www/furima/shared/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect'
/var/www/furima/shared/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/var/www/furima/shared/bundle/ruby/2.6.0/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:24:in `new'
/var/www/furima/shared/bundle/ruby/2.6.0/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/mysql2_adapter.rb:24:in `mysql2_connection'
/var/www/furima/shared/bundle/ruby/2.6.0/gems/activerecord-6.0.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:889:in `new_connection'

##「We’re sorry,mais ~ "s'affiche Tout d'abord, "la production.Vérifiez "journal".

production.log: un endroit pour enregistrer les journaux du serveur, "un endroit pour enregistrer les événements dans EC2"

Terminal (dans EC2))Courir

 [ec2-user @ ip - *** - ** - ** - *** <nom du référentiel>] $ moins log / production.log

 (Afficher production.log)

####tail -utilisez la commande f tail -Commande f: commande qui affiche le dernier journal pour seulement 10 lignes. C'est un outil qui vous permet de vérifier facilement le journal, alors utilisez-le autant que possible.


c'est tout. Je vous remercie pour votre travail acharné.

Continuer →Ici

Recommended Posts

Lancez EC2 Rails
Lancer des rails sur EC2 (déploiement manuel)
Déployer RAILS sur EC2
Vent arrière sur les rails
EC2 sur Docker-compose
Lancer un conteneur docker sur EC2 (mémorandum personnel)
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Ouais, je suis sur des rails!
Association Ruby On Rails
Recette pour déployer des applications Rails sur AWS EC2
[Rails] Lancer un nouveau projet
Résoudre ActiveRecord :: NoDatabaseError sur les rails6
rails nouvelle commande de lancement d'application
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
[Ruby on Rails] Debuck (binding.pry)
Record d'apprentissage de Ruby on rails -2020.10.05
Record d'apprentissage de Ruby on rails -2020.10.09
Record d'apprentissage Ruby on rails-2020.10.07 ②
Ouais, je suis sur des rails! Répétition
Installer Rails sur macOS Catalina
Publier des vidéos sur les rails
Installer docker sur AWS EC2
[Rails] Fonction de panier de site EC
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.06
Résumé de la validation Ruby on Rails
Mémorandum de base Ruby on Rails
[Ruby on Rails] Read try (: [] ,: key)
Variables Ruby on Rails, résumé constant
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
[Ruby on Rails] Introduction de la fonction de pagination
Connaissance de base de Ruby on Rails
Progatez Ruby on Rails
[Rails] Conception de bases de données pour le site EC
Le CSS React.js dans l'application Rails déployée sur EC2 ne peut pas être chargé
Comment utiliser Ruby on Rails
Comment déployer Bootstrap sur Rails
Ruby on Rails compatible japonais-anglais i18n
Erreur lors du déploiement d'EC2 avec CircleCI
(Ruby on Rails6) "Effacer" le contenu publié
[Ruby on Rails] Fonction de sortie CSV
Mémo de construction de l'environnement Ruby on Rails 6.0
Rails sur la procédure de construction de l'environnement Docker
[Ruby on Rails] Création de la page de confirmation