【问题标题】:nginx not serving statics as part of pagenginx 不提供静态数据作为页面的一部分
【发布时间】:2010-09-14 07:34:36
【问题描述】:

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

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

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

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

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

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

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

非常感谢,

JS

附:会不会是 nginx 和 Mongrel 在谁应该提供文件的问题上发生冲突?

【问题讨论】:

    标签: ruby-on-rails proxy nginx


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        • 2019-07-01
        • 2016-01-28
        • 1970-01-01
        • 2023-03-13
        • 2013-03-13
        • 2010-12-01
        相关资源
        最近更新 更多