我在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在谁应该为文件提供服务方面存在冲突?
答案 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;
}