Sören Titze
Sören Titze

Reputation: 1005

nginx does not forward to my rails app

I am rather new to using nginx. I want to use it to serve static content in order to reduce the load on the rails server. It seems to be a rather simple task but I just can't find a solution that works for me.

I want nginx to serve static files which exist in the public directory inside my rails application directory. To be more precise: I got an index.html inside the directory I want to get served when entering http:/[domainname]. Instead I just get the default nginx index.html. I already checked that thin is running and when I query 127.0.0.1:3000 I get the page I want.

So here's the file called [domainname] in the sites-available directory.

upstream rails {
  server 127.0.0.1:3000; #This is where thin is waiting for connections
}

# HTTP server
server {
    listen      80;
    server_name [domainname];

    set  $app /home/projektor/website/app.[domainname];
    root $app/public;

    # Set a limit to POST data
    client_max_body_size 8M;

    # Errors generated by Rails
    error_page 400     /400.html;
    error_page 422     /422.html;
    error_page 500 504 /500.html;

    # Errors generated *outside* Rails
    error_page 502     @502;
    error_page 503     @503;

    # If the public/system/maintenance.html file exists,
    # return a 503 error, that ...
    if (-f $document_root/system/maintenance.html) {
      return 503;
    }

    # ... will serve the very same file. This construct
    # is needed in order to stop the request before
    # handing it to Rails.
    location @503 {
      rewrite ^ /system/maintenance.html break;
    }

    # When a 502 error occurs - that is, Rails is not
    # running, serve the 502.html file
    location @502 {
      rewrite ^ /502.html break;
    }


    # Add client-side caching headers to static files
    #
    location ~ ^/(stylesheets|javascripts|images|system/avatars) {
        expires 720h;
    }

    # Hand over the request to Rails, setting headers
    # that will be interpreted by request.remote_ip,
    # request.ssl? and request.host
    #
    location / {
        proxy_set_header    X-Real-IP         $remote_addr;
        proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto http;
        proxy_set_header    Host              $http_host;
        proxy_redirect      off;

        # If the file exists as a static file serve it directly            
        if (-f $request_filename) {
            break;
        }

        # Oh yeah, hand over the request to Rails! Yay! :-D
        proxy_pass http://rails;
    }
}

The file is based on this one.

Thanks for your help.

Edit: I already exchanged 127.0.0.1:3000 for 0.0.0.0:3000 in the upstream part. I also checked the the ownership of the files in sites-available and sites-enabled and they should both be ok.

I hardcoded return 503; into the location instruction and it seems that it never matches. It seems that it always matches the precreated default configuration.

Upvotes: 2

Views: 699

Answers (2)

Jeff Ancel
Jeff Ancel

Reputation: 3091

When I set up a recent version of NGINX, the solution to getting it to point properly to my rails app had everything to do with fully, and properly configuring it. There were a few extra steps I didn't find in the documentation. It was acting just as yours is. I don't have a clean install to go off of, but bear with me here.

I set a directory called sites-enabled in the default install location. This is a debian install from apt repository, so the install loccations are /etc/nginx and /var/nginx.

mkdir /etc/nginx/sites-enabled /etc/nginx/sites-available
  1. Place conf file for site in sites-available/

  2. Add this line to the bottom of /etc/nginx/nginx.conf

    include /etc/nginx/sites-enabled/*;

  3. Look for and remove any reference that may include the DEFAULT configuration, which is telling nginx to actually load this file. Which is what gives you the nginx default index.html (/etc/nginx/conf.d/default.conf)

    grep -r "default.conf" /etc/nginx

  4. Symlink (man ln) your file in sites-available to sites-enabled.

    ln -s /etc/nginx/sites-available/myfilename /etc/nginx/sites-enabled/myfilename

  5. Test your configuration.

    /etc/init.d/nginx configtest

  6. Once your configuration is set up properly, restart nginx

    /etc/init.d/nginx restart

I can't remember if I removed this reference or including the line in step 2 was enough. If you update or comment on this answer and give me the results, I can try to dig up the other steps I took.

I don't think the problem here is your actual configuration.

Upvotes: 1

James Mason
James Mason

Reputation: 4306

Take a look at the Mongrel example from the try_files documentation. Something like this should work:

location / {
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @thin;
}
location @thin {
    proxy_set_header    X-Real-IP         $remote_addr;
    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto http;
    proxy_set_header    Host              $http_host;
    proxy_redirect      off;

    # Oh yeah, hand over the request to Rails! Yay! :-D
    proxy_pass http://rails;
}

Upvotes: 1

Related Questions