Ubuntu Hardy - thin web server for Ruby
There are variety of options open to the sysadmin when serving Ruby applications.
One of them is thin. This is a 3rd party web server that is proxied to from the main web server (similar to mongrels in a general setup). Let's take a look at installing thin.
Prerequisites
I am assuming you have Ruby and Rubygems installed on your Slice. If you don't, please see the Ubuntu Hardy Ruby on Rails article).
Installation
Thin is a rubygem and so installation couldn't be easier:
sudo gem install thin
On the test Slice with a basic rubygems and Rails installation, the process installed the following gems:
rack-0.3.0
daemons-1.0.10
eventmachine-0.10.0
thin-0.8.1
Thin basics
There will be separate articles for proxying to thin from different web servers (Apache, Nginx, etc).
As such, we'll only look at the basics of thin, leaving Virtual Host configurations for later.
To determine the thin verions:
thin -v
As is often the case in the wacky world of the developer, each version has a unique name:
thin 0.8.1 codename Rebel Porpoise
Starting and stopping
Starting thin requires you to navigate to the rails directory and issuing this command:
thin start -d
The '-d' option runs it in the background. If you omitted the '-d' option, it would act in a similar manner to the webbrick server and requires an 'open' terminal. In that case, a standard 'Ctl -C' would kill the process.
To stop thin, you don't need to worry about finding the PID or searching for something to kill:
thin stop
Environment
The default environment for thin is development. To start it in a production environment is easy:
thin start -d -e production
Cluster
It would be relatively unusual for a Rails application to only need 1 ruby server, so to start a cluster of 3 would require this:
thin start --servers 3
The output shows 3 servers being started sequentially from port 3000 (the default port).
Stopping the cluster is just as easy:
thin stop --servers 3
Again, the output is very clear: a quit signal is sent to each PID.
Runlevels
You can add thin to a runlevel (/etc/init.d/) with ease.
To start with you need to create the script:
sudo thin install
Then add the script to the default runlevels:
sudo /usr/sbin/update-rc.d -f thin defaults
The output confirms the process:
Adding system startup for /etc/init.d/thin ...
/etc/rc0.d/K20thin -> ../init.d/thin
/etc/rc1.d/K20thin -> ../init.d/thin
/etc/rc6.d/K20thin -> ../init.d/thin
/etc/rc2.d/S20thin -> ../init.d/thin
/etc/rc3.d/S20thin -> ../init.d/thin
/etc/rc4.d/S20thin -> ../init.d/thin
/etc/rc5.d/S20thin -> ../init.d/thin
Excellent.
Now we need to define which (if any) of the rails applications to start on a reboot.
Just for example, assume I have a rails application located here:
/home/demo/public_html/testapp/
I want to start 3 thin servers and be in production mode when they are started:
sudo thin config -C /etc/thin/testapp.yml -c /home/demo/public_html/testapp/ --servers 3 -e production
Have a look at the file that was created:
cat /etc/thin/testapp.yml
The contents:
pid: tmp/pids/thin.pid
log: log/thin.log
timeout: 30
max_conns: 1024
port: 3000
max_persistent_conns: 512
chdir: /home/demo/public_html/testapp
environment: production
servers: 3
address: 0.0.0.0
daemonize: true
As you can see, there are several options that can be tweaked by hand if needed.
Note the server numbers and environment are exactly as we set them. You can, of course, add as many or as few options to the command as you require, such as port numbers and so on.
When the Slice is rebooted, the 3 thin servers will now start automatically.
More
As with most applications, there is more than I can go into here but please do check out all the options that are available to you:
thin --help
Summary
Thin is an established method of serving Ruby on Rails applications. I hope this introduction outlines how easy and sysadmin friendly thin actually is.
To see how to proxy to the thin web server from Apache or Nginx, please see the next few articles.
PickledOnion


Article Comments:
Craig commented Fri May 30 17:26:05 UTC 2008 ago:
There is a typo in the first step.
"sudo gem instal thin"
Should be...
"sudo gem install thin"
PickledOnion commented Fri May 30 17:28:40 UTC 2008 ago:
Hi Craig,
Luckily, it can be either instal or install - it makes no difference to the installation of the thin gem.
Thanks for the note though, I will update it :)
PickledOnion
MJS commented Mon Jun 16 12:57:01 UTC 2008 ago:
I think this tutorial should probably have the same warning as the updated rails tutorial. For small Slices use:
It's been slowly trying to install the ri files for the last hour on my 256mb Slice.
Jesse commented Thu Jul 03 21:36:10 UTC 2008 ago:
I followed the Ruby/Rails article and then tried installing thin but got an error: "checking form main() in -lpthread... no" on a brand new Hardy slice.