Ändern Sie eine Rails-Anwendung in die Produktion

190

Wie kann ich meine Rails-Anwendung so ändern, dass sie im Produktionsmodus ausgeführt wird? Gibt es dafür eine Konfigurationsdatei, beispielsweise environment.rb?

Adler Medrado
quelle
2
Es scheint, dass die zweite Antwort viel mehr Stimmen hat. Würden Sie bereit sein, dies kurz zu überprüfen und die zweite Antwort zu akzeptieren, es sei denn, Sie haben ein Problem damit? Hilft nur zukünftigen Besuchern. Thx :)
Evolve

Antworten:

73

So richten Sie eine Rails 4-App im Produktionsmodus (Schritt für Schritt) mit Apache und Phusion Passenger ein und führen sie aus:

Normalerweise können Sie Ihr Rails-Projekt eingeben rails sund eine Entwicklungsversion Ihrer App unter http://something.com:3000 herunterladen . Der Produktionsmodus ist etwas schwieriger zu konfigurieren.

Ich habe eine Weile damit rumgespielt, also dachte ich mir, ich würde das für die Neulinge (wie mich selbst) aufschreiben. Es gibt ein paar kleine Änderungen, die im Internet verbreitet sind und die möglicherweise einfacher sind.

  1. In diesem Handbuch finden Sie Informationen zur Kernkonfiguration des Servers (CentOS 6, sollte jedoch für fast alle Linux-Versionen gelten): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-mit-Apache-und-Passagier-auf-Centos-6

  2. Stellen Sie unbedingt sicher, dass Sie die /etc/httpd/conf/httpd.confDatei nach dem Einrichten von Passenger so bearbeitet haben , dass sie Ihrer Verzeichnisstruktur entspricht. Sie möchten DocumentRoot auf Ihr Rails-Projekt / Ihren öffentlichen Ordner verweisen. Überall in der httpd.confDatei, die diese Art von Verzeichnis hat: /var/www/html/your_application/publicmuss aktualisiert werden, sonst wird alles sehr frustrierend. Ich kann das nicht genug betonen.

  3. Starten Sie den Server neu (oder zumindest Apache - service httpd restart)

  4. Geben Sie Ihren Rails-Projektordner ein /var/www/html/your_applicationund starten Sie die Migration mit rake db:migrate. Stellen Sie sicher, dass eine Datenbanktabelle vorhanden ist, auch wenn Sie später Tabellen hinzufügen möchten (dies ist auch Teil von Schritt 1).

  5. RAILS_ENV=production rake secret- Dadurch wird ein secret_key erstellt, den Sie hinzufügen können config/secrets.yml. Sie können dies kopieren / in config / secret.yml einfügen, um die Dinge zum Laufen zu bringen, obwohl ich empfehlen würde, dies nicht zu tun. Persönlich mache ich diesen Schritt, um sicherzustellen, dass alles andere funktioniert, ändere es dann zurück und beziehe es später.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompilewenn Sie statische Assets bereitstellen. Dadurch werden JS-, CSS- und Bilddateien in den /publicOrdner verschoben .

  8. RAILS_ENV=production rails s

An dieser Stelle Ihre App sollte verfügbar sein http://something.com/whateverstatt :3000. Wenn nicht, passenger-memory-statsund sehen Sie, ob es einen Eintrag wie908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Ich habe wahrscheinlich etwas Abscheuliches verpasst, aber das hat in der Vergangenheit für mich funktioniert.

Etusm
quelle
2
Ich bin der Meinung, dass diese Antwort in die Stackoverflow-Dokumentation migriert werden sollte.
Whitecat
Ich würde hinzufügen, dass, wenn Sie keinen Webinhalt verwenden möchten, der wie Apache geliefert wird, Sie ein RAILS_SERVE_STATIC_FILES = 1 neben der RAILS_ENV = -Produktion hinzufügen könnten. Dies würde bedeuten, dass Rails jede Datei bedienen würden, daher wird dies für a nicht empfohlen realer Produktionszustand ...
3d0
351

Das wäre jetzt

rails server -e production

Oder kompakter

rails s -e production

Es funktioniert für Rails 3+ Projekte.

BandsOnABudget
quelle
33
oder die Kurzversionrails s -e production
Pavel Nikolov
2
Was ist mit Cloud-Diensten wie Heroku? Wie läuft man server -e productionauf ihnen?
Grün
Cloud-Dienste verfügen normalerweise über Optionen zum Festlegen der Umgebung, sind jedoch productionimmer die Standardeinstellung.
James Billingham
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Sehr bevorzugte Antwort, diese sollte es in die StackOverflow-Dokumentation schaffen.
Dmanexe
61

Wenn Sie auf Passenger ausgeführt werden , wird standardmäßig in der Produktion in Ihrem Apache conf ausgeführt:

<VirtualHost *:80>
  ServerName application_name.rails.local
  DocumentRoot "/Users/rails/application_name/public"
  RailsEnv production ## This is the default
</VirtualHost>

Wenn Sie nur einen lokalen Server mit Mischling oder Webrick betreiben, können Sie Folgendes tun:

./script/server -e production

oder in Bash:

RAILS_ENV=production ./script/server

Das Überschreiben der RAILS_ENV-Konstante in enviornment.rb sollte wahrscheinlich Ihr letzter Ausweg sein, da es wahrscheinlich nicht gesetzt bleiben wird (siehe eine andere Antwort, die ich darauf gegeben habe).

Dan McNevin
quelle
54

Wenn der Vorschlag von mipadi nicht funktioniert, fügen Sie ihn zu config / environment.rb hinzu

# force Rails into production mode when                          
# you don't control web/app server and can't set it the proper way                  
ENV['RAILS_ENV'] ||= 'production'
Pete
quelle
Was ist mit Cloud-Diensten wie Heroku? Kann ENV['RAILS_ENV'] ||= 'production'auf sie auch angewendet werden?
Grün
Ich habe diese Datei vor langer Zeit bearbeitet und vergessen .. danke für die Erinnerung .. viel Zeit gespart
Agnes
19

Ändern Sie die Umgebungsvariable RAILS_ENVin production.

Mipadi
quelle
3
Wo befindet sich die Umgebungsvariable?
BKSpurgeon
kann sich in ~/.bashrcoder ~/.bash_profileoder einfach befindenexport RAILS_ENV=production"
Shimaa Marzouk
19
$> export RAILS_ENV=production
Entwickeln
quelle
18

Sie können die Umgebung auch an script / server übergeben:

$ script/server -e production
foz
quelle
12
rails s -e production

Dadurch wird der Server mit RAILS_ENV= ausgeführt 'production'.

Abgesehen davon müssen Sie den Assets-Pfad festlegen production.rb

config.serve_static_assets = true

Ohne dies wird Ihr Vermögen nicht geladen.

Prasanna
quelle
Tut mir leid ... ich habe abgewählt, wenn ich abstimmen wollte. Leichte Bearbeitung vorgenommen, um Fehler und Upvote zu korrigieren.
Tomd
7
RAILS_ENV=production rails s

ODER

rails s -e production

Standardmäßig ist die Umgebung die Entwicklung.

puneet18
quelle
5

Wie andere gepostet haben: rails server -e production

Oder mein persönlicher Favorit: RAILS_ENV=production rails s

alex1sz
quelle
2

In Schienen 3

Hinzufügen Rails.env = ActiveSupport::StringInquirer.new('production')in die application.rb und rails sfunktioniert genauso wierails server -e production

module BlacklistAdmin
  class Application < Rails::Application

    config.encoding = "utf-8"
    Rails.env = ActiveSupport::StringInquirer.new('production')

    config.filter_parameters += [:password]
  end
end
RSK
quelle
2

Es ist keine gute Möglichkeit, den Rails-Server in einer Produktionsumgebung durch "Rails-Server -e-Produktion" auszuführen, da Rails dann als Single-Thread-Anwendung ausgeführt wird und jeweils nur auf eine HTTP-Anforderung antworten kann.

Der beste Artikel über die Produktionsumgebung für Schienen ist Produktionsumgebungen - Schienen 3

Evgeny Liskovets
quelle
3
Link rot ... verfügbar auf Wayback-Maschine: Link
Rosuav
1

für Standardserver: Schienen s-e Produktion

für Kostüm-Server-Port: Schienen s -p [Port] -e Produktion, z. Schienen s -p 3002 -e Produktion

user3786185
quelle
1

Standardmäßig läuft der Server in der Entwicklungsumgebung: $ rails s

Wenn Sie in einer Produktionsumgebung arbeiten: $ rails s -e productionoder$ RAILS_ENV=production rails s

Pankaj Dhote
quelle
0

Bitte stellen Sie sicher, dass Sie dies unten in Ihrer Datei environment.rb getan haben.

ENV ['RAILS_ENV'] || = 'Produktion'

Wenn Ihre Anwendung in einer gemeinsam genutzten Hosting-Umgebung oder einem Phushion-Passagier ausgeführt wird, müssen Sie möglicherweise Änderungen in .httaccess (im öffentlichen Ordner) vornehmen und den Modus als Produktion festlegen.

Rakesh
quelle