Après avoir créé une application personnelle dans Rails, j'oublie toujours comment le faire lors du déploiement sur AWS, alors j'aimerais l'écrire ici.
--Supposant Rails 5.2 ou supérieur
Vous pouvez créer une nouvelle paire de clés ou une paire de clés existante. La paire de clés ne doit pas contenir d'espaces.
Définissez le type sur "HTTP", le protocole sur "TCP", la plage de ports sur "80" et la source sur "Custom / 0.0.0.0/0, :: / 0".
Ce qui suit est également publié afin que la connexion HTTP puisse être établie
local
$ cd ~
$ mkdir ~/.ssh
# .Créez un répertoire appelé ssh
#Même si vous obtenez une erreur indiquant que le fichier existe.Le répertoire ssh existe déjà, alors continuons.
$ mv Downloads/Le nom de la clé téléchargée.pem .ssh/
#Utilisez la commande mv pour télécharger le fichier pem à partir du répertoire de téléchargement..Accédez au répertoire ssh.
$ cd .ssh/
$ ls
#Vérifiez si le fichier pem existe
$chmod 600 Nom de la clé téléchargée.pem
$ ssh -i Le nom de la clé téléchargée.pem ec2-user@Adresse IP élastique associée à l'instance EC2 créée
#(Par exemple, Elastic IP est 123.456.Si c'est 789, ssh-i Le nom de la clé téléchargée.pem [email protected] commande est 789)
#(En utilisant la clé téléchargée, ec2-Connectez-vous en tant qu'utilisateur)
serveur
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y update
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl
[ec2-user@ip-172-31-25-189 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nodejs
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
#Traverser
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
#Description de l'appel à rbenv
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_Profil de charge
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile
#ruby-installer build
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#Faire rehash
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash
[ec2-user@ip-172-31-25-189 ~]$ rbenv install 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash #Faire rehash
[ec2-user@ip-172-31-25-189 ~]$ ruby -v #Vérifier la version
#Installez MySQL
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install mysql56-server mysql56-devel mysql56
[ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld start
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'Le mot de passe que vous souhaitez définir ici'
#Vérifiez si vous pouvez entrer avec le PW défini dans MySQL
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p
Serveur EC2
[ec2-user@ip-172-31-23-189 ~]$ ssh-keygen -t rsa -b 4096
Vous pouvez être invité à entrer environ 3 étapes telles que la phrase de passe sur le chemin, mais veuillez continuer avec la touche Entrée sans rien entrer.
Serveur EC2
[ec2-user@ip-172-31-23-189 ~]$ cat ~/.ssh/id_rsa.pub
Accédez au Github et enregistrez la clé publique affichée par cat. https://github.com/settings/keys
Après avoir enregistré la clé dans Github, vérifiez si la connexion SSH est possible avec la commande suivante
Serveur EC2
[ec2-user@ip-172-31-23-189 ~]$ ssh -T [email protected]
Gemfile
group :development, :test do
gem 'capistrano'
gem 'capistrano-rbenv'
gem 'capistrano-bundler'
gem 'capistrano-rails'
gem 'capistrano3-unicorn'
end
local
$ bundle install
$ bundle exec cap install
Modifier 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}
config/deploy.rb
# config valid only for current version of Capistrano
#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>'
#Quelle clé publique utiliser pour le déploiement
set :ssh_options, auth_methods: ['publickey'],
keys: ['<Clé SSH pour l'instance EC2 sur PC local(pem)Chemin vers (par exemple~/.ssh/key_pem.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
set :linked_files, %w{ config/master.key }
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:stop'
invoke 'unicorn:start'
end
desc 'upload master.key'
task :upload do
on roles(:app) do |host|
if test "[ ! -d #{shared_path}/config ]"
execute "mkdir -p #{shared_path}/config"
end
upload!('config/master.key', "#{shared_path}/config/master.key")
end
end
before :starting, 'deploy:upload'
after :finishing, 'deploy:cleanup'
end
config/database.yml
production:
<<: *default
database: application_name_production
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
Gemfile
group :production do
gem 'unicorn', '5.4.1'
end
local
bundle install
config/unicorn.rb
app_path = File.expand_path('../../../', __FILE__)
worker_processes 1
#Spécifiez le courant
working_directory "#{app_path}/current"
#Changé pour faire référence à chacun dans partagé
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
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
config/environments/production.rb (après modification)
# config.assets.js_compressor = :uglifier
Commençons par nous engager et pousser depuis GitHub Desktop. À ce stade, assurez-vous de le faire dans la branche principale.
serveur ec2
#Créez un nouveau répertoire avec la commande mkdir
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#Autorisations Ec2 sur le répertoire www créé-Changer d'utilisateur
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/
serveur ec2
[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<Nom d'utilisateur>/<Nom du référentiel>.git
serveur ec2
#Installation
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nginx
#Démarrer le fichier de configuration
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
rails.conf
upstream app_server {
#Changé pour faire référence à dans partagé
server unix:/var/www/<Nom de l'application>/shared/tmp/sockets/unicorn.sock;
}
server {
listen 80;
server_name <Remplissez l'adresse IP élastique>;
#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;
#Changé pour faire référence à dans le courant
root /var/www/<Nom de l'application>/current/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
#Changé pour faire référence à dans le courant
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;
}
serveur ec2
#Modifier les autorisations nginx
[ec2-user@ip-172-31-25-189 ~]$ cd /var/lib
[ec2-user@ip-172-31-25-189 lib]$ sudo chmod -R 775 nginx
[ec2-user@ip-172-31-25-189 lib]$ cd ~
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart
#redémarrage de nginx
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx reload
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart
serveur ec2
[ec2-user@ip-172-31-25-189 ~]$ cd
[ec2-user@ip-172-31-25-189 ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
[ec2-user@ip-172-31-25-189 ~]$ sudo chmod 600 /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo mkswap /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo swapon /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo sh -c 'echo "/swapfile1 none swap sw 0 0" >> /etc/fstab'
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ gem install bundler -v x.x.x
#Présentez la version confirmée localement du bundler
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ bundle install
#La commande ci-dessus peut prendre plusieurs minutes ou plus.
serveur ec2
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d
#Copier la chaîne
serveur ec2
[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment
/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 l'écriture, appuyez sur échap (touche d'échappement) puis entrez: wq pour enregistrer le contenu. Une fois enregistré, déconnectez-vous pour appliquer les variables d'environnement.
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]
(En utilisant la clé téléchargée, ec2-Connectez-vous en tant qu'utilisateur)
serveur ec2
[ec2-user@ip-172-31-23-189 ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'
[ec2-user@ip-172-31-23-189 ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='Mot de passe de l'utilisateur root MySQL'
serveur ec2
#Création d'une base de données d'environnement de production
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ cd /var/www/nom de l'application/releases
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ ll
#Un dossier avec un nom numérique représentant la date s'affiche Exemple: 20200218063515
numéro inférieur du cd#=>Exemple cd 20200218063515
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rails db:create RAILS_ENV=production
# => Created database '<Nom de la base de données>'
[ec2-user@ip-172-31-23-189 <Nom du référentiel>]$ rails db:migrate RAILS_ENV=production
Transférer toutes les modifications locales vers le maître
local
#Exécuter dans le répertoire de l'application
$ bundle exec cap production deploy
Comment vérifier le journal des erreurs
Côté serveur
Vérifiez / var / www / <nom du référentiel> / current / log / unicorn.stderr.log
avec la commande less ou cat et vérifiez s'il y a des erreurs (plus le journal est bas, plus le journal est à jour. Notez que c'est UTC)
Recommended Posts