Having installed the [thin web server for Ruby][], we can now look at configuring a Nginx vhost to proxy to thin so we can serve our Ruby on Rails application.
[thin web server for Ruby]: /knowledge_center/index.php/Ubuntu_Hardy_-_Thin_web_server_for_Ruby "Ubuntu Hardy - thin web server for Ruby"
The process is easy to follow and easy to repeat for hosting multiple domains.
###Setup###
Firstly you will have needed to follow the previous Nginx articles and installed [via aptitude][] or [via source][].
[via aptitude]: /knowledge_center/index.php/Ubuntu_Hardy_-_Installing_Nginx_via_aptitude "Ubuntu Hardy - installing Nginx via aptitude"
[via source]: /knowledge_center/index.php/Ubuntu_Hardy_-_Installing_Nginx_From_Source "Ubuntu Hardy - installing Nginx via source"
You will also need to have installed the thin web server as per the article linked to above.
###Plan
The plan is very simple:
We'll create a basic rails application and use 3 thin instances running from port 3000 to 3002.
I won't go into detail as the [thin web server for Ruby][] article shows how to install and configure thin.
Once that is done, we'll create a simple vhost to proxy requests to the thin instances.
You may also notice this article is very similar to the [Nginx and mongrels article][]. There is a very good reason for that - they use exactly the same methods in creating the virtual host.
All the virtual host has to do is proxy requests to the 3rd party web server - in this case thin, in the sister article, mongrels.
[Nginx and mongrels article]: /knowledge_center/index.php/Ubuntu_Hardy_-_Nginx%2C_Rails_and_mongrels "Ubuntu Hardy - Nginx, Rails and Mongrels"
###Rails Application###
To create a rail application, move into your public_html folder:
cd /home/demo/public_html
and create a new Ruby on Rails application:
rails railsapp
Done.
###Thin
Ensure you are in the rails folder:
cd ~/public_html/railsapp
Then create a thin configuration file:
sudo thin config -C /etc/thin/railsapp.yml -c /home/demo/public_html/railsapp/ --servers 3 -e production
It's always a good idea to check the created file:
cat /etc/thin/railsapp.yml
The contents are as such:
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
Unlike with mongrels, we don't need to manually create symlinks, etc to make sure thin is started on a reboot.
Now all we need to do is start thin:
sudo /etc/init.d/thin start
Done.
###Nginx Virtual Host
Let's create the Nginx vhost:
sudo nano /etc/nginx/sites-available/domain.com
__Note__: If you installed Nginx from source, the path may vary to something like:
sudo nano /usr/local/nginx/sites-available/domain.com
The contents of the file are as such:
upstream domain1 {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name www.domain.com;
rewrite ^/(.*) http://domain.com permanent;
}
server {
listen 80;
server_name domain.com;
access_log /home/demo/public_html/railsapp/log/access.log;
error_log /home/demo/public_html/railsapp/log/error.log;
root /home/demo/public_html/railsapp/public/;
index index.html;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect false;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://domain1;
break;
}
}
}
Take each section at a time and you will see that the basics are the same as for a 'normal' Nginx vhost.
We have the server_name, listen, log and index variables.
Where it differs is the addition of the Rails proxy settings.
In this example, we will use 3 thin instances running on ports 3000, 3001 and 3002 which I have defined in the 'upstream' setting. I've called it domain1 for ease of use.
The location settings say that if the requested file exists to serve the static version straight away.
And if the requested file doesn't exist, pass the request to the thin server.
###Enable
Remember that we need to 'enable' any available vhosts or it won't be served (an easy thing to leave out).
Referring to the Nginx articles, all we need to do is create a simple symlink:
sudo ln -s /etc/nginx/sites-available/domain.com /etc/nginx/sites-enabled/domain.com
Or, if you installed from source:
sudo ln -s /usr/local/nginx/sites-available/domain.com /usr/local/nginx/sites-enabled/domain.com
Done.
###Restart
Final step is to restart Nginx:
sudo /etc/init.d/nginx stop ... sudo /etc/init.d/nginx start
Use the 'stop' and 'start' method as issuing a restart command does not always work with Nginx.
###Navigate
All that's left is to navigate to your domain:
http://www.domain.com
Where you will be greeted with the rails welcome page.
###Summary
Setting up Nginx virtual hosts to proxy to the thin server easily completed.
To serve multiple domains, simply repeat the process with the new domain details.
© 2011-2013 Rackspace US, Inc.
Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License

4 Comments
Wrong Title for Article
Re: Nginx
Nginx
Re: Revision
On managed service level for nginx, I'd suggest adding your vote to a suggestion for it on our feedback forum:
[http://feedback.rackspacecloud.com/forums/71021-product-feedback/suggestions/1311997-support-nginx](http://feedback.rackspacecloud.com/forums/71021-product-feedback/suggestions/1311997-support-nginx)
Add new comment