I had been hearing about Gentoo for a long time, and finally discovered it in depth about 6 months ago. Gentoo is really a different beast as Linuxes go. You get to build everything from sources. No binaries. That’s right. That means that you get to build everything with compatible flags, get to remove a lot of the unnecessary bloat (Do I hear X windows for example?). It also means that the initial setup could take you several days if your machine is not so powerful. Suffice it to say, I really, really like the approach and that is now what I’m using to run this blog.
Of course, if I need a server setup in a hurry, I’ll still go for a Debian or Ubuntu. But if I want a very fined tune system, Gentoo is it.
Of course, there is an ebuild for rails (ebuild is gentoo-speak for describing a package your can grab and build), but it did bring a lot more that what I cared for, so here’s the step by step instructions for getting Rails+Mongrel+nginx going on Gentoo.
This assumes that you are starting from a Gentoo 2006.1 stage 3 without much else.
A word of warning
Even though I’ve used these notes to successfully setup 3 machines (both on x86 and amd64), your experience may still be different, or you may need slightly different options or settings as the packages are bound to evolve, or I’ve made some assumptions that do not apply in your case, or something was obvious to me that should not have been, or, perish the thought, I just plain forgot something. If that happens, remember, Google is your friend, or don’t be shy, ask a question here, someone might know the answer.
So with that out the way, let’s get started.
Preamble
auto start ssh:
rc-update add sshd default
update portage tree
emerge --sync
emerge portage
emerge -av --update --deep world
At this point, you are going to have a lot of configuration files that out of date. Since we are doing a new setup, we just want to silence the warnings and making sure we use the latest version. So to find each file:
find /etc -iname '._cfg????_*'
But do not overwrite inittab if it is only putting back more terminal login than you need.
Now it is time to add a few very useful tools like sudo, stuff to help you figure out what’s installed, and to find things (namely sudo, gentoolkit and sys-apps/slocate)
emerge -av app-admin/sudo app-portage/gentoolkit sys-apps/slocate
Now it is time to create your user. And set its password.
useradd user
passwd user
Add user to /etc/sudoers with ALL
Add vim (or whatever else you fancy)
emerge -av vim
Change default EDITOR
vi /etc/rc.conf
There, comment out /bin/nano, and uncomment /bin/vim
Install subversion
emerge -av subversion
Even though not strictly necessary for Rails, a few network utilities always come in handy (traceroute, dig, nslookup):
emerge -av traceroute bind-tools
If you want to send/receive emails:
emerge -av mail-client/mailx
emerge --unmerge mail-mta/ssmtp
emerge -av syslog-ng mail-mta/exim
rc-update add exim default
There are lots of options to do SMTP, but I find exim4 the quickest and simplest to setup:
create /etc/exim/exim.conf from /etc/exim/exim.conf.dist
To lockdown mail to localhost (you just want your Rails app to send emails), add this exim.conf:
local_interfaces = 127.0.0.1
And to allow non users to send mails (comment out this line)
##require verify = sender
And finally, start your mail server:
/etc/init.d/exim start
Rails Setup
My preferred database remains MySQL. I know, some people prefer PostgrSQL.
emerge -av dev-db/mysql
rc-update add mysql default
Then, to configure MySQL and create a first database, first you need to figure out which version you just installed. If you were not paying attention as the logs were flying by (I know I wasn’t), use
equery list mysql
And then
emerge --config =dev-db/mysql-5.0.26-r2
To get rubygems 0.9.x, you need to unmask it. For that, add a new line to /etc/portage/package.keywords with:
dev-ruby/rubygems ~amd64
Replace with ~x86
if you are not on an AMD chip, then run:
emerge -av dev-lang/ruby dev-ruby/mysql-ruby dev-ruby/rubygems dev-ruby/ruby-termios
For any kind of image manipulation (resizing and such), install Image Magick. First, it it does not already exist create /etc/portage/package.use
dev-ruby/rmagick lcms gif imagemagick jbig jpeg jpeg2k pdf png svg tiff truetype unicode wmf xml xpm pcre
media-gfx/imagemagick lcms gif imagemagick jbig jpeg jpeg2k pdf png svg tiff truetype unicode wmf xml xpm pcre
emerge -av media-gfx/imagemagick dev-ruby/rmagick
The above line represents the options for that ebuild.
Time to get the latest nginx
- add a new line to /etc/portage/package.keywords with (Again, on Intel, use
~x86
)
"www-servers/nginx ~amd64
Then run emerge again:
emerge -av www-servers/nginx
Ok, now time to install what we actually wanted to install, Ruby on Rails and a few useful gems:
gem install -y rails rake capistrano daemons gem_plugin mongrel mongrel_cluster rmagick BlueCloth RedCloth ruby-debug termios ruby-openid ruby-yadis
Start mysql, create a database for rails test app
/etc/init.d/mysql start
mysqladmin -u root -p create test1_development
mysqladmin -u root -p create test1_production
And finally, install a rails app (we’ll use beast as it is pretty simple to install)
svn checkout http://svn.techno-weenie.net/projects/beast/trunk beast
cd beast/
rake rails:freeze:edge
#create config/database.yml from config/database.example.yml
rake db:schema:load RAILS_ENV=production
./script/server -e production
Test that everything’s fine fine by pointing your browser to port 3000.
Now, let’s configure mongrel (We are almost there, I promise).
cd [app]
sudo useradd -n mongrel
sudo chown -R mongrel:mongrel [app]
mongrel_rails cluster::configure -e production -p 8000 -N 3 -c [app] -a 127.0.0.1 --user mongrel --group mongrel
Later, a few useful commands to use
#start cluster
mongrel_rails cluster::start
#restart cluster
mongrel_rails cluster::restart
#stop cluster
mongrel_rails cluster::stop
To setup nginx, edit /etc/nginx/nginx.conf to match your setup
To setup mongrel_cluster for autostart
mkdir /etc/mongrel_cluster
ln -s [app]/config/mongrel_cluster.yml /etc/mongrel_cluster/[app].yml
#copy from wherever the gem is installed (use locate to figure out the location)
ln -s /usr/lib64/ruby/gems/1.8/gems/mongrel_cluster-0.2.1/resources/mongrel_cluster /etc/init.d/mongrel_cluster
chmod +x /etc/init.d/mongrel_cluster
Add nginx and mongrel_cluster to startup
rc-update add nginx default
rc-update add mongrel_cluster default
For smooth reboot, you may need to delete the pid files
Apply this patch (from http://textsnippets.com)
create file “mongrel_cluster.patch” with:
--- bin/mongrel_rails-orig 2007-05-16 14:41:51.000000000 -0400
+++ bin/mongrel_rails 2007-05-16 14:42:50.000000000 -0400
@@ -83,9 +83,17 @@
config = Mongrel::Rails::RailsConfigurator.new(settings) do
if defaults[:daemon]
if File.exist? defaults[:pid_file]
- log "!!! PID file #{defaults[:pid_file]} already exists. Mongrel could be running already. Check your #{defaults[:log_file]} for errors."
- log "!!! Exiting with error. You must stop mongrel and clear the .pid before I'll attempt a start."
- exit 1
+ # mongrels that crash can leave stale PID files behind, and these
+ # should not stop mongrel from being restarted by monitors…
+ pid = File.new(defaults[:pid_file]).readline
+ unless `ps -ef | grep #{pid} | grep -v grep`.length > 0
+ # use "ps ax" for freebsd
+ log "!!! PID file #{defaults[:pid_file]} exists, but is stale, and will be deleted so that this mongrel can run."
+ File.delete(defaults[:pid_file])
+ else
+ log "!!! PID file #{defaults[:pid_file]} already exists and the process id referred to in it is running. This mongrel is probably already running. #{defaults[:log_file]} for errors. EXITING."
+ exit 1
+ end
end
daemonize
then apply the patch
patch -p0 /usr/lib64/ruby/gems/1.8/gems/mongrel-1.0.1/bin/mongrel_rails < mongrel_cluster.patch
And there you have it. A nice, humming Ruby on Rails+Mongrel+nginx on Gentoo.