Измените приложение Rails на производство

190

Как я могу изменить приложение Rails для работы в производственном режиме? Есть ли для этого файл конфигурации, например environment.rb?

Адлер Медрадо
источник
2
Похоже, что у второго ответа гораздо больше голосов, вы бы хотели быстро его просмотреть и принять второй ответ, если у вас нет с ним проблем. Поможет будущим посетителям. Спасибо :)
Эволюция

Ответы:

73

Как настроить и запустить приложение Rails 4 в рабочем режиме (пошагово) с использованием Apache и Phusion Passenger:

Обычно вы можете войти в свой проект Rails rails sи получить версию своего приложения для разработки по адресу http://something.com:3000 . Режим производства немного сложнее в настройке.

Я возился с этим некоторое время, поэтому я решил написать это новичкам (таким как я). Есть несколько небольших твиков, которые распространены по всему интернету и полагают, что это может быть проще.

  1. Обратитесь к этому руководству для настройки ядра сервера (CentOS 6, но оно должно применяться почти ко всем разновидностям Linux): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4 -app-с-апаш-пассажирские-на-CentOS-6

  2. Убедитесь, что после установки Passenger вы отредактировали /etc/httpd/conf/httpd.confфайл, чтобы он отражал структуру каталогов. Вы хотите указать DocumentRoot на ваш проект / общую папку Rails. В любом месте httpd.confфайла, который имеет этот тип dir: /var/www/html/your_application/publicнеобходимо обновить, иначе все будет очень неприятно. Я не могу подчеркнуть это достаточно.

  3. Перезагрузите сервер (или Apache по крайней мере - service httpd restart)

  4. Войдите в папку проекта Rails /var/www/html/your_applicationи начните миграцию сrake db:migrate . Убедитесь, что таблица базы данных существует, даже если вы планируете добавить таблицы позже (это также является частью шага 1).

  5. RAILS_ENV=production rake secret- это создаст секретный ключ, к которому вы можете добавить config/secrets.yml. Вы можете скопировать / вставить это в config / secrets.yml ради запуска, хотя я бы порекомендовал вам этого не делать. Лично я делаю этот шаг, чтобы убедиться, что все остальное работает, затем меняю его обратно и получаю позже.

  6. RAILS_ENV=production rake db:migrate

  7. RAILS_ENV=production rake assets:precompileесли вы обслуживаете статические активы. Это поместит файлы js, css, image в /publicпапку.

  8. RAILS_ENV=production rails s

На этом этапе ваше приложение должно быть доступно http://something.com/whateverвместо :3000. Если нет, passenger-memory-statsи посмотрите, есть ли такая запись908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname

Я, наверное, пропустил что-то отвратительное, но это работало для меня в прошлом.

etusm
источник
2
Я чувствую, что этот ответ должен быть перенесен в документацию stackoverflow.
Whitecat
Я хотел бы добавить, что если вы не хотите использовать доставку веб-контента, как apache, вы можете добавить RAILS_SERVE_STATIC_FILES = 1 рядом с продукцией RAILS_ENV =, это будет означать, что rails будет обслуживать каждый файл, поэтому не буду рекомендовать это для состояние реального производства ...
3d0
351

Это было бы сейчас

rails server -e production

Или более компактный

rails s -e production

Это работает для рельсов 3+ проектов.

BandsOnABudget
источник
33
или короткая версияrails s -e production
Павел Николов
2
А как насчет облачных сервисов, таких как Heroku? Как server -e productionна них бегать ?
Зеленый,
Облачные сервисы обычно имеют опции для указания среды, но в них productionэто всегда значение по умолчанию.
Джеймс Биллингем
2
echo "export RAILS_ENV=production" >> ~/.bash_profile
Meekohi
Намного предпочтительный ответ, этот должен сделать это к документации StackOverflow.
dmanexe
61

Если вы работаете в Passenger , то по умолчанию это запуск в производственной среде в вашем apache conf:

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

Если вы просто используете локальный сервер с помощью mongrel или webrick, вы можете сделать:

./script/server -e production

или в bash:

RAILS_ENV=production ./script/server

фактически переопределение константы RAILS_ENV в enviornment.rb, вероятно, должно быть вашим последним средством, поскольку, вероятно, оно не останется установленным (см. другой ответ, который я дал на это)

Дэн МакНевин
источник
54

Если предложение mipadi не работает, добавьте его в 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'
Пит
источник
А как насчет облачных сервисов, таких как Heroku? Может ENV['RAILS_ENV'] ||= 'production'быть применен к ним тоже?
Зеленый,
Я давно отредактировал этот файл и забыл .. спасибо за напоминание .. сэкономил много времени
Агнес
19

Измените переменную среды RAILS_ENVна production.

mipadi
источник
3
где находится переменная окружения?
BKSpurgeon
может быть расположен в ~/.bashrcили ~/.bash_profileили простоexport RAILS_ENV=production"
Shimaa Marzouk
18

Вы также можете передать среду в скрипт / сервер:

$ script/server -e production
Фос
источник
12
rails s -e production

Это запустит сервер с RAILS_ENV= 'production'.

Помимо этого вы должны установить путь активов в production.rb

config.serve_static_assets = true

Без этого ваши активы не будут загружены.

Prasanna
источник
Извините ... проголосовали против, когда намеревались поднять голос. Сделано небольшое редактирование, чтобы исправить ошибку и повысить голосование.
Том
7
RAILS_ENV=production rails s

ИЛИ

rails s -e production

По умолчанию среда разработки.

puneet18
источник
5

Как и другие опубликовали: rails server -e production

Или мой личный любимый: RAILS_ENV=production rails s

alex1sz
источник
2

В Rails 3

Добавление Rails.env = ActiveSupport::StringInquirer.new('production')в application.rb и rails sбудет работать так же, какrails 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
источник
2

Это не хороший способ запустить сервер rails в рабочей среде с помощью «rails server -e production», потому что тогда rails запускается как однопоточное приложение и может отвечать только на один HTTP-запрос за раз.

Лучшая статья о производственной среде для рельсов - Рабочая среда - Рельсы 3

Евгений Лисковец
источник
3
Ссылка гниль ... доступна на обратном пути, хотя: ссылка
rosuav
1

для сервера по умолчанию: rails s -e production

для порта сервера costum: rails s -p [port] -e production, например. рельсы s -p 3002 -e производства

user3786185
источник
1

По умолчанию сервер работает в среде разработки: $ rails s

Если вы работаете в производственной среде: $ rails s -e production или$ RAILS_ENV=production rails s

Панкадж Дхоте
источник
0

Пожалуйста, убедитесь, что вы сделали ниже в вашем файле environment.rb.

ENV ['RAILS_ENV'] || = 'производство'

Если ваше приложение работает в среде общего хостинга или в Phushion-пассажире, вам может потребоваться внести изменения в .httaccess (в общей папке) и установить режим работы.

Ракеш
источник