[RUBY] Verfahren zum Veröffentlichen einer Anwendung mit AWS (5) Veröffentlichen einer Anwendung

Einführung

Wir werden das Verfahren zum Veröffentlichen einer Anwendung mit AWS beschreiben. Dieser Artikel veröffentlicht die Anwendung.

Vorbereiten des Klonens des Anwendungscodes auf den EC2-Server

Wechseln Sie in das Verzeichnis ".ssh"

Führen Sie den folgenden Befehl aus und wechseln Sie in das Verzeichnis ".ssh".

cd ~/.ssh/

SSH-Verbindung

Führen Sie den folgenden Befehl aus, um mit ssh auf die EC2-Instanz zuzugreifen. (Wenn der Name der heruntergeladenen PEM-Datei "xxx.pem" und die elastische IP 12.345.67.890 lautet)

ssh -i xxx.pem [email protected]

Registrieren Sie den SSH-Schlüssel bei Github

Um von einer EC2-Instanz aus auf Github zugreifen zu können, müssen Sie den öffentlichen SSH-Schlüssel der EC2-Instanz bei Github registrieren. Wenn Sie den SSH-Schlüssel nicht registrieren, tritt ein Berechtigungsfehler auf und Sie können nicht klonen. Durch die Registrierung des SSH-Schlüssels in Github werden Sie authentifiziert und können den Code klonen.

Führen Sie den folgenden Befehl aus, um ein SSH-Schlüsselpaar für den EC2-Server zu erstellen.

ssh-keygen -t rsa -b 4096

Führen Sie den folgenden Befehl aus, um den generierten öffentlichen SSH-Schlüssel anzuzeigen und den Wert zu kopieren.

cat ~/.ssh/id_rsa.pub

Wenn Sie auf die folgende URL zugreifen, sieht der Bildschirm wie das Bild aus. https://github.com/settings/keys

SSH鍵登録スクショ.png

Geben Sie einen beliebigen Titel in das Feld "Titel" ein, fügen Sie den zuvor kopierten öffentlichen SSH-Schlüssel in das Feld "Schlüssel" ein und klicken Sie auf "SSH-Schlüssel hinzufügen".

Führen Sie den folgenden Befehl aus und prüfen Sie, ob eine SSH-Verbindung möglich ist.

ssh -T [email protected]

Wenn Berechtigung verweigert (öffentlicher Schlüssel) angezeigt wird, ist die Einstellung des SSH-Schlüssels falsch.

Informationen zu den Optionen des Befehls "ssh-keygen"

Der Befehl "ssh-keygen" ist ein Befehl zum Erstellen eines privaten Schlüssels und eines öffentlichen Schlüssels der Authentifizierungsmethode für öffentliche Schlüssel. "-T" ist eine Option zum Festlegen des Verschlüsselungsformats des Schlüssels, der aus "rsa", "dsa", "ecdsa" und "ed25519" erstellt werden soll. "-B" ist ein Befehl zum Angeben der Anzahl der Bits des zu erstellenden Schlüssels. Dies bedeutet, dass der obige Befehl einen 4096-Bit-Schlüssel im RSA-Verschlüsselungsformat generiert.

Anwendungsservereinstellungen

Der Anwendungsserver ist eine Software, die eine Anwendung als Antwort auf eine Anfrage eines Browsers betreibt.

Wenn Sie beispielsweise den Betrieb einer Ruby on Rails-Anwendung in einer lokalen Umgebung überprüfen, geben Sie den Befehl "Rails s" ein. Dies startet einen Anwendungsserver namens "puma". In diesem Zustand können Sie den Betrieb der Rails-Anwendung überprüfen, indem Sie über den Browser auf "localhost: 3000" zugreifen. (localhost: 3000 Punkte auf Ihren eigenen PC)

Um eine Anwendung auf dem EC2-Server auszuführen, muss der Anwendungsserver auf dem EC2-Server gestartet werden.

Installieren Sie Unicorn

Unicorn ist einer der beliebtesten Anwendungsserver. Unicorn kann mit dem Befehl "unicorn_rails" anstelle des Befehls "Rails s" gestartet werden.

Unicorn ist in Ruby geschrieben und gemisiert. Fügen Sie der Gemfile die folgende Beschreibung hinzu. Unicorn wird nur in der Produktionsumgebung verwendet, ist also in der Entwicklungsumgebung nicht erforderlich.

Gemfile


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

Führen Sie den folgenden Befehl im Anwendungsverzeichnis aus.

bundle install

Erstellen Sie die folgende Unicorn-Konfigurationsdatei direkt unter dem Konfigurationsverzeichnis.

config/unicorn.rb


#Legen Sie das Verzeichnis, in dem der Anwendungscode auf dem Server installiert ist, in einer Variablen ab
app_path = File.expand_path('../../', __FILE__)

#Bestimmen Sie die Leistung des Anwendungsservers
worker_processes 1

#Geben Sie das Verzeichnis an, in dem die Anwendung installiert ist
working_directory app_path

#Geben Sie den Speicherort der Dateien an, die zum Starten von Unicorn erforderlich sind
pid "#{app_path}/tmp/pids/unicorn.pid"

#Geben Sie die Portnummer an
listen 3000

#Geben Sie eine Datei an, um Fehler zu protokollieren
stderr_path "#{app_path}/log/unicorn.stderr.log"

#Geben Sie eine Datei an, um normale Protokolle aufzuzeichnen
stdout_path "#{app_path}/log/unicorn.stdout.log"

#Legen Sie die maximale Wartezeit für die Antwort der Rails-Anwendung fest
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

Was ist ein Prozess?

Ein Prozess ist eine Einheit zum Zeitpunkt der Ausführung aller Programme, die auf einem PC (Server) ausgeführt werden. Das Programm umfasst hier einen Browser, Musikwiedergabesoftware, eine grafische Benutzeroberfläche wie Excel und die Ausführung einer Skriptsprache wie Ruby. Es werden so viele Prozesse ausgeführt, wie Programme ausgeführt werden.

Was ist ein Arbeiter?

Einhorn kann den Prozess stören. Der geteilte Prozess wird als Arbeiter bezeichnet. Durch Aufteilen des Prozesses kann die Antwort auf die Anforderung beschleunigt werden. Legen Sie die Anzahl der Worker im Element worker_processes fest. Einhornarbeiter führen Rails-Anwendungen aus, wenn Anforderungen von Browsern kommen. Rails vergleicht den Inhalt der Anfrage mit dem Routing und antwortet schließlich mit der entsprechenden Ansicht oder json. Unicorn empfängt die Antwort und gibt sie an den Browser zurück. Diese Durchflussreihe dauert etwa 0,1 bis 0,5 Sekunden. In einer Anwendung, in der Anforderungen häufig mit einer höheren Geschwindigkeit auftreten, kann die Verarbeitung möglicherweise nicht mit nur einem Mitarbeiter Schritt halten, und die Antwort kann lange dauern, oder der Server wird möglicherweise angehalten. Sie können die Antwort Ihrer Anwendung beschleunigen, indem Sie die Anzahl der worker_processes erhöhen.

Einhorneinstellungen

Elemente einstellen Einzelheiten
worker_processes Anforderungen annehmen Bestimmen Sie die Anzahl der Mitarbeiter, die Antworten generieren sollen
working_directory Wenn Unicorn den Rails-Code ausführt, gibt es ein Verzeichnis an, in dem nach Dateien gesucht wird, auf die tatsächlich verwiesen wird, z. B. Routing.
pid Geben Sie den Speicherort an, an dem die Datei mit der Prozess-ID generiert werden soll, wenn Unicorn gestartet wird.
listen Geben Sie an, welche Portnummer die Anforderung annehmen soll.

Kommentieren Sie die Beschreibung zu Uglifier aus

Es gibt einen Edelstein namens Uglifier, um das Gewicht von Javascript zu reduzieren. Wenn Javascript die Template-Literal-Notation (`) verwendet, unterstützt Uglifier dies nicht und verursacht während der Bereitstellung einen Fehler. Kommentieren Sie ihn daher aus.

Kommentieren Sie die folgende Beschreibung in config / environment / Production.rb aus.

config/environments/production.rb


# config.assets.js_compressor = :uglifier

Reflektieren Sie Änderungen und Korrekturen im Remote-Repository

Übernehmen Sie die Datei und senden Sie sie an Github. Wenn Sie einen Zweig haben, führen Sie ihn in den Hauptzweig ein.

Klon-Code von Github

Klonen Sie den von Unicorn konfigurierten Code in eine EC2-Instanz.

Erstellen Sie ein Verzeichnis / var / www

Führen Sie nach der SSH-Verbindung zur EC2-Instanz den folgenden Befehl aus, um das Verzeichnis / var / www zu erstellen.

sudo mkdir /var/www/

Ändern Sie die Berechtigungen für ec2-user

Führen Sie den folgenden Befehl aus, um die Berechtigungen des erstellten www-Verzeichnisses in ec2-user zu ändern.

sudo chown ec2-user /var/www/

Holen Sie sich die Repository-URL von Github

Gehen Sie zur Anwendungsseite von Github und kopieren Sie die Repository-URL, die auf das folgende Bild verweist.

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

Code klonen

Führen Sie den folgenden Befehl aus, um den Code zu klonen. (Im folgenden Beispiel, wenn der Benutzername von Github "test1234" und der Repository-Name "testapp" lautet)

cd /var/www/
git clone https://github.com/test1234/testapp.git(Die zuvor kopierte Repository-URL)

Einstellungen für die Produktionsumgebung

Nehmen Sie Einstellungen vor, um den Dienst zu veröffentlichen.

Erweitern Sie die Funktionen von EC2

Die aktuelle EC2-Instanz verfügt nicht über genügend Speicher, und bei der Installation eines Gems kann ein Fehler auftreten. Erhöhen Sie daher zuerst den Speicher.

Swap-Bereich vorbereiten

Wenn ein Computer die Verarbeitung durchführt, werden die Verarbeitungsinhalte vorübergehend an einem Ort namens Speicher aufgezeichnet. Die Kapazität des Speichers ist festgelegt. Wenn diese Kapazität überschritten wird, wird die Verarbeitung mit einem Fehler beendet. Der Swap-Bereich ist eine Datei, die vorbereitet wird, um die Speichermenge vorübergehend zu erhöhen, wenn der Speicher bald aufgebraucht wird. EC2 verfügt standardmäßig nicht über einen Swap-Bereich. Wenn Sie dies vorbereiten, wird ein Fehler aufgrund von Speichermangel vermieden.

SSH in die EC2-Instanz und wechseln Sie in Ihr Home-Verzeichnis.

cd

Führen Sie die folgenden Befehle aus, um den Swap-Bereich zu sichern.

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'

Installieren Sie gem

Installieren Sie die Edelsteine, die zum Starten der geklonten Anwendung erforderlich sind.

Führen Sie den folgenden Befehl aus, um in das Verzeichnis der geklonten Anwendung zu wechseln.

cd /var/www/testapp

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die von rbenv installierte Version von Ruby verwendet wird.

ruby -v

Installieren Sie den Bundler, um Edelsteine in der Produktion zu verwalten

Führen Sie den folgenden Befehl in der lokalen Umgebung aus, um die in der Entwicklungsumgebung verwendete Version des Bundlers zu überprüfen.

bundler -v
gem install bundler -v 2.0.1()
bundle install

Um dieselbe Version in der Produktionsumgebung zu installieren, stellt SSH erneut eine Verbindung zur EC2-Instanz her und führt den folgenden Befehl aus. Festlegen der gleichen Versionsumgebungsvariablen wie die lokale Umgebung Verwenden Sie Umgebungsvariablen, um Informationen festzulegen, die aus Sicherheitsgründen nicht auf Github hochgeladen werden können, z. B. Datenbankkennwörter. In Rails kann der Wert einer Umgebungsvariablen durch Schreiben von "ENV ['']" verwendet werden. Erstellen Sie secret_key_base

secret_key_base ist eine Zeichenfolge, die zum Verschlüsseln von Cookies verwendet wird. Sie müssen es vorbereiten, wenn Sie die Rails-Anwendung ausführen. Da es sich um einen Wert handelt, der nicht nach außen gelangen darf, beziehen Sie sich auf ihn aus der Umgebungsvariablen.

Führen Sie den folgenden Befehl aus, um secret_key_base zu erstellen. Wenn Sie den Befehl ausführen, wird eine lange Zeichenfolge generiert. Kopieren Sie sie daher.

rake secret

Festlegen von Umgebungsvariablen für EC2-Instanzen

Umgebungsvariablen werden auf den gesamten Server angewendet, indem sie in einer Datei namens / etc / environment gespeichert werden. Verwenden Sie den Befehl vim, um Umgebungsvariablen zu schreiben.

Führen Sie den folgenden Befehl aus, um / etc / enrvironment zu bearbeiten.

sudo vim /etc/environment

Bearbeiten Sie / etc / environment wie folgt.

/etc/environment


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

Führen Sie nach dem Bearbeiten und Speichern den folgenden Befehl aus und melden Sie sich einmal ab.

exit

SSH erneut an die EC2-Instanz. Führen Sie den folgenden Befehl aus und prüfen Sie, ob die Umgebungsvariablen angewendet werden.

env | grep DATABASE_PASSWORD
env | grep SECRET_KEY_BASE

Lassen Sie den Port los

Auf die gerade gestartete EC2-Instanz kann über SSH zugegriffen werden, sie kann jedoch nicht über eine andere Kommunikationsmethode wie HTTP verbunden werden. Daher muss die als WEB-Server verwendete EC2-Instanz den Port im Voraus öffnen, damit HTTP verbunden werden kann.

Um den Port festzulegen, muss die Einstellung EC2-Sicherheitsgruppe geändert werden. Eine Sicherheitsgruppe ist wie eine Gruppe, zu der ein EC2-Server gehört, und wird verwendet, um Netzwerkeinstellungen für mehrere EC2-Instanzen gemeinsam zu konfigurieren.

Melden Sie sich bei AWS an, wählen Sie die Zielinstanz im Bildschirm mit der EC2-Instanzliste aus und klicken Sie auf den Link Sicherheitsgruppe. 18_セキュリティグループリンクスクショ.png

Der Bildschirm wechselt zum Einstellungsbildschirm für Sicherheitsgruppen. Klicken Sie daher auf der Registerkarte Eingehend auf Bearbeiten. 19_インバウンド編集スクショ.png

Wenn der Popup-Bildschirm Eingehende Regel bearbeiten angezeigt wird, klicken Sie auf Regel hinzufügen, geben Sie "Benutzerdefinierte TCP-Regel", Protokoll "TCP", Portbereich "3000", Quelle "Benutzerdefiniert", "0.0" ein. Auf "0.0 / 0" einstellen. セキュリティグループポートスクショ.png

Schienen in Produktion starten

Bevor Sie Rails in der Produktionsumgebung starten, unterscheiden sich die MySQL-Einstellungen in der Entwicklungsumgebung und der Produktionsumgebung derzeit. Passen Sie daher die MySQL-Einstellungen in der Entwicklungsumgebung an die Produktionsumgebung an.

Bearbeiten Sie config / database.yml in der Entwicklungsumgebung wie folgt, schreiben Sie es fest und senden Sie es an Github.

config/database.yml


production:
  <<: *default
  database: ~~~(Bearbeiten Sie dies nicht, da dies von jedem Anwendungsnamen abhängt.)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

SSH an die EC2-Instanz und führen Sie den folgenden Befehl aus.

git pull origin master

Führen Sie den folgenden Befehl aus, um in das Anwendungsverzeichnis zu wechseln.

cd /var/www/testapp

Führen Sie den folgenden Befehl aus, um eine Datenbank zu erstellen.

rails db:create RAILS_ENV=production

Führen Sie den folgenden Befehl aus, um die Migration auszuführen.

rails db:migrate RAILS_ENV=production

Wenn hier der Fehler Mysql2 :: Fehler: Verbindung zum lokalen MySQL-Server über Socket nicht möglich ist, ist es möglich, dass MySQL nicht gestartet wurde. Führen Sie daher den folgenden Befehl aus, um MySQL zu starten. ..

sudo service mysqld start

Führen Sie den folgenden Befehl aus, um Unicorn in der Produktionsumgebung zu starten. "-C config / unicorn.rb" bedeutet, die Einstellungsdatei anzugeben, und "-E Produktion" bedeutet, in der Produktionsumgebung zu arbeiten. "-D" ist eine Abkürzung für Daemon. Hierbei handelt es sich um einen Befehl, mit dem Sie beim Starten des Programms einen anderen Befehl in das Terminal eingeben können.

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

Versuchen Sie nun, mit Ihrem Browser auf http: //123.456.789: 3000 / zuzugreifen. (Wenn Elastic IP 123.456.789 ist) Erfolg, wenn ein Bildschirm angezeigt wird, der CSS nicht widerspiegelt.

Kompilieren Sie die Asset-Datei

Die Entwicklungsumgebung verfügt über einen Mechanismus zum automatischen Kompilieren von Asset-Dateien (Image, CSS, Javascript) für jeden Zugriff. In der Produktionsumgebung wird sie jedoch aus Leistungsgründen nicht für jeden Zugriff ausgeführt. Daher ist es notwendig, die Assets im Voraus in der Produktionsumgebung zu kompilieren. Führen Sie den folgenden Befehl aus, um das Asset zu kompilieren.

rails assets:precompile RAILS_ENV=production

Wenn die Kompilierung erfolgreich ist, starten Sie die Schienen neu, um die Reflexion zu überprüfen. Überprüfen Sie zuerst den Unicorn-Prozess vom Terminal aus und beenden Sie den Prozess.

Führen Sie den folgenden Befehl aus, um den Befehl Unicorn zu überprüfen. Der Befehl ps ist ein Befehl zum Überprüfen des aktuell ausgeführten Prozesses, und aux ist eine Option, um das Anzeigeergebnis des Befehls ps besser sichtbar zu machen. | Mit grep unicorn werden nur einhornbezogene Prozesse aus dem Ergebnis des Befehls ps extrahiert.

ps aux | grep unicorn

Überprüfen Sie die PID von unicorn_rails master anhand des angezeigten Ergebnisses. Hier wird angenommen, dass es sich um "17877" als Beispiel handelt.

Führen Sie den folgenden Befehl aus, um den Unicorn-Prozess zu stoppen.

kill 17877

Führen Sie den folgenden Befehl aus, um Unicorn erneut zu starten. Fügen Sie zu diesem Zeitpunkt am Anfang RAILS_SERVE_STATIC_FILES = 1 hinzu. Dadurch kann Unicorn das kompilierte Asset finden.

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

Versuchen Sie erneut, mit Ihrem Browser auf http://12.345.67.890:3000/ zuzugreifen. (Wenn Elastic IP 12.345.67.890 ist) Diesmal sollte der Bildschirm mit CSS angezeigt werden.

Überprüfen Sie, ob die Schienen nicht richtig starten

Referenz

Befehl ssh-keygen Template Literal Notation

In Verbindung stehender Artikel

Verfahren zum Veröffentlichen einer Anwendung mit AWS (1) AWS-Konto erstellen Verfahren zum Veröffentlichen einer Anwendung mit AWS (2) EC2-Instanz erstellen [So veröffentlichen Sie eine Anwendung mithilfe der AWS (3) EC2-Instanzumgebungskonstruktion] (https://qiita.com/osawa4017/items/8dc09203f84e04bf0e66) [Verfahren zum Veröffentlichen einer Anwendung mit AWS (4) Erstellen einer Datenbank] (https://qiita.com/osawa4017/items/7dba25f4fa30ab0b1246) [Verfahren zum Veröffentlichen der Anwendung mit AWS (6) Install Nginx] (https://qiita.com/osawa4017/items/9b707baf6ddde623068c)

Recommended Posts

Verfahren zum Veröffentlichen einer Anwendung mit AWS (5) Veröffentlichen einer Anwendung
Verfahren zum Veröffentlichen einer Anwendung mit AWS (6) Führen Sie Nginx ein
Verfahren zum Veröffentlichen einer Anwendung mit AWS (4) Erstellen einer Datenbank
So veröffentlichen Sie eine Anwendung mithilfe der AWS (3) EC2-Instanzumgebungskonstruktion
Verfahren zum Erstellen eines Autorisierungsservers mit Authlete (CIBA-kompatible Version)
Schritte zum Veröffentlichen einer Anwendung auf Heroku
AdMob-Einstellungsverfahren für Android-Apps (Dezember 2016)
Senden Sie E-Mails mit JavaMail unter AWS
JAVA-Prozedur zum Laden von MySQL JDBC mit Eclipse
Umgebungskonstruktionsverfahren für die Verwendung von PowerMock mit JUnit
[Für Anfänger] Verfahren zum Erstellen eines Controllers mithilfe von Schienen
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ein Memorandum zum Erstellen eines erweiterten Loggers mit org.slf4j.Logger