I'm somewhat confused about using Nginx and Thin for serving my Rails 3.2 app. Previously I had Thin serving my Rails app on Windows Server 2008 R2 without any issues. I would start Thin on the production server specifying the server's IP address on port 80 like such:
rails server thin -b 10.xx.x.xxx -p 80 -e production
Now, I'm trying to add Nginx to the mix and I'm confused about how I should start Thin and how I should configure Nginx to forward to Thin.
For example, now that Nginx is listening on port 80, should I start Thin locally on a different port? Like 0.0.0.0:3000 (or 127.0.0.1:3000)? Or do I start Thin like I did before on 10.xx.x.xxx:80?
In my Nginx conf file do I specify the upstream servers as localhosts, or the machine's IP address? I'm not really sure what it's for.
upstream mywebapp_thin {
server 0.0.0.0:3000;
}
server {
listen 80;
server_name mywebserver www.mywebserver;
# locations et. al. excluded for brevity...
Most examples I see have the upstream servers running on ports 3000 or 5000. I'm wondering if those examples are really for a development setup, and not production? Or does Thin need to run on a different port other than 80 since Nginx is listening on it now?
I noticed that my web app does not respond to the basic urls (mywebserver/projects) unless I add the port Thin is running on (mywebserver:3000/projects)
You are correct that you must start thin up on a new port due to the fact that nginx is already running on that port. It is generally best to start a server that is not the one that users should directly access on the loopback interface so that users can't access it, therefore the command to start up thin should be something like:
rails server thin -b 127.0.0.1 -p 3000 -e production
After doing that, you should change your upstream
block to be:
upstream mywebapp_thin {
server 127.0.0.1:3000;
}
That said, if you do not have multiple upstreams, you gain nothing by using the upstream module. You should just proxy_pass
directly to your upstream. As it is, 0.0.0.0
is not a valid IP address, so that is likely why you are unable to access anything.
I also notice that you do not have www.mywebserver.com
or webserver.com
in the server_name
directive, not sure if you left that out on purpose.
What does the error log say when you make a request? If these changes don't fix your problems, you'll probably need to post the error log as well as your full config.
On a side note, if you are deploying on Windows, you might consider using JRuby and using trinidad as a server instead of thin, or using warbler to package your app so that it can be deployed on your Java application server of choice. This doesn't change anything with your nginx configuration, though.