Nov 7, 2009

Install Ruby on Rails on Ubuntu Karmic Koala 9.10

If you're running Ubuntu 9.10 and want to install Ruby on Rails I've put together a quick tutorial for you. Not tremendously much has changed since the last tutorial for Jaunty Jackalope. Unicorn is out and while I think it's nifty, I'm going to wait a little while before playing with it. For now my money is still on Phusion Passenger as being the right tool for the job. If all that seems fine, let's get to the details.




Step 1: As usual, the first thing we'll want to do is make sure your version of Ubuntu is up to date.:
sudo apt-get update
sudo apt-get dist-upgrade


If you see this warning it means we have a little more work to do.

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").


Let's go ahead and set your locale now. (I'm using en-US in this example.. feel free to substitute for your region)

sudo locale-gen en_US.UTF-8
sudo /usr/sbin/update-locale LANG=en_US.UTF-8


Step 2: We'll be installing some software that needs to be built so we'll need to get packages required for compiling. With Ubuntu, you can type this single command and get everything you need:
sudo apt-get install build-essential


Step 3: Once you've got the tools, it's time to install MySQL and Ruby. If you're using SQLite you may not need all this stuff. Otherwise, just copy and paste this command into your terminal if you're in a hurry. As of Karmic Koala, we're using MySQL 5.1:
sudo apt-get install ruby ri rdoc mysql-server libmysql-ruby ruby1.8-dev irb1.8 libdbd-mysql-perl libdbi-perl libmysql-ruby1.8 libmysqlclient15off libnet-daemon-perl libplrpc-perl libreadline-ruby1.8 libruby1.8 mysql-client-5.1 mysql-common mysql-server-5.1 rdoc1.8 ri1.8 ruby1.8 irb libopenssl-ruby libopenssl-ruby1.8 libhtml-template-perl mysql-server-core-5.1 libmysqlclient16 libreadline5 psmisc

If you hadn't previously installed MySQL you'll be asked to set a root password. You don't have to, of course (it will bug you no fewer than 3 times if you opt not to) but I strongly recommend it. You'll need this password when you populate your rails config/database.yml file so be sure not to forget it.

Step 4: Grab the latest ruby gems and install them. As always be sure to check rubyforge.org to make sure you're grabbing the latest one. As of this writing it's 1.3.5 but it never hurts to confirm.
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
tar xvzf rubygems-1.3.5.tgz
cd rubygems-1.3.5
sudo ruby setup.rb

Once it's done you can remove the .tgz file and erase the rubygems-1.3.5 directory too.

Step 5: On the command line, type gem -v. if you get this message we need to make some symlinks:

The program 'gem' can be found in the following packages:
* rubygems1.8
* rubygems1.9
Try: sudo apt-get install
-bash: gem: command not found

Let's create those symlinks now:

sudo ln -s /usr/bin/gem1.8 /usr/local/bin/gem
sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby
sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc
sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri
sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb



Step 6: Install Ruby on Rails! You can leave off the --no-rdoc and --no-ri switches if you're on a machine with plenty of ram. But just in case you've got a more modest setup (say 256MB or less) I'd just use the following:
sudo gem install rails --no-rdoc --no-ri


If you're just doing local development then you are basically done. You may want to install additional gems. If you want to deploy Ruby on Rails onto a server then it's time to setup Nginx and Phusion.

Step 7: As I mentioned earlier, Unicorn may be the new hotness but I'm going to wait a while before I put my customers on that stack. The folks responsible for Phusion Passenger(Hongli Lai & Ninh Bui) are incredibly smart and I think they'll look at Unicorn and make some improvements to Phusion to eek out even more performance. The short of it is that I'm still a big believer in Phusion so I'm going to install it for production and recommend that you do too:

sudo apt-get install libc6 libpcre3 libpcre3-dev libpcrecpp0 libssl0.9.8 libssl-dev zlib1g zlib1g-dev lsb-base



Step 8: We're going to create a directory for your application. In anticipation of Capistrano, let's put it in /var/www/myapp/current. Swap out the myapp with anything you like.
sudo mkdir -p /var/www/myapp/current

If you've got an existing Rails application, it doesn't hurt to populate that directory now. Just make sure that the root to the public directory is /var/www/myapp/current/public. Don't forget to chown it for www-data:

sudo chown -R www-data:www-data /var/www/myapp/current/



Step 9: Now it's time to install Phusion Passenger and let it do it's magic.

sudo gem install passenger
sudo passenger-install-nginx-module

At this point you'll be greeted with two options. The first will allow Passenger to do all the work while the second, for advanced users, allows you to point Phusion to your pre-installed Nginx. We're going to make life easy on ourselves and choose option 1. I'd also recommend keeping the default path (/opt/nginx).

The Nginx configuration file (nginx.conf) file is in /opt/nginx/conf/ They've done you the favor of adding the lines you need to get going. Defining the configuration file is beyond the scope of this tutorial, but I've included a sample file which you can download. This file assumes your application is in /var/www/myapp/current.

Sample nginx.conf file for Ruby on Rails, Nginx, Phusion Passenger.


Step 10: Time to make some Nginx tweaks for Ubuntu/Debian. If you're used to running nginx as installed by Debian or Ubuntu then you might notice that you've lost the familiar way to start and stop nginx. Gone is /etc/init.d/nginx stop and /etc/init.d/nginx/start. To get it back, copy (or download) this into a file called nginx in /etc/init.d/ (as root)
#! /bin/sh

### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO

PATH=/opt/nginx/sbin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/nginx/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi

set -e

case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /opt/nginx/logs/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /opt/nginx/logs/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/opt/nginx/logs/$NAME.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
/opt/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /opt/nginx/logs/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
exit 1
;;
esac

exit 0


Next, let's set the permissions and make nginx load on a reboot:

sudo chmod +x /etc/init.d/nginx
sudo /usr/sbin/update-rc.d -f nginx defaults


Now you should be able to start and stop nginx using the command you're used to:

sudo /etc/init.d/nginx start



Bonus steps In case it's not already installed, let's grab the perquisites and then install the mysql gem. This will improve performance on your webserver:
sudo apt-get install libmysqlclient-dev
sudo gem install mysql --no-rdoc --no-ri


You should also look into using a helper for deployment. I still use Capistrano but there are alternatives such as Vlad the Deployer, Puppet and others. I will also recommend that if you go with Capistrano that you check out the capistrano-ext gem which allows you to do multi-stage deployments.


Troubleshooting If things didn't go smoothly, here are some things to check:

1. There's an error log for nginx in /opt/nginx/logs/ Try looking to see if you get any hints there.

2. If you see a 403 forbidden error, make sure you have permissions set correctly. I'm running Nginx as www-data and I've set the group/user owners of my rails app to match using the chown -R www-data:www-data command. It doesn't hurt to confirm it.

3. Try running your rails app in development mode using the standard script/server. If it doesn't work there then it obviously won't work in production mode either

For help, you should check out the great railsforum or Mailing list front-end.

42 comments:

  1. Thanks. Just installed Ubuntu and found this very useful.

    ReplyDelete
  2. Don't forget to set your gem sources to gemcutter:

    sudo gem install gemcutter
    sudo gem tumble

    ReplyDelete
  3. I really like the deployment recipe of Brightbox. It uses a combination of svn and cap, pretty oldschool but works better than any other deployement recipes around, although brightbox hosting is a bit costlier than the other ones.
    It does have one advantage over other VPS and such services though, saves you an effort to configure your prod environment, although i agree it wont take much time, but getting something out of the box is quite helpful

    ReplyDelete
  4. Thanks a million. Especially the nginx/passenger installation really helped a lot.

    /Erik

    ReplyDelete
  5. Hi. Great steps.
    Does anyone know how do I configure nginx so it compiles erb files when it hits them? Sorry for lame question

    ReplyDelete
  6. I tried step-by-step ad util assigning the links everything was OK. But when I tried to install rails, I got an error:
    serge@ubuntu:~ /rubygems-1.3.5$ gem -v
    1.3.5
    serge@ubuntu:~ /rubygems-1.3.5$ sudo gem install rails
    ERROR: Error installing rails:
    invalid gem format for usr/lib/ruby/gems/1.8/cache/rake-0.8.7.gem

    Can anybody explaine me how to resolve this problem. Thank you

    ReplyDelete
  7. try with: gem install rails
    without sudo

    ReplyDelete
  8. have an error when install nginx-module: Rake... not found
    I have this installed (gem install rake)

    ReplyDelete
  9. Oh, fixed. Install rake from Synaptic

    ReplyDelete
  10. Great Article for a newbie in ubuntu on How to install ROR

    ReplyDelete
  11. If I try to istall a gem without sudo, it will be installed in my home directory

    ReplyDelete
  12. Thanks! Worked perfectly!

    ReplyDelete
  13. Excellent Article, Thank you very much !!

    ReplyDelete
  14. I'm getting this error, any suggestions on how to solve it

    The following packages have unmet dependencies:
    ri1.8: Depends: rdoc1.8 (= 1.8.7.174-1ubuntu1) but 1.8.7.174-1 is to be installed
    E: Broken packages

    ReplyDelete
  15. this has to be by far the best most complete tutorial ive ever followed... direct, to the point, and doesnt miss a step. A+

    ReplyDelete
  16. I cannot get the command sudo passenger-install-nginx-module to work. Returns command not found

    ReplyDelete
  17. Thank you for the detailed instructions..

    ReplyDelete
  18. Thanks! Almost perfect. You may want to add the "libdbd-sqlite3-ruby" and "libsqlite3-ruby" packages as well. Otherwise you may get some funky errors from Rails.

    ReplyDelete
  19. keep up the good work!! your tutorial is a life saver!

    ReplyDelete
  20. Awesome guide. Steps 1-6 got my local dev environment working without a hitch. Thank you so much! BIG fan of this tutorial

    ReplyDelete
  21. Thank you so much! This was so easy!

    I am really enjoying Ubuntu at the minute.

    ReplyDelete
  22. Thanks for the tutorial, I also went up to step 6 and that worked great.

    ReplyDelete
  23. Almost too easy, 5 minutes from start to finish...

    ReplyDelete
  24. Using Nginx for both static files and dynamic rails generated content (with phusion Nginx module) sounds like non-sense to me http://www.b-list.org/weblog/2008/jun/23/media/

    ReplyDelete
  25. Thanks. This was just what I needed.

    ReplyDelete
  26. Thanks for Sharing this

    Cheers,

    Pankaj Sisodiya

    ReplyDelete
  27. very easy setup. thank you

    ReplyDelete
  28. Great tutorial, thanks very much.

    ReplyDelete
  29. Running Ubuntu 9.10 32-bit under Windows 7 with VirtualBox. Fails when trying to do the 'gem install rails' and in fact gem cannot install anything at all. Just doesn't do anything.

    After MANY hours of hair-pulling and head-scratching that it was a matter of switching the VM from NAT to Bridged networking. No clue as to why this is or why it trips up just this part of the process.

    Once that was sorted out everything else went very smoothly.

    Great tutorial!

    ReplyDelete
  30. excellent guide, thank you!

    ReplyDelete
  31. Hi,

    Thanks for the tutorial but I have a problem trying to install rails I get this:
    $ sudo gem install rails
    sudo: gem: command not found
    Any Idea of why?

    ReplyDelete
  32. Just use the following to get more actual versions of ruby, irb, ri and rdoc.

    sudo apt-get install ruby1.9.1 ri rdoc1.9.1 mysql-server libmysql-ruby ruby1.9.1-dev irb1.9.1 libdbd-mysql-perl libdbi-perl libmysql-ruby1.9.1 libmysqlclient15off libnet-daemon-perl libplrpc-perl libreadline-ruby1.9.1 libruby1.9.1 mysql-client-5.1 mysql-common mysql-server-5.1 rdoc1.9.1 ri1.9.1 ruby1.9.1 irb libopenssl-ruby libopenssl-ruby1.9.1 libhtml-template-perl mysql-server-core-5.1 libmysqlclient16 libreadline5 psmisc

    ReplyDelete
  33. This page has saved me soooo much time, I always just go straight here whenever I'm setting up a new dev environment (way more often than one would expect) in karmic (and for jaunty before that) and never have issues, thanks so much!!!!

    ReplyDelete
  34. Thanks for the post. I just installed ubuntu 10.04 and this is useful!

    On step3, I get this error. Would really appreciate it if you can tell me how to get past it -

    E: Couldn't find package libmysqlclient15off

    ReplyDelete
  35. Thank you this has helped me a lot. Just so you know saw at Step 3 I get this message:

    The following packages were automatically installed and are no longer required:
    binutils-static policykit
    Use 'apt-get autoremove' to remove them.

    ReplyDelete
  36. @aswath, just remove that package from the apt-get line and it should be fine. This is practically the only difference between installing on Karmic and Lucid

    ReplyDelete
  37. thanx .........i was blocked by this setup issue.
    Thanx a lot man.

    ReplyDelete
  38. Thank you for the detailed instructions. Got up and running on Ubuntu 9.10 with an earlier version of Rails in minutes. You're making life better for lots of people.

    ReplyDelete
  39. Any chance you can do a tutorial on Ubuntu 10.10 with the latest versions of Ruby, Rails, MySQL, etc?

    ReplyDelete
  40. THANK YOU VERY MUCH! This was great help!

    ReplyDelete