Bereitstellen einer Rails-App mit Puma und Nginx unter Ubuntu 14.04

Einführung

Wenn Sie bereit sind, Ihre Ruby on Rails-Anwendung bereitzustellen, müssen Sie viele gültige Setups in Betracht ziehen. Dieses Tutorial hilft Ihnen bei der Bereitstellung der Produktionsumgebung Ihrer Ruby on Rails-Anwendung mit PostgreSQL als Datenbank unter Verwendung von Puma und Nginx unter Ubuntu 14.04.

Puma ist ein Anwendungsserver wie Passenger oder Unicorn Rails-Anwendung zur gleichzeitigen Verarbeitung von Anforderungen. Da Puma nicht für den direkten Zugriff durch Benutzer konzipiert ist, verwenden wir Nginx als Reverse-Proxy, der Anforderungen und Antworten zwischen Benutzern und Ihrer Rails-Anwendung puffert.

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass auf dem Benutzer, der die Anwendung bereitstellt, ein Ubuntu 14.04-Server mit der folgenden Software installiert ist:

Wenn Sie das noch nicht eingerichtet haben, folgen Sie den oben verlinkten Tutorials. Wir gehen davon aus, dass Ihr Benutzer * deploy * heißt.

Außerdem wird in diesem Lernprogramm nicht erläutert, wie Sie Ihre Entwicklungs- oder Testumgebungen einrichten. Wenn Sie dabei Hilfe benötigen, folgen Sie dem Beispiel unter https://www.digitalocean.com/community/tutorials/how-to-use-postgresql-with-your-ruby-on-rails-application-on-ubuntu- 14-04 [Tutorial zu PostgreSQL mit Rails].

Rails-Anwendung erstellen

Idealerweise haben Sie bereits eine Rails-Anwendung, die Sie bereitstellen möchten. In diesem Fall können Sie diesen Abschnitt überspringen und die entsprechenden Ersetzungen vornehmen, während Sie den Anweisungen folgen. Wenn nicht, müssen Sie zunächst eine neue Rails-Anwendung erstellen, die PostgreSQL als Datenbank verwendet.

Dieser Befehl erstellt eine neue Rails-Anwendung mit dem Namen "appname", die PostgreSQL als Datenbank verwendet. Fühlen Sie sich frei, den hervorgehobenen "App-Namen" durch etwas anderes zu ersetzen:

rails new  -d postgresql

Dann wechseln Sie in das Anwendungsverzeichnis:

cd

Nehmen Sie sich einen Moment Zeit, um den PostgreSQL-Benutzer zu erstellen, der von der Produktionsumgebung Ihrer Rails-Anwendung verwendet wird.

Benutzer der Produktionsdatenbank erstellen

Benennen Sie den Benutzer der Produktionsdatenbank mit dem Namen Ihrer Anwendung, um die Sache zu vereinfachen. Wenn Ihre Anwendung beispielsweise "Anwendungsname" heißt, sollten Sie einen PostgreSQL-Benutzer wie folgt erstellen:

sudo -u postgres createuser -s

Wir möchten das Kennwort des Datenbankbenutzers festlegen. Geben Sie die PostgreSQL-Konsole folgendermaßen ein:

sudo -u postgres psql

Legen Sie dann das Kennwort für den Datenbankbenutzer "appname" wie folgt fest:

\password

Geben Sie Ihr gewünschtes Passwort ein und bestätigen Sie es.

Beenden Sie die PostgreSQL-Konsole mit folgendem Befehl:

\q

Jetzt können wir Ihre Anwendung mit den richtigen Datenbankverbindungsinformationen konfigurieren.

Datenbankverbindung konfigurieren

Stellen Sie sicher, dass Sie sich im Stammverzeichnis Ihrer Anwendung befinden (+ cd ~ / +).

Öffnen Sie die Datenbankkonfigurationsdatei Ihrer Anwendung in Ihrem bevorzugten Texteditor. Wir verwenden vi:

vi config/database.yml

Aktualisieren Sie den Abschnitt + production so, dass er ungefähr so ​​aussieht:

production:
 <<: *default
 host: localhost
 adapter: postgresql
 encoding: utf8
 database:
 pool: 5
 username: <%= ENV['_DATABASE_USER'] %>
 password: <%= ENV['_DATABASE_PASSWORD'] %>

Beachten Sie, dass der Benutzername und das Kennwort der Datenbank so konfiguriert sind, dass sie von den Umgebungsvariablen "+ _DATABASE_USER " und " _DATABASE_PASSWORD +" gelesen werden können. Es wird als bewährte Methode angesehen, Produktionskennwörter und -geheimnisse außerhalb Ihrer Anwendungscodebasis zu belassen, da sie bei Verwendung eines verteilten Versionskontrollsystems wie Git leicht zugänglich gemacht werden können. Wir werden als nächstes darüber sprechen, wie die Datenbankauthentifizierung mit Umgebungsvariablen eingerichtet wird.

Speichern und schließen.

Installieren Sie das rbenv-vars Plugin

Bevor Sie eine Production Rails-Anwendung bereitstellen, sollten Sie den geheimen Produktionsschlüssel und das Datenbankkennwort mithilfe von Umgebungsvariablen festlegen. Eine einfache Möglichkeit, Umgebungsvariablen zu verwalten, mit denen Passwörter und Geheimnisse zur Laufzeit in unsere Anwendung geladen werden können, ist die Verwendung des Plugins * rbenv-vars *.

Um das Plugin rbenv-vars zu installieren, wechseln Sie einfach in das Verzeichnis + .rbenv / plugins + und klonen es von GitHub. Wenn beispielsweise rbenv in Ihrem Ausgangsverzeichnis installiert ist, führen Sie die folgenden Befehle aus:

cd ~/.rbenv/plugins
git clone https://github.com/sstephenson/rbenv-vars.git

Umgebungsvariablen festlegen

Nachdem das Plugin rbenv-vars installiert ist, richten wir die erforderlichen Umgebungsvariablen ein.

Generieren Sie zunächst den geheimen Schlüssel, mit dem die Integrität signierter Cookies überprüft wird:

cd ~/appname
rake secret

Kopieren Sie den generierten geheimen Schlüssel und öffnen Sie die Datei + .rbenv-vars + mit Ihrem bevorzugten Editor. Wir werden vi verwenden:

vi .rbenv-vars

Alle Umgebungsvariablen, die Sie hier festlegen, können von Ihrer Rails-Anwendung gelesen werden.

Stellen Sie zuerst die Variable + SECRET_KEY_BASE + so ein (ersetzen Sie den hervorgehobenen Text durch das Geheimnis, das Sie gerade erzeugt und kopiert haben):

SECRET_KEY_BASE=

Setzen Sie als nächstes die Variable "+ _DATABASE_USER +" wie folgt (ersetzen Sie das hervorgehobene "APPNAME" durch Ihren Anwendungsnamen und "appname" durch Ihren Benutzernamen für die Produktionsdatenbank):

_DATABASE_USER=

Zuletzt setzen Sie die Variable "+ _DATABASE_PASSWORD +" wie folgt (ersetzen Sie das hervorgehobene "APPNAME" durch Ihren Anwendungsnamen und "prod_db_pass" durch Ihr Benutzerpasswort für die Produktionsdatenbank):

_DATABASE_PASSWORD=

Speichern und schließen.

Sie können mit dem Plugin rbenv-vars anzeigen, welche Umgebungsvariablen für Ihre Anwendung festgelegt sind, indem Sie den folgenden Befehl ausführen:

rbenv vars

Wenn Sie Ihr Geheim- oder Datenbankkennwort ändern, aktualisieren Sie Ihre + .rbenv-vars + - Datei. Achten Sie darauf, diese Datei geheim zu halten, und fügen Sie keine öffentlichen Code-Repositorys hinzu.

Produktionsdatenbank erstellen

Nachdem Ihre Anwendung für die Kommunikation mit Ihrer PostgreSQL-Datenbank konfiguriert wurde, erstellen wir die Produktionsdatenbank:

RAILS_ENV=production rake db:create

Controller generieren

Wenn Sie dem Beispiel folgen, werden wir eine Gerüststeuerung generieren, damit unsere Anwendung etwas zu sehen hat:

rails generate scaffold Task title:string note:text

Führen Sie nun diesen Befehl aus, um die Produktionsdatenbank zu aktualisieren:

RAILS_ENV=production rake db:migrate

Sie sollten die Assets auch vorkompilieren:

RAILS_ENV=production rake assets:precompile

Um zu testen, ob Ihre Anwendung funktioniert, können Sie die Produktionsumgebung ausführen und an die öffentliche IP-Adresse Ihres Servers binden (ersetzen Sie die öffentliche IP-Adresse Ihres Servers):

RAILS_ENV=production rails server --binding=

Besuchen Sie jetzt diese URL in einem Webbrowser:

http://:3000/tasks

Wenn es ordnungsgemäß funktioniert, sollte diese Seite angezeigt werden:

Kehren Sie zu Ihrem Rails-Server zurück und drücken Sie "+ Strg-c +", um die Anwendung zu stoppen.

Installieren Sie Puma

Jetzt können wir Puma installieren.

Eine einfache Möglichkeit, dies zu tun, besteht darin, es der "+ Gemfile +" -Anwendung Ihrer Anwendung hinzuzufügen. Öffnen Sie die Gem-Datei in Ihrem bevorzugten Editor (stellen Sie sicher, dass Sie sich im Stammverzeichnis Ihrer Anwendung befinden):

vi Gemfile

Fügen Sie am Ende der Datei den Puma-Edelstein mit der folgenden Zeile hinzu:

gem 'puma'

Speichern und schließen.

Führen Sie Bundler aus, um Puma und alle ausstehenden Abhängigkeiten zu installieren:

bundle

Puma ist jetzt installiert, aber wir müssen es konfigurieren.

Konfigurieren Sie Puma

Bevor Sie Puma konfigurieren, sollten Sie die Anzahl der CPU-Kerne Ihres Servers ermitteln. Mit diesem Befehl können Sie das ganz einfach tun:

grep -c processor /proc/cpuinfo

Fügen wir nun unsere Puma-Konfiguration zu "+ config / puma.rb +" hinzu. Öffnen Sie die Datei in einem Texteditor:

vi config/puma.rb

Kopieren Sie diese Konfiguration und fügen Sie sie in die Datei ein:

# Change to match your CPU core count
workers

# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app

on_worker_boot do
 require "active_record"
 ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
 ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

Ändern Sie die Anzahl "+ Arbeiter +" in die Anzahl der CPU-Kerne Ihres Servers.

Speichern und schließen. Dadurch wird Puma mit dem Speicherort Ihrer Anwendung und dem Speicherort der Sockets, Protokolle und PIDs konfiguriert. Sie können die Datei jederzeit ändern oder andere erforderliche Optionen hinzufügen.

Erstellen Sie nun die Verzeichnisse, auf die in der Konfigurationsdatei verwiesen wurde:

mkdir -p shared/pids shared/sockets shared/log

Erstellen Sie ein Puma-Upstart-Skript

Erstellen wir ein Upstart-Init-Skript, damit wir Puma problemlos starten und stoppen und sicherstellen können, dass es beim Booten gestartet wird.

Laden Sie das Jungle Upstart-Tool aus dem Puma GitHub-Repository in Ihr Home-Verzeichnis herunter:

cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

Öffnen Sie nun die bereitgestellte Datei "+ puma.conf +", damit wir den Puma-Bereitstellungsbenutzer konfigurieren können:

vi puma.conf

Suchen Sie nach den beiden Zeilen, in denen "+ setuid " und " setgid +" angegeben sind, und ersetzen Sie "apps" durch den Namen Ihres Bereitstellungsbenutzers und Ihrer Bereitstellungsgruppe. Wenn Ihr Bereitstellungsbenutzer beispielsweise "deploy" heißt, sollten die Zeilen folgendermaßen aussehen:

setuid
setgid

Speichern und schließen.

Kopieren Sie nun die Skripte in das Upstart-Services-Verzeichnis:

sudo cp puma.conf puma-manager.conf /etc/init

Das Skript + puma-manager.conf + verweist auf + / etc / puma.conf + für die Anwendungen, die es verwalten soll. Lassen Sie uns diese Inventardatei jetzt erstellen und bearbeiten:

sudo vi /etc/puma.conf

Jede Zeile in dieser Datei sollte der Pfad zu einer Anwendung sein, die von + puma-manager + verwaltet werden soll. Fügen Sie jetzt den Pfad zu Ihrer Anwendung hinzu. Zum Beispiel:

/home//

Speichern und schließen.

Jetzt ist Ihre Anwendung so konfiguriert, dass sie beim Start über Upstart gestartet wird. Dies bedeutet, dass Ihre Anwendung auch nach dem Neustart Ihres Servers gestartet wird.

Starten Sie Puma Applications manuell

Führen Sie den folgenden Befehl aus, um alle verwalteten Puma-Apps jetzt zu starten:

sudo start puma-manager

Sie können eine einzelne Puma-Anwendung auch mithilfe des Upstart-Skripts + puma + wie folgt starten:

sudo start puma app=/home//

Sie können auch "+ stop" und "+ restart" verwenden, um die Anwendung zu steuern:

sudo stop puma-manager
sudo restart puma-manager

Jetzt wird Ihre Rails-Anwendungsproduktionsumgebung unter Puma ausgeführt und überwacht den Socket "+ shared / sockets / puma.sock". Bevor Ihre Anwendung für einen externen Benutzer zugänglich ist, müssen Sie den Nginx-Reverse-Proxy einrichten.

Installieren und konfigurieren Sie Nginx

Installieren Sie Nginx mit apt-get:

sudo apt-get install nginx

Öffnen Sie nun den Standard-Serverblock mit einem Texteditor:

sudo vi /etc/nginx/sites-available/default

Ersetzen Sie den Inhalt der Datei durch den folgenden Codeblock. Stellen Sie sicher, dass Sie die hervorgehobenen Teile durch den entsprechenden Benutzernamen und Anwendungsnamen ersetzen (zwei Speicherorte):

upstream app {
   # Path to Puma SOCK file, as defined previously
   server unix:/home///shared/sockets/puma.sock fail_timeout=0;
}

server {
   listen 80;
   server_name localhost;

   root /home///public;

   try_files $uri/index.html $uri @app;

   location @app {
       proxy_pass http://app;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
   }

   error_page 500 502 503 504 /500.html;
   client_max_body_size 4G;
   keepalive_timeout 10;
}

Speichern und schließen. Dadurch wird Nginx als Reverse-Proxy konfiguriert, sodass HTTP-Anforderungen über einen Unix-Socket an den Puma-Anwendungsserver weitergeleitet werden. Sie können nach Belieben Änderungen vornehmen.

Starten Sie Nginx neu, damit die Änderungen wirksam werden:

sudo service nginx restart

Jetzt können Sie über die öffentliche IP-Adresse oder den vollqualifizierten Domänennamen Ihres Servers auf die Produktionsumgebung Ihrer Rails-Anwendung zugreifen. Besuchen Sie Ihren Anwendungsserver in einem Webbrowser, um auf den zuvor erstellten Aufgabencontroller zuzugreifen:

http:///tasks

Es sollte dieselbe Seite angezeigt werden, die Sie beim ersten Testen Ihrer Anwendung gesehen haben. Jetzt wird sie jedoch über Nginx und Puma bereitgestellt.

Fazit

Herzliche Glückwünsche! Sie haben die Produktionsumgebung Ihrer Ruby on Rails-Anwendung mit Nginx und Puma bereitgestellt.

Wenn Sie die Bereitstellung Ihrer Production Rails-Anwendungen verbessern möchten, lesen Sie unsere Tutorial-Reihe unter https://www.digitalocean.com/community/tutorial_series/how-to-use-capistrano-to-automate-deployments[How To Verwenden Sie Capistrano, um Bereitstellungen zu automatisieren. Die Serie basiert auf CentOS, sollte jedoch weiterhin bei der Automatisierung Ihrer Bereitstellungen hilfreich sein.

Related