Rezept für die Bereitstellung von Rails-Apps unter AWS EC2

Einführung

Nachdem ich eine persönliche App in Rails erstellt habe, vergesse ich immer, wie dies bei der Bereitstellung unter AWS zu tun ist. Daher möchte ich sie hier aufschreiben.

Annahme

1. EC2-Instanzerstellung / Schlüsselpaarerstellung

image.png

image.png

image.png

image.png Sie können ein neues Schlüsselpaar oder ein vorhandenes Schlüsselpaar erstellen. Das Schlüsselpaar darf keine Leerzeichen enthalten.

2. Verknüpfung mit Elastic IP

image.png

image.png

image.png

image.png

3. Öffnen Sie den Port

image.png

image.png

image.png

Setzen Sie den Typ auf "HTTP", das Protokoll auf "TCP", den Portbereich auf "80" und die Quelle auf "Custom / 0.0.0.0/0, :: / 0".

Das Folgende wird ebenfalls freigegeben, damit eine HTTP-Verbindung hergestellt werden kann

image.png

image.png

image.png

4. Melden Sie sich als EC2-Benutzer an

lokal


$ cd ~

$ mkdir ~/.ssh
# .Erstellen Sie ein Verzeichnis mit dem Namen ssh
#Auch wenn Sie eine Fehlermeldung erhalten, dass Datei vorhanden ist.Das ssh-Verzeichnis ist bereits vorhanden, also fahren wir fort.

$ mv Downloads/Der Name des heruntergeladenen Schlüssels.pem .ssh/
#Verwenden Sie den Befehl mv, um die PEM-Datei aus dem Download-Verzeichnis herunterzuladen..Wechseln Sie in das Verzeichnis ssh.

$ cd .ssh/

$ ls
#Überprüfen Sie, ob die PEM-Datei vorhanden ist

$chmod 600 Name des heruntergeladenen Schlüssels.pem

$ ssh -i Der Name des heruntergeladenen Schlüssels.pem ec2-user@Elastische IP, die der erstellten EC2-Instanz zugeordnet ist
#(Beispiel: Elastic IP ist 123.456.Wenn es 789 ist, ssh-i Der Name des heruntergeladenen Schlüssels.pem [email protected] Befehl lautet 789)
#(Mit dem heruntergeladenen Schlüssel ec2-Als Benutzer anmelden)

5. Erforderliche Pakete ・ Installieren Sie Ruby

Server


[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 
#Durchlaufen
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
#Beschreibung für den Aufruf von rbenv
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_Profil laden
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile
#ruby-Build installieren
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#Aufwärmen
[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  #Aufwärmen
[ec2-user@ip-172-31-25-189 ~]$ ruby -v #Version prüfen

#Installieren Sie 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 'Das Passwort, das Sie hier einstellen möchten'

#Überprüfen Sie, ob Sie mit dem in MySQL eingestellten PW eingeben können
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p

6. Registrieren Sie den SSH-Schlüssel auf Github

EC2-Server


[ec2-user@ip-172-31-23-189 ~]$ ssh-keygen -t rsa -b 4096

Möglicherweise werden Sie aufgefordert, unterwegs etwa drei Schritte wie die Passphrase einzugeben. Fahren Sie jedoch mit der Eingabetaste fort, ohne etwas einzugeben.

EC2-Server


[ec2-user@ip-172-31-23-189 ~]$ cat ~/.ssh/id_rsa.pub

Greifen Sie auf den Github zu und registrieren Sie den öffentlichen Schlüssel, der von cat angezeigt wird. https://github.com/settings/keys

image.png

Überprüfen Sie nach dem Registrieren des Schlüssels in Github, ob eine SSH-Verbindung mit dem folgenden Befehl möglich ist

EC2-Server


[ec2-user@ip-172-31-23-189 ~]$ ssh -T [email protected]

7. Capistrano-Vorbereitung

Gemfile


group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end

lokal


$ bundle install
$ bundle exec cap install

Capfile bearbeiten


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 '<Vorbereitete elastische IP>', user: 'ec2-user', roles: %w{app db web}

config/deploy.rb


# config valid only for current version of Capistrano
#Beschrieb die Version von Capistrano. Verwenden Sie weiterhin die feste Version und vermeiden Sie Probleme aufgrund von Versionsänderungen
lock '<Capistrano-Version>'

#Wird zum Anzeigen von Capistrano-Protokollen verwendet
set :application, '<Eigener Anwendungsname>'

#Geben Sie an, aus welchem Repository die App abgerufen werden soll
set :repo_url,  '[email protected]:<Github Benutzername>/<Repository-Name>.git'

#Geben Sie ein Verzeichnis an, auf das häufig verwiesen wird, auch wenn sich die Version ändert
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, '<Die in dieser App verwendete Ruby-Version>' 

#Welcher öffentliche Schlüssel für die Bereitstellung verwendet werden soll
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['<SSH-Schlüssel für EC2-Instanz auf lokalem PC(pem)Weg zu (z~/.ssh/key_pem.pem)>'] 

#Speicherort der Datei mit der Prozessnummer
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

#Speicherort der Unicorn-Konfigurationsdatei
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

8. Einstellungen des Anwendungsservers (Einhorn)

Gemfile


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

lokal


bundle install

config/unicorn.rb


app_path = File.expand_path('../../../', __FILE__)

worker_processes 1
#Geben Sie den aktuellen Wert an
working_directory "#{app_path}/current"

#Geändert, um auf jeden in gemeinsam genutzt zu verweisen
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

#Das Folgende ist eine angewendete Einstellung, daher wird die Erklärung weggelassen.

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 (nach Änderung)


# config.assets.js_compressor = :uglifier

9. Klonen Sie den Code von Github

Lassen Sie uns zunächst Commit und Push von GitHub Desktop ausführen. Stellen Sie zu diesem Zeitpunkt sicher, dass Sie dies in der Hauptniederlassung tun.

ec2 server


#Erstellen Sie mit dem Befehl mkdir ein neues Verzeichnis
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#Ec2-Berechtigungen für das erstellte WWW-Verzeichnis-Zum Benutzer wechseln
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/

image.png

ec2 server


[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<Nutzername>/<Repository-Name>.git

10. Nginx-Einstellungen

ec2 server


#Installation
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nginx

#Starten Sie die Einstellungsdatei
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf

rails.conf


upstream app_server {
  #Geändert, um auf in geteilt zu verweisen
  server unix:/var/www/<Anwendungsname>/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name <Füllen Sie Elastic IP aus>;

#Stellen Sie die maximale Größe der vom Client hochgeladenen Dateien auf 2 Giga ein. Der Standardwert ist 1 Mega, halten Sie ihn also groß
  client_max_body_size 2g;

  #Geändert, um auf aktuell zu verweisen
  root /var/www/<Anwendungsname>/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    #Geändert, um auf aktuell zu verweisen
    root   /var/www/<Anwendungsname>/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;
}

ec2 server


#Ändern Sie die Nginx-Berechtigungen
[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
#Nginx-Neustart
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx reload
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart

11. EC2-Kapazitätserweiterung / Bundler-Installation

ec2 server


[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 <Repository-Name>]$ gem install bundler -v x.x.x
#Stellen Sie die lokal bestätigte Version von Bundler vor
[ec2-user@ip-172-31-23-189 <Repository-Name>]$ bundle install
#Der obige Befehl kann einige Minuten oder länger dauern.

12. Umgebungsvariablen einstellen

ec2 server


[ec2-user@ip-172-31-23-189 <Repository-Name>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d
#Zeichenfolge kopieren

ec2 server


[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment

/etc/environment


DATABASE_PASSWORD='MySQL-Root-Benutzerpasswort'
SECRET_KEY_BASE='Das Geheimnis, das Sie zuvor kopiert haben_key_base'

Drücken Sie nach dem Schreiben die Esc-Taste (Escape-Taste) und geben Sie Folgendes ein: wq, um den Inhalt zu speichern. Melden Sie sich nach dem Speichern ab, um die Umgebungsvariablen anzuwenden.

lokal


$ ssh -i [Der Name des heruntergeladenen Schlüssels].pem ec2-user@[Elastische IP, die der erstellten EC2-Instanz zugeordnet ist]
(Mit dem heruntergeladenen Schlüssel ec2-Als Benutzer anmelden)

ec2 server


[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='MySQL-Root-Benutzerpasswort'

ec2 server


#Erstellung der Produktionsumgebungsdatenbank
[ec2-user@ip-172-31-23-189 <Repository-Name>]$ cd /var/www/App Name/releases
[ec2-user@ip-172-31-23-189 <Repository-Name>]$ ll 
#Ein Ordner mit einem numerischen Namen, der das Datum darstellt, wird angezeigt. Beispiel: 20200218063515
CD unterste Nummer#=>Beispiel cd 20200218063515
[ec2-user@ip-172-31-23-189 <Repository-Name>]$ rails db:create RAILS_ENV=production
# => Created database '<Name der Datenbank>'
[ec2-user@ip-172-31-23-189 <Repository-Name>]$ rails db:migrate RAILS_ENV=production

13. Automatische Bereitstellung

Übertragen Sie alle lokalen Änderungen an den Master

lokal


#Führen Sie im Anwendungsverzeichnis aus
$ bundle exec cap production deploy

So überprüfen Sie das Fehlerprotokoll Auf der Serverseite Überprüfen Sie / var / www / <Repository-Name> / current / log / unicorn.stderr.log mit dem Befehl less oder cat und prüfen Sie, ob Fehler vorliegen (je niedriger das Protokoll, desto aktueller ist das Protokoll. Beachten Sie, dass es UTC ist)

Recommended Posts

Rezept für die Bereitstellung von Rails-Apps unter AWS EC2
Starten Sie EC2 Rails
Stellen Sie RAILS auf EC2 bereit
Installieren Sie Docker auf AWS EC2
[Rails] DB-Design für EC-Standort
Fehler beim Bereitstellen von EC2 mit CircleCI
Rails auf EC2 starten (manuelle Bereitstellung)
[EC2 / Vue / Rails] EC2-Bereitstellungsverfahren für Vue + Rails
[Rails] Aufbau einer AWS EC2-Instanzumgebung
Tutorial 1 zum Erstellen von Apps mit Rails (Erste Schritte zu Yay! Du bist auf Rails!)
Mounten Sie EFS unter Ubuntu EC2 unter AWS (amazon-efs-utils)
Einfache Bereitstellung mit Capistrano + AWS (EC2) + Rails
Versuchen Sie, die Rails-App für EC2-Teil 1 bereitzustellen.
Erforderliche Kenntnisse, um Rails-Apps zu AWS zu bringen
[Rails] Bildbeitrag von CarrierWave [AWS EC2]
Erklärung von Ruby auf Schienen für Anfänger ①
[Persönliches Memo] Zusammenfassung der Stolpersteine beim Bereitstellen von Rails-Apps für AWS
Validierungseinstellungen für die Ruby on Rails-Anmeldefunktion
[Ruby on Rails] Select2-Einführungsnotiz für Webpacker
[Rails] Verfahren zum Verknüpfen von Datenbanken mit Ruby On Rails
Rückenwind auf Schienen
EC2 auf Docker-Compose
So installieren Sie Ruby auf einer EC2-Instanz von AWS
Memo zum Erstellen einer Servlet-Umgebung auf EC2 von AWS
Erstellen Sie eine Ruby on Rails-Entwicklungsumgebung in AWS Cloud9
Bereitstellen von Laravel mit Docker auf EC2 unter AWS ① (EC2-Instanz erstellen)
Erklärung von Ruby auf Schienen für Anfänger ⑥ ~ Erstellung der Validierung ~
Eine hohe Rechnung von AWS während der Entwicklung auf Schienen ...
Erklärung von Ruby on Rails für Anfänger ② ~ Links erstellen ~
Erklärung von Ruby on Rails für Anfänger ⑦ ~ Flash-Implementierung ~