nginx不作为页面的一部分提供静态

时间:2010-02-05 10:34:35

标签: ruby-on-rails proxy nginx

我在nginx后面有一个Mongrel集群,我正在尝试使用以下规则(RESTful URL)让nginx提供我网站的静态内容:

    location / {
        if (-f $request_filename) { 
            break; 
        }

        if (!-f $request_filename) {
            proxy_pass http://mycluster$request_uri;
            break;
        }
    }

当我加载一个包含图像的页面(从/ public / images引用)时,对图像的请求就会永远挂起(对于JS,CSS等也是如此)。但是,如果我直接进入图像URL(右键单击“查看图像”),所有文件都按预期提供 - 如果我关闭Mongrel群集,它们将继续提供。因此nginx可以清楚地查看和访问所有静态文件。此外,当在加载页面时查看firebug时,我可以看到对某些文件(并不总是相同的文件)进行了双重请求!有时其中一个文件正确提供,而另一个请求将无限期挂起。

如果我更改规则以将所有内容重定向到我的群集,则静态都可以正常运行 - 与我直接转到其中一个Mongrels的结果完全相同:

    location / {
        proxy_pass http://mycluster$request_uri;
    }

这当然不是一个选项,因为我非常希望nginix能够提供这个内容。另一件奇怪的事情似乎是文件确实被发送了;例如,当悬停在永不完成的请求上时,我可以看到firebug中的图像。我对nginix相当陌生,所以很可能我错过了一些明显的东西 - 我已尽力找到自己的答案,但我真的可以帮忙!

非常感谢,

JS

P.S。是不是nginx和Mongrel在谁应该为文件提供服务方面存在冲突?

2 个答案:

答案 0 :(得分:1)

更新:nginx邮件列表上的某人建议我更改代理规则:

location / {
    if (-f $request_filename) {
    break;
}

if (!-f $request_filename) {
    proxy_pass http://mycluster$request_uri;
    break;
}

为:

location / {
    try_files $uri @fallback;
}

location @fallback {
    proxy_pass http://mycluster$request_uri;
}

似乎“try_files”指令是检查静态文件是否存在的推荐方法。可悲的是,这种变化无法解决我的问题。

JS

答案 1 :(得分:0)

如果您的所有静态文件(图像,css,JS)都在一个文件夹中,那么您可以尝试:

location ^~ /static/ {
    root /path/to/the/folder/which/has/static/subfolder;
    expires 30d;
}