I have Rails3, Phusion passenger 3 and apache.
I have fairly simple app with one controller and one view to print hello world.
if remove this line from the vhost "RailsEnv development" i got http 500 error as follow
"500 Internal Server Error".
And if i put back the line "RailsEnv development" the app works fine.
Is there something about passenger that needs to be set for production to work?
I simply need to test whether my new passenger install will work in production mode.
Below are relevant configurations.
[usertest#test-server web_app1]$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606)
[usertest#test-server web_app1]$ which ruby
/usr/local/bin/ruby
[usertest#test-server web_app1]$ cat /etc/apache/conf.d/passenger.conf
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger- 3.0.18/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18
PassengerRuby /usr/local/bin/ruby
<VirtualHost *:80>
ServerName siteexample.com
DocumentRoot /var/www/mysites/apps/web_app1/public
RailsEnv development
<Directory /var/www/mysites/apps/web_app1/public>
AllowOverride all
Allow from all
Options -MultiViews
Options FollowSymLinks
</Directory>
</VirtualHost>
In order to deploy to a production server with Phusion Passenger you need to use the RailsEnv production directive as you have.
But you also need to ensure that the associated Rails environment is configured correctly. These files are stored in apps/config/environments/ and a new Rails project comes with 3: development (the default), test, and production. You can add others, for example staging by adding files to this directory.
Each file has a number of settings that make sense for the environment. In development, you want nice verbose logging, plain-text CSS and JS files, and errors to show up in the browser. In production, you want everything to be as fast as possible: terse logging, compiled assets, user-friendly error pages.
In your case, the assets used by Rails (notably all of the CSS and JS files) have not yet been processed by the Rails "asset pipeline". There's a rake task for precompiling assets (rake assets:precompile) which is what the default production environment expects. The default development environment compiles CoffeeScript and SASS files to JS and CSS respectively on the fly, and does minimal processing otherwise.
So as part of deploying to production, you'll need to run this rake task any time you add or make a change to any assets. Because this and numerous other similar details are required every time you deploy, there's a great gem called Capistrano, which most Rails apps use for deployment. It's a whole other beast, to be sure, but as you get further along the process, you'll definitely want to consider it. Even a minimally configured capistrano script would know to precompile assets and restart the server when it's done, etc.
Try setting RailsEnv production
Restart Apache and then restart Passenger with touch /var/www/mysistes/apps/web_app1/tmp/restart.txt
In the documentation of rails (3.2.3) it says
In development mode (which is what you’re working in by default), Rails reloads your application with every browser request, so there’s no need to stop and restart the web server.
But clearly my app loads in production mode out of the box.(I can type Rails.env and see it).
Why?
I then go to environment.rb and add
ENV["RAILS_ENV"] = "development"
and still it is in production.
Any idea?
Edit : Here you go
#Load the rails application
require File.expand_path('../application', __FILE__)
# Initialize the rails application
MyAppName::Application.initialize!
ENV["RAILS_ENV"] = "development"
Possible solution for your situation could be:
rails server -e development
Though this is not a solution try to start the Rails server this way:
RAILS_ENV=development bundle exec rails s
What do you see if put <%= Rails.env %> somewhere in you layout file?
If you are using Phusion Passenger, then add the following to your virtual host configuration file:
RailsEnv development
In other words, on my system, you would vim /etc/apache2/sites-available/[name of app] so that it looks like the following:
<VirtualHost *>
ServerName example.com
DocumentRoot /home/yourname/htdocs/example.com/public
RailsEnv development
</VirtualHost>
You would then need to restart the web server:
sudo /etc/init.d/apache2 reload
Credit goes to: http://my.opera.com/williamn/blog/2009/03/03/how-to-make-phusion-passenger-run-in-development-mode
I have a shared server running passenger to server my Rails app. For some reason my RAILS_ENV variable seems to be stuck as 'Development'. How do I set it to 'Production'? Thanks
In a shared hosting environment, you will want to do this in a .htaccess file, placed inside public/. Mine looks like this:
PassengerEnabled on
PassengerAppRoot /home/myuser/myapp/current
RailsEnv production
Using Apache2 (2.2.12) / Passenger (2.2.9)..
Have 2 apps running.. One runs fine in production mode the other insists on being in development mode.
Have booted mongrel into production mode and the app works fine.. (script/server -e production)
Tried the following with no result...
Forced the RailsEnv in the apache virtual host.
Forced the RailsEnv in the passenger.conf in /etc/apache2/mods-available
=> Although production is the default mode I cannot get it to use production
I suspect the issue is somewhere between apache / passenger (and not in the rails app)
Any ideas? or suggestions
This is probably because you have a config.ru file in your RAILS_ROOT which means that Passenger is running your Rails application as a Rack application, which means that you need to set RackEnv and not RailsEnv in your apache configuration.
Thanks Jason.. set me on the right track.. Actually had to remove the config.ru to get it working.. Think the issue had to do with the passenger version, since I have it working with the config.ru on other servers (only diff is the passenger version)
How can I change my Rails application to run in production mode? Is there a config file, environment.rb for example, to do that?
This would now be
rails server -e production
Or, more compact
rails s -e production
It works for rails 3+ projects.
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 the httpd.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 with rake 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 to config/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.
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)
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'
Change the environment variable RAILS_ENV to production.
$> export RAILS_ENV=production
You can also pass the environment to script/server:
$ script/server -e production
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.
RAILS_ENV=production rails s
OR
rails s -e production
By default environment is developement.
As others have posted: rails server -e production
Or, my personal fave: RAILS_ENV=production rails s
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
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 Production Environments - Rails 3
for default server : rails s -e production
for costum server port : rails s -p [port] -e production, eg. rails s -p 3002 -e production
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
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.