Change a Rails application to production
Ruby on-RailsDevelopment EnvironmentProduction EnvironmentRuby on-Rails Problem Overview
How can I change my Rails application to run in production mode? Is there a config file, environment.rb for example, to do that?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
This would now be
rails server -e production
Or, more compact
rails s -e production
It works for rails 3+ projects.
Solution 2 - Ruby on-Rails
How to setup and run a Rails 4 app in Production mode (step-by-step) using Apache and Phusion Passenger:
Normally you would be able to enter your Rails project, rails s
, and get a development version of your app at http://something.com:3000. Production mode is a little trickier to configure.
I've been messing around with this for a while, so I figured I'd write this up for the newbies (such as myself). There are a few little tweaks which are spread throughout the internet and figured this might be easier.
-
Refer to this guide for core setup of the server (CentOS 6, but it should apply to nearly all Linux flavors): https://www.digitalocean.com/community/tutorials/how-to-setup-a-rails-4-app-with-apache-and-passenger-on-centos-6
-
Make absolute certain that after Passenger is set up you've edited the
/etc/httpd/conf/httpd.conf
file to reflect your directory structure. You want to point DocumentRoot to your Rails project /public folder Anywhere in thehttpd.conf
file that has this sort of dir:/var/www/html/your_application/public
needs to be updated or everything will get very frustrating. I cannot stress this enough. -
Reboot the server (or Apache at the very least -
service httpd restart
) -
Enter your Rails project folder
/var/www/html/your_application
and start the migration withrake db:migrate
. Make certain that a database table exists, even if you plan on adding tables later (this is also part of step 1). -
RAILS_ENV=production rake secret
- this will create a secret_key that you can add toconfig/secrets.yml
. You can copy/paste this into config/secrets.yml for the sake of getting things running, although I'd recommend you don't do this. Personally, I do this step to make sure everything else is working, then change it back and source it later. -
RAILS_ENV=production rake db:migrate
-
RAILS_ENV=production rake assets:precompile
if you are serving static assets. This will push js, css, image files into the/public
folder. -
RAILS_ENV=production rails s
At this point your app should be available at http://something.com/whatever
instead of :3000
. If not, passenger-memory-stats
and see if there an entry like 908 469.7 MB 90.9 MB Passenger RackApp: /var/www/html/projectname
I've probably missed something heinous, but this has worked for me in the past.
Solution 3 - Ruby on-Rails
If you're running on Passenger, then the default is to run in production, in your apache conf:
<VirtualHost *:80>
ServerName application_name.rails.local
DocumentRoot "/Users/rails/application_name/public"
RailsEnv production ## This is the default
</VirtualHost>
If you're just running a local server with mongrel or webrick, you can do:
./script/server -e production
or in bash:
RAILS_ENV=production ./script/server
actually overriding the RAILS_ENV constant in the enviornment.rb should probably be your last resort, as it's probably not going to stay set (see another answer I gave on that)
Solution 4 - Ruby on-Rails
If mipadi's suggestion doesn't work, add this to 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'
Solution 5 - Ruby on-Rails
Change the environment variable RAILS_ENV
to production
.
Solution 6 - Ruby on-Rails
$> export RAILS_ENV=production
Solution 7 - Ruby on-Rails
You can also pass the environment to script/server:
$ script/server -e production
Solution 8 - Ruby on-Rails
rails s -e production
This will run the server with RAILS_ENV
= 'production'
.
Apart from this you have to set the assets path in production.rb
config.serve_static_assets = true
Without this your assets will not be loaded.
Solution 9 - Ruby on-Rails
RAILS_ENV=production rails s
OR
rails s -e production
By default environment is developement.
Solution 10 - Ruby on-Rails
As others have posted: rails server -e production
Or, my personal fave: RAILS_ENV=production
rails s
Solution 11 - Ruby on-Rails
In Rails 3
Adding Rails.env = ActiveSupport::StringInquirer.new('production')
into the application.rb and rails s
will work same as 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
Solution 12 - Ruby on-Rails
It is not a good way to run rails server in production environment by "rails server -e production", because then rails runs as a single-threaded application, and can only respond to one HTTP request at a time.
The best article about production environment for rails is http://ofps.oreilly.com/titles/9780596521424/production_id35801033.html" title="Production Environments - Rails 3 in a Nutshell - OFPS - O'Reilly Media">Production Environments - Rails 3
Solution 13 - Ruby on-Rails
for default server : rails s -e production
for costum server port : rails s -p [port] -e production, eg. rails s -p 3002 -e production
Solution 14 - Ruby on-Rails
By default server runs on development environment: $ rails s
If you're running on production environment: $ rails s -e production
or $ RAILS_ENV=production rails s
Solution 15 - Ruby on-Rails
Please make sure you have done below in your environment.rb file.
> ENV['RAILS_ENV'] ||= 'production'
If you application runs in shared hosting environment or phushion passenger, you might need to need make changes in .httaccess (inside public folder) and set mode as production.