我应该在我的Nginx配置中有这些指令吗?

时间:2013-02-21 22:46:35

标签: ruby-on-rails nginx

我正在使用Rails直接使用Nginx(没有apache),并想知道我的虚拟主机中是否还需要以下内容:

        # serve static content directly
        location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
          if (-f $request_filename) {
            expires max;
            break;
          }
        }

如果我不使用Apache,它甚至是否相关?

提前致谢。

3 个答案:

答案 0 :(得分:2)

由于您使用的是Rails,可能您需要的唯一配置就是:

server {
    listen 80;
    server_name example.com;

    location / {
        root path/to/static/files;
        try_files $uri @rails;
        expires max;
    }

    location @rails {
        # proxy_pass to gunicorn or whatever...
    }
}

但最好将所有媒体文件保存在一个单独的目录中:

server {
    listen 80;
    server_name example.org;

    location / {
        # proxy_pass to gunicorn or whatever...
    }

    location /media/ {
        root path/to/static/files;
        try_files $uri @rails;
        expires max;
    }
}

留下丑陋而复杂的规则,如:

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$`

到PHP-folks。他们的项目中通常包含大量代码和媒体,并且喜欢在Web服务器配置中编程,而不是在应用程序中执行所有应用程序逻辑。

答案 1 :(得分:1)

该指令告诉 nginx expires标头设置为最大可能值,并在请求的文件以其中一个扩展名结束并且存在时停止处理其他指令。这些文件将由nginx提供。无论您是否使用apache,这都是有效的指令。你没有 来使用它,但你最好这样做,因为nginx非常擅长提供静态文件。

更新

正如其他人所指出的那样,你应该避免使用if。您可以通过以下方式执行此操作:

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
    try_files $uri =404;
    expires max;
}

如果您想进行特殊处理,请使用命名位置

location ~* \.(ico|jpg|gif|png|css|js|swf|html)$ {
    try_files $uri @process_404;
    expires max;
}

location @process_404{
    # do your stuff
}

答案 2 :(得分:1)

if没有意义,只是浪费你的cpu。

来自文档:

  

启用或禁用添加或修改“Expires”和“Cache-Control”响应头字段,前提是响应代码等于200,201,204,206,301,302,303,304或307。

@ http://nginx.org/r/expires

你在这看到404了吗?我没有。

  

停止处理当前的ngx_http_rewrite_module指令集。

@ http://nginx.org/r/break

我发现你的位置没有其他重写指令。