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.
Sie können ein neues Schlüsselpaar oder ein vorhandenes Schlüsselpaar erstellen. Das Schlüsselpaar darf keine Leerzeichen enthalten.
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
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)
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
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
Ü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]
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
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
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/
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
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
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.
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
Ü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