1
votes

I'm trying to deploy a rails4 (ruby-2.0.0) app to my server. Almost all of my assets are precompiled, and served by nginx.

One js.erb, generates a dynamic html-list, by getting models from my database. This asset can't be precompiled, because it must remain dynamic.

I'm excluding this asset from asset.precompile, and turned on

config.assets.compile = true

to fall back to the asset pipeline, for this one asset.

In my local production env, everthing is working, but on my server (nginx, unicorn) the asset pipeline fall back won't work. I get a simple 404 Error

nginx error log:

 2013/09/13 08:54:54 [error] 27442#0: *58 open() "/XXX/current/public/assets/rails_admin/rails_admin_switchable-051203ae1d7aca2c08092e5c92bcdf15.js" failed (2: No such file or directory), client: XXX, server: , request: "GET /assets/rails_admin/rails_admin_switchable-051203ae1d7aca2c08092e5c92bcdf15.js HTTP/1.1", host: "XXX", referrer: "http://XXX/admin"

unicorn and rails don't show any errors.

Any ideas, how I can solve this?

best, Franz

1
Could you post any error messages you're getting?Jesper
I added the error loguser2772200
Are you sure the request is even reaching Rails? Looks to me like nginx is trying to serve a static asset and doesn't find it.Jesper

1 Answers

2
votes

It looks like your nginx server definition isn't properly integrated with your app server. It should be configured to pass a request that doesn't match a physical file on to the app server.

Here is a standard configuration for a rails app living in /app with nginx via a unicorn/UNIX-socket integration:

  upstream app_server {
    server unix:/tmp/nginx.socket fail_timeout=0;
   }

  server {
    listen <%= ENV["PORT"] %>;
    server_name _;
    keepalive_timeout 5;

    # path for static files
    root /app/public;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }

    # Rails error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /app/public;
    }
  }

If your asset pipeline compiles to /app/public/assets you should be good to go.