Zmień aplikację Rails na produkcyjną

190

Jak mogę zmienić aplikację Rails, aby działała w trybie produkcyjnym? Czy istnieje plik konfiguracyjny, na przykład environment.rb, aby to zrobić?

Adler Medrado
źródło
2
Wygląda na to, że druga odpowiedź ma o wiele więcej głosów, czy zechciałbyś szybko ją przejrzeć i zaakceptować drugą odpowiedź, chyba że masz z tym jakiś problem. Pomoże tylko przyszłym użytkownikom. Dzięki :)
Evolve

Odpowiedzi:

73

Jak skonfigurować i uruchomić aplikację Rails 4 w trybie produkcyjnym (krok po kroku) za pomocą Apache i Phusion Passenger:

Zwykle możesz wziąć udział w projekcie Rails rails si uzyskać wersję programistyczną swojej aplikacji pod adresem http://something.com:3000 . Tryb produkcji jest nieco trudniejszy do skonfigurowania.

Przez jakiś czas się z tym bawiłem, więc pomyślałem, że napiszę to dla początkujących (takich jak ja). Istnieje kilka drobnych poprawek, które są rozpowszechniane w Internecie i uznałem, że może to być łatwiejsze.

  1. Zapoznaj się z tym przewodnikiem, aby uzyskać informacje na temat podstawowej konfiguracji serwera (CentOS 6, ale powinno ono dotyczyć prawie wszystkich wersji Linuksa): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-with-apache-and -senger-on-centos-6

  2. Upewnij się, że po skonfigurowaniu programu Passenger dokonałeś edycji /etc/httpd/conf/httpd.confpliku, aby odzwierciedlić strukturę katalogu. Chcesz skierować DocumentRoot do swojego projektu / folderu publicznego w Railsach Dowolne miejsce w httpd.confpliku, w którym znajduje się ten katalog : /var/www/html/your_application/publicwymaga aktualizacji lub wszystko stanie się bardzo frustrujące. Nie mogę tego wystarczająco podkreślić.

  3. Uruchom ponownie serwer (lub przynajmniej Apache - service httpd restart)

  4. Wprowadź folder projektu Rails /var/www/html/your_applicationi rozpocznij migrację za pomocą rake db:migrate. Upewnij się, że tabela bazy danych istnieje, nawet jeśli planujesz później dodać tabele (jest to również część kroku 1).

  5. RAILS_ENV=production rake secret- stworzy to tajny klucz, do którego możesz dodać config/secrets.yml. Państwo może skopiować / wkleić do config / secrets.yml przez wzgląd na coraz wszystko działa, chociaż ja polecam nie rób tego. Osobiście robię ten krok, aby upewnić się, że wszystko inne działa, a następnie zmieniam go z powrotem i pozyskuję później.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompilejeśli obsługujesz zasoby statyczne. Spowoduje to wypchnięcie plików js, css, obrazów do /publicfolderu.

  8. RAILS_ENV=production rails s

W tym momencie Twoja aplikacja powinna być dostępna pod adresem http://something.com/whateverzamiast :3000. Jeśli nie, passenger-memory-statsi sprawdź, czy jest taki wpis908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Prawdopodobnie przeoczyłem coś ohydnego, ale to działało dla mnie w przeszłości.

etusm
źródło
2
Wydaje mi się, że tę odpowiedź należy przenieść do dokumentacji stosu przepływu.
Whitecat
Dodałbym, że jeśli nie chcesz używać dostarczania treści WWW jak apache, możesz dodać RAILS_SERVE_STATIC_FILES = 1 obok produkcji RAILS_ENV =, co oznacza, że ​​szyny będą obsługiwały każdy plik, więc nie polecam tego dla stan rzeczywistej produkcji ...
3d0
351

To byłoby teraz

rails server -e production

Lub bardziej kompaktowy

rails s -e production

Działa dla projektów szyn 3+.

BandsOnABudget
źródło
33
lub krótka wersjarails s -e production
Pavel Nikolov
2
Co z usługami w chmurze, takimi jak Heroku? Jak server -e productionna nich biegać ?
Zielony
Usługi w chmurze zazwyczaj mają opcje określania środowiska, ale w nich productionniezmiennie jest to ustawienie domyślne.
James Billingham
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Bardzo preferowana odpowiedź, ta powinna znaleźć się w dokumentacji StackOverflow.
dmanexe
61

Jeśli korzystasz z Passenger , domyślnie jest uruchamiany w trybie produkcyjnym, w conf apache:

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

Jeśli prowadzisz tylko lokalny serwer z kundlem lub webrick, możesz:

./script/server -e production

lub bash:

RAILS_ENV=production ./script/server

w rzeczywistości przesłanianie stałej RAILS_ENV w enviornment.rb powinno być prawdopodobnie ostatnią deską ratunku, ponieważ prawdopodobnie nie pozostanie ustawione (patrz inna odpowiedź, którą udzieliłem na ten temat)

Dan McNevin
źródło
54

Jeśli sugestia mipadi nie działa, dodaj to do config / environment.rb

# 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
źródło
Co z usługami w chmurze, takimi jak Heroku? Czy ENV['RAILS_ENV'] ||= 'production'można je również zastosować?
Zielony
I edycja tego pliku dawno temu i zapomniałem .. dzięki za przypomnienie .. zapisany dużo czasu
Agnes
19

Zmień zmienną środowiskową RAILS_ENVna production.

mipadi
źródło
3
gdzie znajduje się zmienna środowiskowa?
BKSpurgeon
może znajdować się w ~/.bashrclub ~/.bash_profilepo prostuexport RAILS_ENV=production"
Shimaa Marzouk
19
$> export RAILS_ENV=production
Ewoluować
źródło
18

Możesz także przekazać środowisko do skryptu / serwera:

$ script/server -e production
Foz
źródło
12
rails s -e production

Spowoduje to uruchomienie serwera za pomocą RAILS_ENV= 'production'.

Oprócz tego musisz ustawić ścieżkę zasobów production.rb

config.serve_static_assets = true

Bez tego Twoje zasoby nie zostaną załadowane.

Prasanna
źródło
Przepraszam ... głosowałem za odrzuceniem, gdy chciałem głosować. Dokonano niewielkiej edycji w celu poprawienia błędu i opinii.
tomd
7
RAILS_ENV=production rails s

LUB

rails s -e production

Domyślnie środowisko to rozwój.

puneet18
źródło
5

Jak napisali inni: rails server -e production

Albo moja osobista ulubiona: RAILS_ENV=production rails s

alex1sz
źródło
2

W szynach 3

Dodanie Rails.env = ActiveSupport::StringInquirer.new('production')do application.rb i rails sbędzie działać tak samo jakrails 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
źródło
2

Nie jest to dobry sposób na uruchomienie serwera Railsowego w środowisku produkcyjnym przez „produkcję serwera Railsowego -e”, ponieważ wtedy Railsy działają jako aplikacja jednowątkowa i mogą odpowiadać tylko na jedno żądanie HTTP na raz.

Najlepszy artykuł na temat środowiska produkcyjnego dla szyn to Środowiska produkcyjne - Rails 3

Jewgienij Łiskowiec
źródło
3
Link rot ... dostępny na maszynie powrotnej: link
rosuav
1

dla domyślnego serwera: produkcja szyn s -e

dla portu serwera costum: szyny s -p [port] -e produkcja, np. produkcja szyn s -p 3002 -e

użytkownik3786185
źródło
1

Domyślnie serwer działa w środowisku programistycznym: $ rails s

Jeśli pracujesz w środowisku produkcyjnym: $ rails s -e productionlub$ RAILS_ENV=production rails s

Pankaj Dhote
źródło
0

Upewnij się, że zrobiłeś poniżej w pliku environment.rb.

ENV [„RAILS_ENV”] || = „produkcja”

Jeśli aplikacja działa w środowisku hostingu współdzielonego lub pasażera phushion, może być konieczne wprowadzenie zmian w pliku .httaccess (w folderze publicznym) i ustawienie trybu jako produkcyjnego.

Rakesh
źródło